JVM调优是干嘛
JVM调优是干嘛呢?其实就是找到合适的JVM设置。
包括:
- 新生代或老年代大小
- 选择合适的GC算法(收集器)
但是在找到这些之前,我们需要查看JVM的一些信息,比如:新生代和老年代占用情况,GC发生的次数以及时长等等。
jvm调优,调的是稳定,并不能带给你性能的大幅提升。服务稳定的重要性就不用多说了,保证服务的稳定,gc永远会是Java程序员需要考虑的不稳定因素之一。复杂和高并发下的服务,必须保证每次gc不会出现性能下降,各种性能指标不会出现波动,gc回收规律而且干净,找到合适的jvm设置。
调优的指标
在性能属性里面,吞吐量、延迟、内存占用,我们只能选择其中两个进行调优,不可三者兼得。
调优方法
工具有:Jconsole,jProfile,VisualVM等。
首先是查看JVM的信息,我们可以通过jvisualvm.exe中的Visual GC插件查看GC的图形,也可以通过以下命令:
jstat -gc 15016 1000
看到每1秒钟java进程号为15016的GC回收情况
结果为:
[root@yxdevapp04 c1000k]# jstat -gc 15016 1000
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
699008.0 699008.0 29980.4 0.0 699136.0 116881.6 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272
699008.0 699008.0 29980.4 0.0 699136.0 118344.8 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272
699008.0 699008.0 29980.4 0.0 699136.0 119895.5 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272
699008.0 699008.0 29980.4 0.0 699136.0 121383.1 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272
解释如下:
S0C 是指:Survivor0区的分配空间
S0U 是指:Survivor1区的已经使用的空间
EC是指:Eden区所使用的空间
EU是指:Eden区当前使用的空间
OC是指:老年代分配的空间
OU是指:老年代当前使用的空间
PC是指:持久待分配的空间
PU是指:持久待当前使用的空间
YGC是指:年轻代发生的次数,这里是354次
YGCT是指:年轻代发送的总时长,这里是54.272秒,因此每次年轻代发生GC,即平均每次stop-the-world的时长为54.272/354=0.153秒。
FGC是指:年老代回收的次数,或者成为FullGC的次数。
FGCT是指:年老代发生回收的总时长。
GCT是指:包括年轻代YGC及年老代FGC的总时间长。
经过实际的调优测试我们发现,当发生YGC的时候,如果S0U或S1U区如果有任意一个区域为0的时候,此时YGC的速度很快,相反如果S0U或者S1U中都有数据,或相对满的时候,此时YGC的时间边长,这就是因为S0/S1及Eden区的比例问题导致的。
经过一定时间的调优,我们基本上可以使得YGC的次数非常少,时间非常快,很长时间,数天都不会发生FGC,此时JVM的调优算是一个好的结果。
https://blog.csdn.net/Javazhoumou/article/details/99298624