Sun HotSpot 1.4.1 JVM堆大小的调整

Sun HotSpot 1.4.1 使用分代收集器,它把堆分为三个主要的域:新域、旧域以及永久域。 Jvm 生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。在永久域中 jvm 则存储 class method 对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分。下面介绍如何控制这些域的大小。
可使用 -Xms -Xmx 控制整个堆的原始大小或最大值。比如,下面的命令是把初始大小设置为 128M
     java –Xms 128m –Xmx 256m
为控制新域的大小,可使用 -XX:NewRatio 设置新域在堆中所占的比例。比如下面的命令把整个堆设置成 128m ,新域比率设置成 3 ,即新域与旧域比例为 1 3 ,新域为堆的 1/4 32M
java –Xms 128m –Xmx 128m –XX:NewRatio =3
可使用 -XX:NewSize -XX:MaxNewsize 设置新域的初始值和最大值。比如,下面的命令把新域的初始值和最大值设置成 64m :
  java –Xms 256m –Xmx 256m –Xmn 64m
一般不把永久域当作堆的一部分。永久域默认大小为 4m 。运行程序时, jvm 会调整永久域的大小以满足需要。每次调整时, jvm 会对堆进行一次完全的垃圾收集。使用 -XX:MaxPerSize 标志来增加永久域搭大小。在 WebLogic Server 应用程序加载较多类时,经常需要增加永久域的最大值。当 jvm 加载类时,永久域中的对象急剧增加,从而使 jvm 不断调整永久域大小。为了避免调整,可使用 -XX:PerSize 标志设置初始值。比如,下面把永久域初始值设置成 32m ,最大值设置成 64m
java –Xms 512m –Xmx 512m –Xmn 128m –XX:PermSize= 32m –XX:MaxPermSize= 64m
默认状态下, HotSpot 在新域中使用复制收集器。该域一般分为三个部分。第一部分为 Eden ,用于生成新的对象。另两部分称为救助空间,当 Eden 充满时,收集器停止应用程序,把所有可到达对象复制到当前的 from 救助空间,一旦当前的 from 救助空间充满,收集器则把可到达对象复制到当前的 to 救助空间。 From to 救助空间互换角色。维持活动的对象将在救助空间不断复制,直到它们获得使用期并转入旧域。
使用 -XX:SurvivorRatio 可控制新域子空间的大小。同 NewRation 一样, SurvivorRation 规定某救助域与 Eden 空间的比值。比如,以下命令把新域设置成 64m Eden 32m ,每个救助域各占 16m
java –Xms 256m –Xmx 256m –Xmn 64m –XX:SurvivorRation =2
如前所述,默认状态下 HotSpot 对新域使用复制收集器,对旧域使用标记-清除-压缩收集器。在新域中使用复制收集器有很多意义,因为应用程序生成的大部分对�-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">空间的对象是长寿命的,那么理论上可以立即把它们移进旧域,避免在救助空间反复复制。
但是,应用程序不能适合这种理想状态,因为它们有一小部分中长寿命的对象。最好是保持这些中长寿命的对象并放在新域中,因为复制小部分的对象总比压缩旧域廉价。
为控制新域中对象的复制,可用 -XX:TargetSurvivorRatio 控制救助空间的比例。该值是一个百分比,默认值是 50 。当较大的堆栈使用较低的 sruvivorratio 时,应增加该值到 80 90 ,以更好利用救助空间。
-XX:maxtenuring threshold 可控制上限。为放置所有的复制全部发生以及希望对象从 eden 扩展到旧域,可以把 MaxTenuring Threshold 设置成 0 。设置完成后,实际上就不再使用救助空间了,因此应把 SurvivorRatio 设成最大值以最大化 Eden 空间,设置如下:
java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio
50000 …
下面介绍如何从 jvm 中获取信息以助于调整方案。
-verbose.gc
开关可显示 gc 的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等。
打开 -xx:+ printgcdetails 开关,可以详细了解 gc 中的变化。
打开 -XX: + PrintGCTimeStamps 开关,可以了解这些垃圾收集发生的时间,自 jvm 启动以后以秒计量。
最后,通过 -xx: + PrintHeapAtGC 开关了解堆的更详细的信息。
为了了解新域的情况,可以通过 -XX:=PrintTenuringDistribution 开关了解获得使用期的对象权。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值