GC调优

GC调优并没有一个绝对的值,不同的环境因为服务器性能的不通、业务的不通而有不同的表现。因此没有一个统一的标准。只能根据实际的环境进行不断调整、观察判断,寻找平衡点。

调整不合理可能会导致OutOfMemoryError。

下面给一个比较粗的参考:

Yong GC执行的很快:小于50ms

Yong GC执行的并不频繁:大概10s执行一次

Full GC执行的很快:小于1s

Full GC执行的并不频繁:10分钟执行一次


这些参考数值并非绝对,他们根据服务状态的不同而有所区别,某些服务可能满足于Full GC每次0.9秒的速度,但另一些可能不是。因此,针对实际情况需要根据不同的服务设定不同的值、以决定是否进行GC优化。

查看GC状态时,不要只关注Yong GC和Full GC的执行时间。还要关注GC执行的次数。例如:当新生代空间较小时,Yong GC会过于频繁的发生(有时会超过1次/秒)。

另外,转移到老年代的对象数增多,则会导致Full GC执行次数增多。因此,别忘了加上 –gccapacity 来查看具体占用了多少内存。


设定内存空间大小

内存空间大小、GC执行次数、GC执行时间,这三者间的关系如下:

(1)大内存空间

  a.减小GC执行次数

  b.增加GC执行时间

(2)小内存空间

  a.减小GC执行时间

  b.增加GC执行次数
  

关于如何设置内存空间的大小,没有固定的标准答案。如果服务器资源足够,而且Full GC也可能在1秒内完成,设置为10G当然可行。但大多数服务器并不是这样。如果设置内存10G时,可能要花费10~30秒来执行一次Full GC(实际执行时间会随对象的大小而改变)。

既然如此,我们应该如何设定内存空间大小呢?

一般来说,我建议为500MB。不过请注意这不是让你将内存参数设置为 –Xms500m 和 –Xmx500m。

根据优化GC之前的状态,如果Full GC执行之后内存空间剩余300M,那么最好将内存设置为1G(300M(默认程序占用)+ 500M(老年代最小空间)+200M(空闲内存))。也就是说你要为老年代额外设置500M。因此,如果你有三个执行服务器,内存分别设置为1G,2G,3G,并且检查结果。

评估内存时,需要考虑,是否自己的业务所有功能都已经跑起来了(满负载运行了吗),如果不是按照满负载的环境来评估,可能导致结果不准确,和实际的生产环境有差别。

理论上来讲,GC执行速度应该遵循1G > 2G > 3G。因此1G执行GC速度最快。但是并不说明1G空间的Full GC会花费1秒而2G空间会花费2秒。时间取决于服务器的性能和对象的大小。

因此,最佳的方式是建立尽可能多的衡量指标来监控他们一段时间,最终寻找到合理的调优配置。

对于内存空间大小,你应该额外设定 NewRatio 参数。

NewRatio 是用来设置年轻代和年老代的比例,默认是2。即 -XX:NewRatio=2 意味着新生代与老年代之比为1:1。

对于1G来说就是新生代和老年代各500M。如果 NewRatio 为2,意味着新生代老年代之比为1:2,因此该值越大,老年代空间越大,新生代空间越小。

这看似一件不是很重要的事情,但 NewRatio 参数会显著的影响整个GC的性能。如果新生代空间很小,会用更多的对象被转移到老年代空间,这样导致频繁的Full GC,增加暂停时间。

可见 NewRatio 为1是理论最佳的选择。但是实际环境中,有时可能设置为2或3更好。

 -Xms1g -Xmx1g -XX:NewRatio=2
 -Xms1g -Xmx1g -XX:NewRatio=3
 
 -Xms2g -Xmx2g -XX:NewRatio=2
 -Xms2g -Xmx2g -XX:NewRatio=3
 
 -Xms3g -Xmx3g -XX:NewRatio=2
 -Xms3g -Xmx3g -XX:NewRatio=3
 

 观察结果。注意,如果设置不当,会导致程序执行发生OutOfMemoryError。

 Metaspace

 元数据区 Metaspace 是Java8引入的一个新的参数。类似于Java7的PermGen。

 默认情况下,类元数据的分配仅受限于可用的本地内存。

我们可以使用新的 MaxMetaspaceSize 参数限定类元数据可用的本地内存的数量。它类似于 MaxPermSize。

当类元数据区使用量到达 MetaspaceSize(32位机客户端模式12M,32位服务器模式16M,64位机会更大)的时候,就会触发垃圾回收,然后回收掉无用的类加载器和 class 对象。

MetaspaceSize 的值设置的过大会延长垃圾回收时间。垃圾回收过后,引起下一次垃圾回收的类元数据空间的大小可能会变大。

 GC统计显示的 M 这一列,就是元数据区使用比例。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny05296

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值