JVM调优工具jps、jstat、jinfo、jmap、jstack、jvisualvm、top

JVM调优工具jps、jstat、jinfo、jmap、jstack、jvisualvm、top,第1张

1、jps

jps(全称:Java Virtual Machine Process Status Tool)是 java 提供的一个用来显示当前所有 java 进程的 pid 的命令。

  • jps:查看java 进程id
  • jps -v:查看虚拟机启动时的参数列表
2、jstat

JVM 统计监测工具

  • 垃圾回收统计:jstat -gc pid 可以评估程序内存使用及GC压力整体情况,常用
  • jstat -gc pid 1000 10:每间隔1000毫秒执行一次,一共执行10次jstat -gc pid
    • S0C:第一个Survivor的大小,单位KB
    • S1C:第二个Survivor的大小
    • S0U:第一个Survivor的使用大小
    • S1U:第二个Survivor的使用大小
    • EC:Eden区的大小
    • EU:Eden区的使用大小
    • OC:老年代大小
    • OU:老年代使用大小
    • MC:方法区大小(元空间)
    • MU:方法区使用大小
    • CCSC:压缩类空间大小
    • CCSU:压缩类空间使用大小
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收消耗时间,单位s
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间,单位s
    • GCT:垃圾回收消耗总时间,单位s
  • 堆内存统计:jstat -gccapacity 11711 堆内存统计
    • NGCMN:新生代最小容量
    • NGCMX:新生代最大容量
    • NGC:当前新生代容量
    • S0C:第一个Survivor大小
    • S1C:第二个Survivor的大小
    • EC:Eden区的大小
    • OGCMN:老年代最小容量
    • OGCMX:老年代最大容量
    • OGC:当前老年代大小
    • OC:当前老年代大小
    • MCMN:最小元数据容量
    • MCMX:最大元数据容量
    • MC:当前元数据空间大小
    • CCSMN:最小压缩类空间大小
    • CCSMX:最大压缩类空间大小
    • CCSC:当前压缩类空间大小
    • YGC:年轻代gc次数
    • FGC:老年代GC次数
  • 新生代垃圾回收统计:jstat -gcnew 11711
    • S0C:第一个Survivor的大小
    • S1C:第二个Survivor的大小
    • S0U:第一个Survivor的使用大小
    • S1U:第二个Survivor的使用大小
    • TT:对象在新生代存活的次数
    • MTT:对象在新生代存活的最大次数
    • DSS:期望的幸存区大小
    • EC:Eden区的大小
    • EU:Eden区的使用大小
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收消耗时间
  • 新生代内存统计:jstat -gcnewcapacity 11711
    • NGCMN:新生代最小容量
    • NGCMX:新生代最大容量
    • NGC:当前新生代容量
    • S0CMX:最大Survivor1区大小
    • S0C:当前Survivor1区大小
    • S1CMX:最大Survivor2区大小
    • S1C:当前Survivor2区大小
    • ECMX:最大Eden区大小
    • EC:当前Eden区大小
    • YGC:年轻代垃圾回收次数
    • FGC:老年代回收次数
  • 老年代垃圾回收统计:jstat -gcold 11711
    • MC:方法区大小
    • MU:方法区使用大小
    • CCSC:压缩类空间大小
    • CCSU:压缩类空间使用大小
    • OC:老年代大小
    • OU:老年代使用大小
    • YGC:年轻代垃圾回收次数
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间
  • 老年代内存统计:jstat -gcoldcapacity 11711
    • OGCMN:老年代最小容量
    • OGCMX:老年代最大容量
    • OGC:当前老年代大小
    • OC:老年代大小
    • YGC:年轻代垃圾回收次数
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间
  • 元数据空间统计:jstat -gcmetacapacity 11711
    • MCMN:最小元数据容量
    • MCMX:最大元数据容量
    • MC:当前元数据空间大小
    • CCSMN:最小压缩类空间大小
    • CCSMX:最大压缩类空间大小
    • CCSC:当前压缩类空间大小
    • YGC:年轻代垃圾回收次数
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间
  • 展示gc概要信息:jstat -gcutil 11711
    • S0:Survivor1区当前使用比例
    • S1:Survivor2区当前使用比例
    • E:Eden区使用比例
    • O:老年代使用比例
    • M:元数据区使用比例
    • CCS:压缩使用比例
    • YGC:年轻代垃圾回收次数
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间
  • 展示类加载信息jstat -class 11711
    • Loaded:加载的class数量
    • Bytes:加载的class类大小, 单位KB
    • Unloaded:未加载的class数量
    • Bytes:未加载的class类大小, 单位KB
3、jinfo

查看正在运行的Java应用程序的扩展参数

  • 查看jvm的参数:jinfo -flags 11711
    - 查看java系统参数:jinfo -sysprops 11711
4、jmap

生成堆转储快照,可以用于查看堆内存信息,实例个数以及占用内存大小

  • 查看历史生成的实例:jmap -histo 11711
  • 查看当前存活的实例,执行过程中可能会触发一次full gc:jmap -histo:live 11711,建议执行时可以输出到文本中,jmap -histo 11711 > jmapHisto.txt
    • num:序号
    • instances:实例数量
    • bytes:占用空间大小
    • class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
  • 堆信息:jamp -heap 11711
Heap Configuration:
   MinHeapFreeRatio = ##在堆的使用率小于40%的时候进行收缩,当Xmx=Xms的时候此配置无效
   MaxHeapFreeRatio = ##在堆使用率大于70%的时候进行扩展,当Xmx=Xms的时候此配置无效
   MaxHeapSize      = ##堆的最大空间
   NewSize          = ##新生代的大小
   MaxNewSize       = ##最大的新生代的大小
   OldSize          = ##老年代的大小
   NewRatio         = ##新生代中Eden和和Survivor区的比例为 8:1:1
   SurvivorRatio    = 
   MetaspaceSize    = ##元空间的大小
   G1HeapRegionSize = 0 (0.0MB) ##使用G1垃圾收集的区间
  • 堆内存dump到当前目录jmap.hprof文件下:jmap -dump:format=b,file=jmap.hprof 11711
    • 也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
      -XX:+HeapDumpOnOutOfMemoryError
      -XX:HeapDumpPath=./ (路径)
5、jstack

虚拟机生成当前线程的快照,用户分析线程出现长时间卡顿的原因,如线程之间死锁,死循环,请求外部资源导致线程长时间等待等问题

  • “Thread-1” 线程名
  • prio=5 优先级=5
  • tid=0x000000001fa9e000 线程id
  • nid=0x2d64 线程对应的本地线程标识nid
  • java.lang.Thread.State: 线程状态
6、jvisualvm

7、top

使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如11711

按H,获取每个线程的内存情况

如果java启动后发现cpu居高不下或者异常,找到内存和cpu占用最高的线程tid,比如19664

转为十六进制得到 0x4cd0,此为线程id的十六进制表示

执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法

查看对应的堆栈信息找出可能存在问题的代码

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/872276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存