JVM调优-工具

一、JDK内置工具

1.监控工具

        jps

        jstat

2.故障排除工具

        jinfo

        jmap

        jstack

        jcmd

        jhat

        jhsdb

3.可视化工具

        jhsdb

        jconsole

        visualvm

        java mission control

二、第三方工具

        memory analyzer tool

        jitwatch

三、详细讲解JDK调优工具

1.jps命令

        jdk提供的一个查看当前java进程的小工具。

        命令格式:jps [options ] [ hostid ] 

1)jps

2)jps –l :输出主类或者jar的完全路径名

 

3)jps –v :输出jvm参数

2.jstat命令

        命令可以查看堆内存各部分的使用情况,以及加载类的数量[不能查看使用哪种垃圾回收器]

jstat命令的格式如下:

jstat [-options] [vmid] [间隔时间/毫秒] [查询次数]

常见的options有:

l class (类加载器)

l compiler (JIT)

l gc (GC堆状态)

l gccapacity (各区大小)

l gccause (最近一次GC统计和原因)

l gcnew (新区统计)

l gcnewcapacity (新区大小)

l gcold (老区统计)

l gcoldcapacity (老区大小)

l gcpermcapacity (永久区大小)

l gcutil (GC统计汇总)

l printcompilation (HotSpot编译统计)

1)jstat -gcutil 2060

C:\Users\yaomb>jstat -gcutil 19104
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00  92.19   0.84  19.24  94.60  92.29     15    0.117     2    0.056    0.172
  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:edu区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2)jstat -gc 2060

C:\Users\Administrator>jstat -gc 2060
 S0C    S1C    S0U    S1U      EC       EU        OC         OU          MC     MU    CCSC      CCSU   YGC     YGCT    FGC    FGCT     GCT
20480.0 20480.0  0.0   13115.3 163840.0 113334.2  614400.0   436045.7  63872.0 61266.5  0.0    0.0      149    3.440   8      0.295    3.735
  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:edu区的大小
  • EU:edu区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

3)jstat -class 2060

C:\Users\Administrator>jstat -class 2060
Loaded  Bytes  Unloaded  Bytes     Time
 15756 17355.6        0     0.0      11.29
  • Loaded:加载class的数量
  • Bytes:所占用空间大小
  • Unloaded:未加载数量
  • Bytes:未加载占用空间
  • Time:时间

3.jinfo命令

可以用来查看 Java 进程运行的 JVM 参数,系统属性等

jinfo [ option ] pid

选项:

        no option  打印命令行参数和系统属性

        -flags  打印命令行参数

        -sysprops  打印系统属性

        1)jinfo 19104

        2)jinfo -flags 19104

        里面的+号表示开启,-号表示关闭

3)动态修改的JVM参数

  Linux下:java -XX:+PrintFlagsInitial | grep manageable

Windows下:java -XX:+PrintFlagsInitial | findstr manageable

        上面显示都才能被修改

        如果是true false的可以通过 + -来设置

        如:jinfo -flag +HeapDumpAfterFullGC 19104

        如果是数字大小的 用 =

        如: jinfo -flag MaxHeadFreeRatio=60 19104

4.jmap命令

        可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。

坑:

        在k8s容器化部署的应用,使用jdk自带的一些工具,有时候会报错:

        基于openjdk:8u171构建的java镜像,使用jmap,jstat,jstack等命令打印线程的时候会提示以下错误:

Unable to get pid of LinuxThreads manager thread

        1)-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=.  live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 

jmap -dump:live,format=b,file=myjmapfile.txt 19104

2)-finalizerinfo打印正等候回收的对象的信息

 jmap -finalizerinfo 19104

3)-heap打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆内存的使用情况.

 jmap -heap 19570

Heap Configuration:  ##堆配置情况,也就是JVM参数配置的结果[平常说的tomcat配置JVM参数,就是在配置这些]
   MinHeapFreeRatio = 40 ##最小堆使用比例
   MaxHeapFreeRatio = 70 ##最大堆可用比例
   MaxHeapSize      = 2147483648 (2048.0MB) ##最大堆空间大小
   NewSize          = 268435456 (256.0MB) ##新生代分配大小
   MaxNewSize       = 268435456 (256.0MB) ##最大可新生代分配大小
   OldSize          = 5439488 (5.1875MB) ##老年代大小
   NewRatio         = 2  ##新生代比例
   SurvivorRatio    = 8 ##新生代与suvivor的比例
   PermSize         = 134217728 (128.0MB) ##perm区 永久代大小
   MaxPermSize      = 134217728 (128.0MB) ##最大可分配perm区 也就是永久代大小

Heap Usage: ##堆使用情况【堆内存实际的使用情况】
New Generation (Eden + 1 Survivor Space):  ##新生代(伊甸区Eden区 + 幸存区survior(1+2)空间)
   capacity = 241631232 (230.4375MB)  ##伊甸区容量
   used     = 77776272 (74.17323303222656MB) ##已经使用大小
   free     = 163854960 (156.26426696777344MB) ##剩余容量
   32.188004570534986% used ##使用比例
Eden Space:  ##伊甸区
   capacity = 214827008 (204.875MB) ##伊甸区容量
   used     = 74442288 (70.99369812011719MB) ##伊甸区使用
   free     = 140384720 (133.8813018798828MB) ##伊甸区当前剩余容量
   34.65220164496263% used ##伊甸区使用情况
From Space: ##survior1区
   capacity = 26804224 (25.5625MB) ##survior1区容量
   used     = 3333984 (3.179534912109375MB) ##surviror1区已使用情况
   free     = 23470240 (22.382965087890625MB) ##surviror1区剩余容量
   12.43827838477995% used ##survior1区使用比例
To Space: ##survior2 区
   capacity = 26804224 (25.5625MB) ##survior2区容量
   used     = 0 (0.0MB) ##survior2区已使用情况
   free     = 26804224 (25.5625MB) ##survior2区剩余容量
   0.0% used ## survior2区使用比例
PS Old  Generation: ##老年代使用情况
   capacity = 1879048192 (1792.0MB) ##老年代容量
   used     = 30847928 (29.41887664794922MB) ##老年代已使用容量
   free     = 1848200264 (1762.5811233520508MB) ##老年代剩余容量
   1.6416783843721663% used ##老年代使用比例
Perm Generation: ##永久代使用情况
   capacity = 134217728 (128.0MB) ##perm区容量
   used     = 47303016 (45.111671447753906MB) ##perm区已使用容量
   free     = 86914712 (82.8883285522461MB) ##perm区剩余容量
   35.24349331855774% used ##perm区使用比例

4)-histo[:live]打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. 

jmap -histo:live 19104

 将文件输出到a.log中

jmap -histo:live 19104 >a.log

5.jstack命令

        java虚拟机自带的一种堆栈跟踪工具,jstack用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

jstack 19104

打印出线程信息:

jstack -l 19104

打印出带锁信息:

可视化工具

1.jconsole命令

        jconsole弹出对话框出来选择哪个进程

        可以查看堆内存,线程,类,CPU,JVM等信息

2.visualvm命令

         对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析

 

 

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会飞的IT蜗牛

更美口味,打赏人生

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

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

打赏作者

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

抵扣说明:

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

余额充值