Chr*_*ton 11 android memory-leaks
摘要
我使用Android应用程序作为其功能之一,涉及用户标记图像并保存它.此过程涉及一些重型画布drawImage()调用(有时在大约12 MB的图像上+未压缩)以及大量的数据编码和解码.图像数据也缓存在Android文件系统中,并通过JavaScriptInterface从Java传递到JavaScript.
然而,使用运行Android 5.0.2的LG G Pad X8.3,我们遇到了很多崩溃.当它崩溃时,日志显示"赢死"并返回主屏幕而不显示任何"不幸,___已停止"消息.我们的"胜利死亡"之前是InputMethod的胜利死亡,之前是com.lge.launcher2.Launcher的"胜利死亡".这是间歇性的,但频繁到足以成为一个大问题.
细节
(1)似乎在沉重的图像保存操作之后发生,但不是紧接着之后
(2)当键盘出现时,它会更频繁地发生.关于提起键盘导致它崩溃的事情是什么?
(3)在应用程序运行时观察Android Studio中的内存使用情况时,没有什么是太平凡了.当它崩溃时,图表中仍有可用的可用内存.
(3)我们尝试在清单中使用largeHeap,但这并没有消除崩溃.
(4)内存使用量在10到20 MB之间.
(5)在Web视图崩溃之前,我可以向JavaScript数组添加大约3200万个数字.这至少是240 MB(每个JS编号8个字节).当它崩溃时,它显示一个空白屏幕,而不是我试图修复的崩溃,它将你带回主屏幕.
(6)在这个版本的Android中有一个很好的公开内存泄漏(或实际上是一对),但LG不提供此模型的升级.
(7)我们已经尝试优化代码以尽可能少地使用内存,但崩溃仍然存在.
(8)崩溃日志始终包含崩溃周围的类似信息.
02-08 12:13:01.642 1850-1850/? I/PhoneApp? onTrimMemory: 5
02-08 12:13:01.642 1850-1850/? I/PhoneApp? trim memory
02-08 12:13:01.652 945-965/? I/ActivityManager? Process com.google.android.partnersetup (pid 23908) has died
02-08 12:13:01.682 945-16584/? I/ActivityManager? Process com.google.android.apps.plus (pid 23756) has died
02-08 12:13:01.692 1850-1850/? I/PhoneApp? onTrimMemory: 10
02-08 12:13:01.692 1850-1850/? I/PhoneApp? trim memory
02-08 12:13:01.712 945-2088/? I/ActivityManager? Process com.lge.p2p (pid 24102) has died
02-08 12:13:01.742 945-2041/? I/ActivityManager? Process com.google.android.gms.wearable (pid 23833) has died
02-08 12:13:01.752 1850-1850/? I/PhoneApp? onTrimMemory: 15
...
02-08 12:11:06.862 22936-22936/com.mycompany.ourapp W/IInputConnectionWrapper? getTextBeforeCursor on inactive InputConnection
...
02-08 12:11:06.912 20890-20890/? D/Cliptray Manager? isAvailable() UserHandle.myUserId() = 0, isOwner = true
02-08 12:11:06.912 1961-8134/? I/Cliptray Service? Standard mode!! ClipTray is Supported!
02-08 12:11:06.912 1961-8134/? D/Cliptray Service? isAvailable() mLastIsOwner = true
02-08 12:11:06.912 1961-8134/? I/Cliptray Service? Owner!! ClipTray is Supported! mIsOwnerClipTray = true
02-08 12:11:06.912 1961-8134/? D/Cliptray Service? ignore packageName : com.mycompany.ourapp
...
02-08 12:12:39.782 22936-22936/com.mycompany.ourapp I/Choreographer? Skipped 35 frames! The application may be doing too much work on its main thread.
...
02-08 12:13:02.622 945-2086/? I/WindowState? WIN DEATH: Window{8dce4a3 u0 com.lge.launcher2/com.lge.launcher2.Launcher}
...
02-08 12:13:02.872 945-1922/? I/WindowState? WIN DEATH: Window{393167d2 u0 InputMethod}
...
02-08 12:13:03.052 1979-1979/? D/QC_RIL_OEM_HOOK? The connection to the service got disconnected unexpectedly!
02-08 12:13:03.052 1961-1961/? D/QC_RIL_OEM_HOOK? The connection to the service got disconnected unexpectedly!
02-08 12:13:03.052 1850-1850/? D/QC_RIL_OEM_HOOK? The connection to the service got disconnected unexpectedly!
02-08 12:13:03.052 1850-1850/? D/QC_RIL_OEM_HOOK? The connection to the service got disconnected unexpectedly!
02-08 12:13:03.072 945-945/? W/InputMethodManagerService? Session failed to close due to remote exception
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:496)
at com.android.internal.view.IInputMethodSession$Stub$Proxy.finishSession(IInputMethodSession.java:305)
at com.android.server.InputMethodManagerService.finishSessionLocked(InputMethodManagerService.java:1463)
at com.android.server.InputMethodManagerService.clearClientSessionLocked(InputMethodManagerService.java:1454)
at com.android.server.InputMethodManagerService.clearCurMethodLocked(InputMethodManagerService.java:1480)
at com.android.server.InputMethodManagerService.onServiceDisconnected(InputMethodManagerService.java:1499)
at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1391)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1405)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at com.android.server.SystemServer.run(SystemServer.java:302)
at com.android.server.SystemServer.main(SystemServer.java:203)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
...
02-08 12:13:03.132 945-2088/? I/ActivityManager? Process com.google.process.gapps (pid 21317) has died
...
02-08 12:13:03.182 1405-1405/? D/LGKeyguardUnlockMethodController? onTrustChanged with userId : 0 , getUserTrustIsManaged : false ,getUserHasTrust : false
...
02-08 12:13:03.452 362-1705/? V/AudioFlinger? 22936 died, releasing its sessions
02-08 12:13:03.452 362-1705/? V/AudioFlinger? pid 1850 @ 0
02-08 12:13:03.452 362-1705/? V/AudioFlinger? pid 22936 @ 1
02-08 12:13:03.452 362-1705/? V/AudioFlinger? removing entry for pid 22936 session 520
02-08 12:13:03.452 362-1705/? V/AudioFlinger? purging stale effects
02-08 12:13:03.452 362-1705/? V/AudioFlinger? remove track (4097) and delete from mixer
02-08 12:13:03.452 945-2086/? I/WindowState? WIN DEATH: Window{3eafa2d1 u0 com.mycompany.ourapp/com.mycompany.ourapp.MainActivity}
Run Code Online (Sandbox Code Playgroud)
可能部分负责的内存泄漏:https://code.google.com/p/android/issues/detail?id = 79729
题
什么可能导致应用程序以这种方式崩溃?这是记忆问题吗?我在这里复制的日志输出中的任何内容是相关的吗?
还有其他人有这个问题并解决了吗?Android 5.0.x/1.x内存泄漏错误是否有责任?
我希望我可以更具体,但代码是专有的,问题不是(或尚未)本地化到任何一个特定的代码示例.如果需要有关特定问题的更多信息,请询问.
更新
我注意到日志中有一堆Choreographer消息,说它做了太多工作,但它们是相对较小的帧跳过(约35帧),最后一条消息在应用程序崩溃前整整20秒发生.
更新2-10-16
我们现在正在尝试重用canvas对象,以防它们没有被垃圾回收,而且我们也在调用System.gc()时onTrimMemory调用它TRIM_MEMORY_RUNNING_LOW.这似乎在一定程度上减少了崩溃,但仍然经常足以令人担忧.最重要的是,我想了解为什么它似乎随机消耗太多内存和崩溃.我已经将这些onTrimMemory行添加到下面的日志输出中,这表明它在100毫秒的范围内从低到严重.如果仅在实际执行内存密集型操作时发生这种情况,那么这有意义,但有时在用户进程完成后很久就会发生.