获取I/art:显式并发标记扫描GC释放

Jae*_*ger 13 java android android-service

我正在启动service =>后台服务,并开始检查"新线程"中的文件,在日志中我得到以下内容,服务/应用程序暂停.

记录: I/art: Explicit concurrent mark sweep GC freed 25935(1686KB) AllocSpace objects, 13(903KB) LOS objects, 39% free, 13MB/22MB, paused 649us total 43.569ms

它只是扫描SD卡中MyData中的文件,其中包含一堆图片(大约20个图片).

**扫描=获取图片名称并将其保存为字符串.

Tan*_*.7x 26

所有这些意味着垃圾收集器正在完成其工作并释放内存.

如果您经常(或一致地)看到这一点,那么您可能会分配太多对象.一个常见原因是在循环中分配许多(或几个大)对象,如下所示:

for (int i = 0; i < 100; i++) {
    Bitmap bmp = Bitmap.create(100, 100, Bitmap.Config.ARGB_4444);
}
Run Code Online (Sandbox Code Playgroud)

每次我们点击这个循环,我们都会分配一百个新的Bitmap对象.

防止GC扫描的最佳方法是不分配对象.当然,您必须使用Java分配对象,因此您需要确保不必要地分配对象.

以下是 Google发布的众多YouTube视频之一,其中包含有关避免GC事件和正确管理内存的提示.

  • Android Studio 是一个 IDE,它与您设备上运行的代码无关。听起来你有一个无限运行的循环。 (2认同)