堆内存被分成了 new 和 old 两部分,

new 部分包括新创建对象区和两个 survivor 区(SS#1和SS#2),新创建的对象分配内存在 new 中,长时间存活的对象被移动到了 old 部分。Perm 是一个永久区域,分配给JVM本省,可以通过 命令行参数 -XX:MaxPermSize=64m 来设置。

当 new 被填满后,会触发"辅助" GC,把存在足够长时间的对象移动到 old 中。当 old 中也被填满了,会触发"主" GC ,将遍历堆内存中的所有对象。可以看出,"主" GC 会消耗更多的时间。足够大的 new 会适合需要大量创建存在时间很短的对象,而 old 如果不够大会频繁的触发"主" GC ,大大降低了性能。所以,我们的任务就是如何设置堆内存的大小以及如何规划 new 和 old 区域的比例来适合我们应用。

"辅助" GC 使用Copy/scavenge collection 算法,"主"GC 使用 Mark-compact collection。

例 java -server -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m 服务器应用名


建议
1)设置- Xms 和 -Xmx 的大小相等,可以避免在每次 GC 后调整堆内存的大小。
2) 同样道理设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半
posted on 2008-05-20 13:46  李小鱼  阅读(1379)  评论(0编辑  收藏  举报