如何解决此场景下的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拦截器是否持有不必要的上下文引用
- Navigation组件对象(
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
相关产品推荐
相关产品推荐

