You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决此场景下的java.lang.OutOfMemoryError异常?

OOM异常排查与修复方案

问题背景

已经搜索过OOM相关问题,但仍无法修复。不确定该异常由Navigation Args还是View Inflater导致,报错行:
io.github.inflationx.viewpump.internal.-ViewPumpLayoutInflater$PrivateWrapperFactory2ViewCreator.onCreateView (-ViewPumpLayoutInflater.kt:422)

Firebase Crashlytics完整堆栈跟踪:

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 16 byte allocation with 2587088 free bytes and 2526KB until OOM, target footprint 268435456, growth limit 268435456; giving up on allocation because <1% of heap free after GC.
       at kotlin.collections.CollectionsKt___CollectionsKt.asSequence(_Collections.kt:3524)
       at kotlin.collections.MapsKt___MapsKt.asSequence(_Maps.kt:591)
       at androidx.navigation.NavDestination.equals(NavDestination.kt:690)
       at androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator$DynamicIncludeNavGraph.equals(DynamicIncludeGraphNavigator.kt:230)
       at java.util.ArrayList.remove(ArrayList.java:631)
       at androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.replaceWithIncludedNav(DynamicIncludeGraphNavigator.kt:134)
       at androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.onRestoreState(DynamicIncludeGraphNavigator.kt:159)
       at androidx.navigation.NavController.onGraphCreated(NavController.kt:1227)
       at androidx.navigation.NavController.setGraph(NavController.kt:1186)
       at androidx.navigation.NavController.setGraph(NavController.kt:1139)
       at androidx.navigation.fragment.NavHostFragment$navHostController$2.invoke(NavHostFragment.kt:104)
       at androidx.navigation.fragment.NavHostFragment$navHostController$2.invoke(NavHostFragment.kt:78)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at androidx.navigation.fragment.NavHostFragment.getNavHostController$navigation_fragment_release(NavHostFragment.kt:78)
       at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.kt:150)
       at androidx.fragment.app.Fragment.performCreate(Fragment.java:3094)
       at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:504)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:268)
       at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:142)
       at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:136)
       at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:247)
       at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:226)
       at io.github.inflationx.viewpump.internal.-ViewPumpLayoutInflater$PrivateWrapperFactory2ViewCreator.onCreateView(-ViewPumpLayoutInflater.kt:422)
       at com.lokalise.sdk.LokalisePreInterceptor.inflateView(LokaliseInterceptor.kt:233)
       at com.lokalise.sdk.LokalisePreInterceptor.intercept(LokaliseInterceptor.kt:140)
       at io.github.inflationx.viewpump.internal.-InterceptorChain.proceed(-InterceptorChain.kt:30)
       at com.lokalise.sdk.LokalisePostInterceptor.intercept(LokaliseInterceptor.kt:113)
       at io.github.inflationx.viewpump.internal.-InterceptorChain.proceed(-InterceptorChain.kt:30)
       at io.github.inflationx.viewpump.ViewPump.inflate(ViewPump.kt:36)
       at io.github.inflationx.viewpump.internal.-ViewPumpLayoutInflater$PrivateWrapperFactory2.onCreateView(-ViewPumpLayoutInflater.kt:399)
       at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:247)
       at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1091)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1019)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:983)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1145)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1106)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1148)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1106)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1148)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1106)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:692)
       at io.github.inflationx.viewpump.internal.-ViewPumpLayoutInflater.inflate(-ViewPumpLayoutInflater.kt:57)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:544)
       at io.github.inflationx.viewpump.internal.-ViewPumpLayoutInflater.inflate(-ViewPumpLayoutInflater.kt:48)
       at com.kingpowerclick.her.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:56)
       at com.kingpowerclick.her.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:50)
       at com.kingpowerclick.her.ui.MainActivity$special$$inlined$viewBinding$1.invoke(ActivityExtension.kt:79)
       at com.kingpowerclick.her.ui.MainActivity$special$$inlined$viewBinding$1.invoke(ActivityExtension.kt:23)
       at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
       at com.kingpowerclick.her.ui.MainActivity.getBinding(MainActivity.kt:94)
       at com.kingpowerclick.her.ui.MainActivity.onCreate(MainActivity.kt:124)
       at android.app.Activity.performCreate(Activity.java:8591)
       at android.app.Activity.performCreate(Activity.java:8570)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4150)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4325)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8762)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

排查与修复方向

从堆栈看,OOM并非直接由View Inflater或Navigation Args触发,而是内存耗尽后,在Navigation动态特性处理NavGraph的equals比较阶段崩溃。以下是具体处理步骤:

1. 定位内存泄漏

  • 用Android Studio Profiler捕获内存快照,重点检查:
    • Navigation组件对象(NavController、DynamicIncludeNavGraph)是否被长期持有
    • Fragment、ViewBinding实例是否存在泄漏(比如静态引用、未取消的监听器)
    • Lokalise SDK拦截器是否持有不必要的上下文引用

2. 优化Navigation动态特性

  • 检查动态NavGraph定义,避免重复加载或嵌套过深的导航图
  • 升级Navigation组件到最新稳定版,旧版本DynamicIncludeGraphNavigator可能存在内存优化缺陷
  • 减少onRestoreState阶段的对象比较和集合操作,堆栈中ArrayList.remove和NavDestination.equals是崩溃前的关键调用

3. 通用OOM缓解措施

  • 启用Android 10+内存诊断工具,Manifest中设置android:debuggable="true"后,通过Logcat跟踪内存增长
  • 优化布局层级:堆栈显示布局多次rInflate,改用ConstraintLayout减少嵌套深度
  • 轻量化ViewPump和Lokalise拦截逻辑,避免Inflate阶段创建过多临时对象
  • 谨慎启用大堆模式:Manifest的application标签添加android:largeHeap="true",仅作为临时缓解方案

4. 临时修复方案

若无法立即找到泄漏点,可尝试:

  • 在MainActivity.onCreate中延迟初始化NavHostFragment,避免启动时同时执行布局Inflate和导航图加载
  • 禁用Lokalise的ViewPump拦截器,验证是否是SDK导致内存占用过高

内容的提问来源于stack exchange,提问作者Phinox Mastung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:23:09