Android 过多的GC会显著降低设备电池电量吗?
在我正在编写的android应用程序(关于国际象棋)中,我在一个单例类中为位图使用LruCache。但是,每次我从一个活动切换到另一个活动时,adb logcat似乎都会报告许多GC,这两个活动都保存了少量的棋子图像。(或在我离开/重新输入应用程序时调用GC)。用户可能需要经常在这些活动之间切换 这是logcat输出:Android 过多的GC会显著降低设备电池电量吗?,android,bitmap,garbage-collection,Android,Bitmap,Garbage Collection,在我正在编写的android应用程序(关于国际象棋)中,我在一个单例类中为位图使用LruCache。但是,每次我从一个活动切换到另一个活动时,adb logcat似乎都会报告许多GC,这两个活动都保存了少量的棋子图像。(或在我离开/重新输入应用程序时调用GC)。用户可能需要经常在这些活动之间切换 这是logcat输出: 08-09 11:20:26.161 1583-1583/? D/AndroidRuntime﹕ >>>>>> AndroidR
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
这6%的可用空间是什么意思(在gc之前是否释放了剩余内存?)
如何解释暂停时间(1ms+1ms)?GC是一个昂贵的操作,那么我认为您应该关心那些日志消息 请参阅查看Android的提示 另请参阅以了解GC日志消息 GC_FOR_MALLOC意味着触发GC是因为堆上没有足够的内存来执行分配。可能在创建新对象时触发 GC_EXPLICIT意味着垃圾收集器被显式地要求收集,而不是由堆中的高水位线触发。到处都会发生,但最有可能发生在线程被终止或绑定器通信中断时 还有其他一些: 当堆达到一定数量的要收集的对象时,会触发GC_并发 GC_EXTERNAL_ALLOC意味着虚拟机正试图减少用于可收集对象的内存量,为更多不可收集对象腾出空间 更新:在Android的更高版本中,第一个事件的名称发生了变化。它现在被称为“GC_FOR_ALLOC”。还有一个新的事件可用,尽管在现代手机中非常罕见:GC_BEFORE_OOM意味着系统运行时内存非常不足,并且会执行最后一次GC,以避免调用内存不足的杀手
谢谢你完整的回答。我面临着这个问题,尽管我已经在使用你给我的链接所在页面的提示:LruCache和AsyncTask。这个问题可能很难解决。。。可能是因为我使用的是Svg图像,它们在不同大小上都有更好的渲染效果,但在Android上不是那么标准,更难使用。最后,我还从谷歌找到了一个解释:
GC_CONCURRENT freed 402K, 6% free 9529K/10055K, paused 1ms+1ms