在我正在编写的 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/