垃圾回收机制的总结

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值