垃圾回收机制的总结
HOTSPOT JVM内存模型图
Java Heap 分为三个主要的域:新域(Young/New)、旧域(Old)以及永久域(Permanent)。JVM生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。在永久 域中JVM则存储class和method对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分。
用-Xms和-Xmx 控制整个堆(Young+Old)的原始大小或最大值。
下面的命令是把初始大小设置为128M,最大值设置为256M:
java –Xms128m –Xmx256m
用-XX:NewRatio设置新域(Young)在堆中所占的比例。
下面的命令把整个堆设置成128m,新域比率设置成3,即新域与旧域比例为1:3,新域为堆的1/4或32M:
java –Xms128m –Xmx128m –XX:NewRatio =3
或者直接设置新域(Young)的大小,
下面的命令把新域的大小设置成64m:
java –Xms256m –Xmx256m –Xmn64m
此时旧域的大小为256m-64m=192m
永久域默认大小为4m。运行程序时,jvm会调整永久域的大小以满足需要。每次调整时,jvm会对堆进行一次完全的垃圾收集。
使 用-XX:MaxPerSize标志来增加永久域搭大小。在WebLogic Server应用程序加载较多类时,经常需要增加永久域的最大值。当jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小。为了避免 调整,可使用-XX:PerSize标志设置初始值。
下面命令把永久域初始值设置成32m,最大值设置成64m。
java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m
新域分为三部分,第一部分为Eden,用于生成新的对象,剩下两部分为两个Survivor Spaces(from,to), 用来存放每次垃圾回收后存活下来的对象。新域中使用复制收集器,当Eden 充满时,收集器停止应用程序,把所有活动对象复制到当前的from Survivor Space, 当from Survivor Space充满时,收集器则把活动对象复制到当前的to Survivor Space。From和to Space可以互换角色。活动的对象将在Survivor Space不断复制,直到它们被转入旧域。
用-XX:SurvivorRatio可以设置Survivor与Eden空间的比值
以下命令把新域设置成64m,Eden占32m,每个救助域各占16m
java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2
当两个Survivor Spaces(from,to)都满了,剩下的活动对象也会被转入旧域。如果想让活动对象不经过Survivor Spaces,直接进入旧域,可以把-XX:MaxTenuringThreshold设置为0,并把-XX:SurvivorRatio设置成一个大值(比如10000或者更大)以最大化Eden空间。
本文参考并转载了以下文章的内容
http://info.52z.com/html/28809.html
http://gzcj.iteye.com/blog/289062
http://java.chinaitlab.com/Jvm/36987.html