Android垃圾收集器托儿所全

时间:2014-12-04 06:33:37

标签: android performance mono 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

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

我读了它here并在我的项目中创建了 environment.txt 文件,其中包含以下几行:

MONO_GC_PARAMS=nursery-size=1024m
MONO_GC_PARAMS=soft-heap-limit=64m

我只是在nursery-sizesoft-heap-limit测试不同的值,但它根本没用。

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

1 个答案:

答案 0 :(得分:4)

垃圾收集在堆的不同部分工作

  1. 托儿所
  2. 终身
  3. 不同的JVM(Hotspot,IBM等)有所不同 一般幼儿园的规模低于Tenured(幼儿园< Tenured) 防爆。在2 GB的堆空间中,Nusery的范围可以是128-512,而剩余的将是Tenured。

    JVM将始终妥善管理托儿所部分。此部分大部分时间用于创建新对象,因为此部分的大小较低GC操作(压缩,GC集合)快速且调整良好。

    当苗圃中的物体长大或活着超过特定时限(长寿命物体)时,使用终身部分。他们在Tenured中维护。这是更大的内存块,因此GC操作更慢。

    幼儿园的停顿通常都很小,当你不断面对它时不应该产生很大的影响,那就是问题的迹象。在调整托儿所的大小时,请记住它不应超过终身教职。大小与GC操作时间成正比。

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

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