JVM调优_jdk自带的小工具

前言

JVM调优这一块,今天来研究一下,主要涉及jdk的bin目录下的一些小工具。

正文

一、储备知识

1、JVM实质上分为三大块,年轻代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取消,换了个说法方法区变成了元空间)。

2、垃圾回收GC,分为2种,一是Minor GC,可以可以称为YGC,即年轻代GC,当Eden区,还有一种称为Major GC,又称为FullGC。

3、GC原理:

我们可以看到年轻代包括Eden区(对象刚被new出来的时候,放到该区),S0和S1,是幸存者1区和幸存者2区,从名字可以看出,是当发生YGC,没有被任何其他对象所引用的对象将会从内存中被清除,还被其他对象引用的则放到幸存者区。当发生多次YGC,在S0、S1区多次没有被清楚的对象,则会被移到老年代区域。当老年代区域被占满的时候,则会发送FullGC。

无论是YGC或是FullGC,都会导致stop-the-world,即整个程序停止一些事务的处理,只有GC进程允许以进行垃圾回收,因此如果垃圾回收时间较长,部分web或socket程序,当终端连接的时候会报connetTimeOut或readTimeOut异常,

4、从JVM调优的角度来看,我们应该尽量避免发生YGC或FullGC,或者使得YGC和FullGC的时间足够的短。

二、启动程序java -jar加上参数

java -server -Xms4G -Xmx4G -Xmn2G -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar c1000k.jar&

这台机器是一个4G内存的机器,因此:

-Xms4G 是指: JVM启动时整个堆(包括年轻代,年老代)的初始化大小。

-Xmx4G 是指: JVM启动时整个堆的最大值。

-Xmn2G是指:年轻代的空间大小,剩下的是年老代的空间。

-XX:SurvivorRatio=1是指:年轻代空间中2个Survivor空间与Eden空间的大小比例。此处为1:1:1,算法如下:比如整个年轻代空间为2G,如果比例为1,那么2/3,则S0/S1/Eden的空间大小是同样的,为666M。

该值不设置,则JDK默认为比例为8,那么是1:1:8,通过上面的算法可以得出S0/S1的大小。我们可以看到官方通过增大Eden区的大小,来减少YGC发生的次数,但有时我们发现,虽然次数减少了,但Eden区满

的时候,由于占用的空间较大,导致释放缓慢,此时stop-the-world的时间较长,因此需要按照程序情况去调优。

-XX:+UseConcMarkSweepGC是指:使用GC的回收类型。这里是CMS类型,JDK1.7以后推荐使用+UseG1GC,被称为G1类型(或Garbage First)的回收器。

三、小工具介绍

找到自己安装的jdk,其bin目录下有许多exe文件,他们的用途都知道吗?
jps、jstate、jconsole、jvisualvm等。
在这里插入图片描述

1. jps

jps主要输出线程id和线程的名字。
在这里插入图片描述

2.jstate

[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的总时间长。

通常结合图形或数据,我们可以看到当EU即将等于EC的时候,此时发生YGC,因此YGC次数+1,YGCT时间增加。

经过实际的调优测试我们发现,当发生YGC的时候,如果S0U或S1U区如果有任意一个区域为0的时候,此时YGC的速度很快,相反如果S0U或者S1U中都有数据,或相对满的时候,此时YGC的时间边长,这就是因为S0/S1及Eden区的比例问题导致的。

3.jvisualvm

在控制台输入jvisualvm,就会弹出如下可视化界面(当然,这个是需要配置好java的环境变量才能在任意目录下输入都有响应了。)
其中的Visual GC,这个是自己安装的插件;
在下图的工具栏中可进行安装。

工具–插件–中找到Visual GC插件进行安装.
在这里插入图片描述

4.jconsole

其余:
参考
JVM性能调优实践——JVM篇

8款JVM性能调优监控工具(提高开发效率)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值