Android Garbage Collector Nursery Full

ᴛʜᴇ*_*ᴛᴇʟ 2 mono performance android garbage-collection xamarin

我是 android 开发的新手,我试图了解它是如何Garbage Collection工作的,但我需要第一手的人的明确解释。

我的应用程序正在与服务器来回进行一些大型事务。当我从一个活动切换到另一个活动时,我经常在控制台中收到以下消息:

GC_MINOR: (Nursery full) pause 2.77ms, total 2.95ms, bridge 11.82ms promoted 128K major 2640K los 4441K
Run Code Online (Sandbox Code Playgroud)

当然,ms 计时每次都不同,但它发生了很多!

我在这里阅读并使用以下几行在我的项目中创建了environment.txt文件:

MONO_GC_PARAMS=nursery-size=1024m
MONO_GC_PARAMS=soft-heap-limit=64m
Run Code Online (Sandbox Code Playgroud)

我只是在测试不同的价值观nursery-size和soft-heap-limit,但它在所有没有帮助。

现在,当我从一项活动转到另一项活动时,应用程序运行速度非常慢。
有人可以详细解释一下并向我提供一些选择吗?
谢谢你。

Nac*_*ate 5

垃圾收集适用于堆的不同部分

  1. 苗圃
  2. 终身制

这在不同的 JVM(Hotspot、IBM 等)上有所不同。通常 Nursery 大小低于 Tenured (Nursery << Tenured) Ex。在 2 GB 的堆空间中,Nusery 的范围是 128-512,剩余的将是 Tenured。

苗圃部分将始终由 JVM 很好地管理。这部分大部分时间用于创建新对象,分配因为这部分的大小较小 GC 操作(压缩、GC 收集)速度快且调优。

当 Nursery 中的对象变大或存活超过特定时间限制(长寿对象)时,将使用 Tenured 部分。它们在 Tenured 中维护。这是更大的内存块,因此 GC 操作更慢。

托儿所的停顿通常很小,当您连续面对它时应该不会产生太大影响,那么这就是问题的迹象。在调整托儿所的大小时,请记住它不应超过 Tenured。大小与 GC 操作时间成正比。

在你的情况下,你应该看看,

  1. 现有的托儿所大小和对象分配模式。如果创建更大尺寸的对象,则尝试以 2 的倍数增加 Nurseries。
  2. 尝试并行线程进行 GC 操作。这可以显着提高性能。
  3. 找出 JVM 策略,即吞吐量策略、CMS 策略(依赖于 JVM)