2014-12-04 60 views
1

我是新来的android开发,我想了解如何Garbage Collection工作,但我需要一个人的第一手清楚的解释。Android垃圾收集器苗圃充分

我的应用程序正在与服务器进行一些大型事务。当我从一个活动切换到另一个,我不断地在我的控制台中看到以下消息:

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

,当然还有,在毫秒时间每次都是不同的,但它发生了很多!

我就可以了here阅读并创造environment.txt文件在我的项目有以下几行:

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

我只是在nursery-sizesoft-heap-limit测试不同的值,但它并没有在帮助所有。

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

+0

尝试增加/伸缩幼儿园规模翻番现在。 – 2014-12-04 06:37:40

回答

2

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

  1. 苗圃
  2. 终身

这是对不同的JVM(热点,IBM等)不同 通常苗圃尺寸比终身下(托儿所< <有服务年龄) Ex。在2GB的堆空间中,Nusery可以在128-512之间变化,剩余部分将变成Tenured。

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

当托儿所的物体长大或活着超过特定的时间限制(长寿命物体)时使用寿命部分。他们在Tenured中维护。这是更大的内存,因此GC操作速度较慢。

幼儿园暂停一般很小,当您持续面对时不应该有很大的影响,那就是问题的表现。调整幼儿园的大小时请记住,它不应该超过终身教职。大小与GC操作时间成正比。

你的情况,你应该看看,

  1. 现有幼儿园规模和对象分配模式。如果创建尺寸较大的对象然后尝试增加2的倍数的苗圃。
  2. 尝试用于GC操作的并行线程。这可以大大提高性能。
  3. 了解JVM的政策,即吞吐量政策,CMS政策(依赖于JVM)