android - GC 太多会影响设备电池显着下降吗?

标签 android bitmap garbage-collection

在我正在编写的 android 应用程序(关于国际象棋)中,我在 Singleton 类中将 LruCache 用于位图。但是每次我从一个 Activity 切换到另一个 Activity 时,adb logcat 似乎都会报告很多 GC,这两个 Activity 都持有少量的棋子图像。 (或者当我离开/重新进入应用程序时调用 GC)。并且用户可能不得不经常在这些 Activity 之间切换。

这是 logcat 输出:

08-09 11:20:26.161    1583-1583/? D/AndroidRuntime﹕ >>>>>>     AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
08-09 11:20:26.161    1583-1583/? D/AndroidRuntime﹕ CheckJNI is ON
08-09 11:20:26.244    1583-1583/? D/AndroidRuntime﹕ Calling main entry     com.android.commands.pm.Pm
08-09 11:20:26.251      878-895/? W/ActivityManager﹕ No content     provider found for permission revoke:     file:///data/local/tmp/com.loloof64.android.chess_positions_archiver
08-09 11:20:26.291      878-895/? W/ActivityManager﹕ No content     provider found for permission revoke:     file:///data/local/tmp/com.loloof64.android.chess_positions_archiver
08-09 11:20:26.343      878-879/? D/dalvikvm﹕ GC_CONCURRENT freed     299K, 13% free 11370K/12935K, paused 1ms+1ms
08-09 11:20:26.421      878-879/? D/dalvikvm﹕ GC_CONCURRENT freed     574K, 13% free 11378K/12935K, paused 1ms+2ms
08-09 11:20:26.496      878-895/? I/PackageManager﹕ Removing non-    system package:com.loloof64.android.chess_positions_archiver
08-09 11:20:26.496      878-892/? I/ActivityManager﹕ Force stopping     package com.loloof64.android.chess_positions_archiver uid=10041
08-09 11:20:26.581      878-879/? D/dalvikvm﹕ GC_CONCURRENT freed     415K, 12% free 11424K/12935K, paused 1ms+1ms
08-09 11:20:26.581      878-895/? I/PackageManager﹕ Package     com.loloof64.android.chess_positions_archiver codePath changed from     /data/app/com.loloof64.android.chess_positions_archiver-1.apk to     /data/app/com.loloof64.android.chess_positions_archiver-2.apk; Retaining     data and using new
08-09 11:20:26.581      878-895/? I/PackageManager﹕ Running dexopt on:     com.loloof64.android.chess_positions_archiver
08-09 11:20:26.742    1595-1595/? D/dalvikvm﹕ DexOpt: load 11ms,     verify+opt 80ms
08-09 11:20:26.751      878-892/? I/ActivityManager﹕ Force stopping     package com.loloof64.android.chess_positions_archiver uid=10041
08-09 11:20:26.751      878-895/? W/PackageManager﹕ Code path for pkg     : com.loloof64.android.chess_positions_archiver changing from     /data/app/com.loloof64.android.chess_positions_archiver-1.apk to     /data/app/com.loloof64.android.chess_positions_archiver-2.apk
08-09 11:20:26.751      878-895/? W/PackageManager﹕ Resource path for     pkg : com.loloof64.android.chess_positions_archiver changing from     /data/app/com.loloof64.android.chess_positions_archiver-1.apk to /data/app/com.loloof64.android.chess_positions_archiver-2.apk
08-09 11:20:26.771      878-895/? D/PackageManager﹕ New package     installed in /data/app/com.loloof64.android.chess_positions_archiver-2.apk
08-09 11:20:26.791      878-895/? I/ActivityManager﹕ Force stopping package com.loloof64.android.chess_positions_archiver uid=10041
08-09 11:20:26.801      990-990/? D/dalvikvm﹕ GC_EXPLICIT freed 230K,     8% free 11366K/12295K, paused 1ms+5ms
08-09 11:20:26.811    1025-1025/? D/dalvikvm﹕ GC_EXPLICIT freed 162K, 4% free 9374K/9735K, paused 1ms+1ms
08-09 11:20:26.861    1113-1114/? D/dalvikvm﹕ GC_CONCURRENT freed 177K, 3% free 9298K/9543K, paused 2ms+1ms
08-09 11:20:26.861    1113-1129/? I/AccountTypeManager﹕ Loaded meta-data for 1 account types, 0 accounts in 9ms(wall) 0ms(cpu)
08-09 11:20:26.922    1113-1129/? I/AccountTypeManager﹕ Loaded meta-data for 1 account types, 0 accounts in 1ms(wall) 0ms(cpu)
08-09 11:20:26.961      878-891/? D/dalvikvm﹕ GC_EXPLICIT freed 499K, 14% free 11235K/12935K, paused 1ms+1ms
08-09 11:20:26.972      878-891/? D/PackageManager﹕ generateServicesMap(android.accounts.AccountAuthenticator): 2 services unchanged
08-09 11:20:26.981      878-891/? D/PackageManager﹕ generateServicesMap(android.content.SyncAdapter): 4 services unchanged
08-09 11:20:26.981      878-891/? D/BackupManagerService﹕ Received broadcast Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:com.loloof64.android.chess_positions_archiver flg=0x10000010 (has extras) }
08-09 11:20:26.981      878-891/? D/PackageManager﹕ generateServicesMap(android.accounts.AccountAuthenticator): 2 services unchanged
08-09 11:20:26.981      878-891/? D/PackageManager﹕ generateServicesMap(android.content.SyncAdapter): 4 services unchanged
08-09 11:20:26.991      878-891/? D/BackupManagerService﹕ Received broadcast Intent { act=android.intent.action.PACKAGE_ADDED dat=package:com.loloof64.android.chess_positions_archiver flg=0x10000010 (has extras) }
08-09 11:20:26.991      878-891/? V/BackupManagerService﹕ updatePackageParticipantsLocked: #1
08-09 11:20:27.022      878-891/? W/RecognitionManagerService﹕ no available voice recognition services found
08-09 11:20:27.061      878-891/? D/BackupManagerService﹕ Received broadcast Intent { act=android.intent.action.PACKAGE_REPLACED dat=package:com.loloof64.android.chess_positions_archiver flg=0x10000010 (has extras) }
08-09 11:20:27.061      878-891/? V/BackupManagerService﹕ updatePackageParticipantsLocked: #1
08-09 11:20:27.092      878-895/? D/dalvikvm﹕ GC_EXPLICIT freed 413K, 13% free 11375K/12935K, paused 1ms+6ms
08-09 11:20:27.128    1583-1583/? D/AndroidRuntime﹕ Shutting down VM
08-09 11:20:27.128    1583-1588/? D/dalvikvm﹕ GC_CONCURRENT freed 96K, 79% free 441K/2048K, paused 0ms+0ms
08-09 11:20:27.411    1604-1604/? D/AndroidRuntime﹕ >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
08-09 11:20:27.411    1604-1604/? D/AndroidRuntime﹕ CheckJNI is ON
08-09 11:20:27.461    1604-1604/? D/AndroidRuntime﹕ Calling main entry com.android.commands.am.Am
08-09 11:20:27.471      878-886/? I/ActivityManager﹕ START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.loloof64.android.chess_positions_archiver/.ChessPositionsArchiverActivity} from pid 1604
08-09 11:20:27.471      878-886/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21005
08-09 11:20:27.481    1604-1604/? D/AndroidRuntime﹕ Shutting down VM
08-09 11:20:27.491    1604-1609/? D/dalvikvm﹕ GC_CONCURRENT freed 98K, 78% free 470K/2048K, paused 1ms+0ms
08-09 11:20:27.491    1615-1615/? D/dalvikvm﹕ Not late-enabling CheckJNI (already on)
08-09 11:20:27.491      878-962/? I/ActivityManager﹕ Start proc com.loloof64.android.chess_positions_archiver for activity com.loloof64.android.chess_positions_archiver/.ChessPositionsArchiverActivity: pid=1615 uid=10041 gids={}
08-09 11:20:27.511      878-915/? W/NetworkManagementSocketTagger﹕ setKernelCountSet(10041, 1) failed with errno -2
08-09 11:20:27.551      785-785/? D/dalvikvm﹕ GC_EXPLICIT freed 35K, 4% free 9038K/9347K, paused 1ms+0ms
08-09 11:20:27.551      785-785/? D/dalvikvm﹕ GC_EXPLICIT freed <1K, 4% free 9038K/9347K, paused 0ms+1ms
08-09 11:20:27.561      785-785/? D/dalvikvm﹕ GC_EXPLICIT freed <1K, 4% free 9038K/9347K, paused 1ms+1ms
08-09 11:20:27.640    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 243K, 4% free 9237K/9607K, paused 1ms+1ms
08-09 11:20:27.711    1615-1615/? D/dalvikvm﹕ GREF has increased to 201
08-09 11:20:27.774    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 367K, 6% free 9304K/9799K, paused 1ms+1ms
08-09 11:20:27.861    1615-1615/? I/ChessPositionsArchiver﹕ Application positions directory already present
08-09 11:20:27.891    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 398K, 6% free 9338K/9863K, paused 1ms+1ms
08-09 11:20:28.051      878-891/? I/Process﹕ Sending signal. PID: 1615 SIG: 3
08-09 11:20:28.051    1615-1620/? I/dalvikvm﹕ threadid=3: reacting to signal 3
08-09 11:20:28.051    1615-1620/? I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
08-09 11:20:28.111    1615-1615/? D/gralloc_goldfish﹕ Emulator without GPU emulation detected.
08-09 11:20:28.121      878-905/? I/ActivityManager﹕ Displayed com.loloof64.android.chess_positions_archiver/.ChessPositionsArchiverActivity: +657ms
08-09 11:20:28.141      878-915/? W/NetworkManagementSocketTagger﹕ setKernelCountSet(10004, 0) failed with errno -2
08-09 11:20:38.051    1615-1615/? D/dalvikvm﹕ GC_FOR_ALLOC freed 154K, 4% free 9554K/9927K, paused 3ms
08-09 11:20:38.061    1615-1615/? D/dalvikvm﹕ GC_FOR_ALLOC freed 52K, 4% free 9828K/10183K, paused 3ms
08-09 11:20:45.862      878-886/? I/ActivityManager﹕ START {cmp=com.loloof64.android.chess_positions_archiver/.PositionEditorActivity (has extras)} from pid 1615
08-09 11:20:45.862      878-886/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:20:45.891    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 451K, 6% free 9865K/10439K, paused 0ms+1ms
08-09 11:20:45.941      878-905/? I/ActivityManager﹕ Displayed com.loloof64.android.chess_positions_archiver/.PositionEditorActivity: +74ms
08-09 11:21:00.651      878-885/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:21:02.571    1615-1615/? D/dalvikvm﹕ GC_FOR_ALLOC freed 132K, 4% free 10111K/10439K, paused 4ms
08-09 11:21:14.021     878-1018/? W/InputManagerService﹕ Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@b5b4dce8
08-09 11:21:19.231     878-1051/? I/ActivityManager﹕ START {cmp=com.loloof64.android.chess_positions_archiver/.PositionEditorActivity (has extras)} from pid 1615
08-09 11:21:19.231     878-1051/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:21:19.252    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 591K, 7% free 9927K/10631K, paused 0ms+0ms
08-09 11:21:19.292      878-905/? I/ActivityManager﹕ Displayed com.loloof64.android.chess_positions_archiver/.PositionEditorActivity: +65ms
08-09 11:21:44.382      878-885/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:22:08.213    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 107K, 4% free 10210K/10631K, paused 1ms+5ms
08-09 11:22:14.974     878-1050/? I/ActivityManager﹕ START {cmp=com.loloof64.android.chess_positions_archiver/.PositionEditorActivity (has extras)} from pid 1615
08-09 11:22:14.974     878-1050/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:22:15.053      878-905/? I/ActivityManager﹕ Displayed com.loloof64.android.chess_positions_archiver/.PositionEditorActivity: +70ms
08-09 11:22:24.142     878-1049/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:22:31.112     878-1048/? I/ActivityManager﹕ START {cmp=com.loloof64.android.chess_positions_archiver/.PositionEditorActivity (has extras)} from pid 1615
08-09 11:22:31.112     878-1048/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015
08-09 11:22:31.142    1615-1619/? D/dalvikvm﹕ GC_CONCURRENT freed 632K, 8% free 9999K/10759K, paused 1ms+0ms
08-09 11:22:31.203      878-905/? I/ActivityManager﹕ Displayed com.loloof64.android.chess_positions_archiver/.PositionEditorActivity: +85ms
08-09 11:22:31.203      878-879/? D/dalvikvm﹕ GC_CONCURRENT freed 503K, 13% free 11336K/12935K, paused 1ms+0ms
08-09 11:22:38.042      878-886/? W/WindowManager﹕ Failure taking screenshot for (180x300) to layer 21015

所以我必须担心用户电池性能,有这么多 GC 调用吗?或者这不是那么糟糕,所以我可以保留它吗?

顺便问一下,例如,这一行到底是什么意思?

GC_CONCURRENT freed 402K, 6% free 9529K/10055K, paused 1ms+1ms

这 6% 的空闲是什么意思(在 gc 之前它是空闲的剩余内存吗?) 如何解读停顿时间(1ms+1ms)?

最佳答案

GC 一项昂贵的操作,那么我认为您应该关心那些许多日志消息。

参见 Managing Bitmap memory查看 Android 的提示。

另见 this answer了解 GC 日志消息。

GC_FOR_MALLOC means that the GC was triggered because there wasn't enough memory left on the heap to perform an allocation. Might be triggered when new objects are being created.

GC_EXPLICIT means that the garbage collector has been explicitly asked to collect, instead of being triggered by high water marks in the heap. Happens all over the place, but most likely when a thread is being killed or when a binder communication is taken down.

There are a few others as well:

GC_CONCURRENT Triggered when the heap has reached a certain amount of objects to collect.

GC_EXTERNAL_ALLOC means that the the VM is trying to reduce the amount of memory used for collectable objects, to make room for more non-collectable.

Update: There has been a name-change of the first event in later versions of Android. It's now called "GC_FOR_ALLOC". There is also a new event available, although very rare in modern phones: GC_BEFORE_OOM means that the system is running really low on memory, and that there is a final GC performed, in order to avoid calling the low memory killer.

关于android - GC 太多会影响设备电池显着下降吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31902834/

相关文章:

java - 如何从 p12 证书中获取 SHA1 指纹?

android - 为什么 Android 模拟器 29.2.0 在 Gnu/Linux 下运行会崩溃?

.net - 如何使用.NET CF在WebBrowser控件中获取所有页面的位图

ruby - 检查点并恢复 Ruby 中的堆

memory - F# 中旅行商的表现

android - 没有内容 View 的 snackbar

android - 如何在android Canvas 上绘制轮廓路径

android - 在android中有Hue时查找颜色名称

java - 使位图的触摸区域变为透明

java - JVM 堆已用百分比 - 何时生成警报