JVM基础

 · 2021-6-29 · 次阅读


JDK 内置命令行工具

jvm命令行工具

image-20210622214101055

image-20210622214303830

JPS:

  1. 在Linux系统或Mac上,无法看到全局所有的Java进程(需要使用sudo切换到root用户查看)
  2. 只能看到JPS当前版本运行的Java进程

jstat-查看JVM内部堆内存使用情况

jstat -gcutil -t pid 1000 1000
//查看对应pid的Java进程的GC情况
TimeStamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
663.0 0.00 99.93 6.32 23.92 94.75 93.16 11 0.118 3 0.226 0.344

-t选项的位置是固定的,不能在前也不能在后,可以看出是用于显示时间戳,即对应的JVM线程启动到现在的秒数

  • TimeStamp JVM启动的时间,大约10分钟
  • S0 0号存活区的百分比使用率,0%代表当前空置的存活区为S0
  • S11号存活区的百分比使用率
  • E Eden区,新生代的百分比使用率
  • O Old区,老年代百分比使用率
  • M Meta区,元数据区百分比使用率
  • CCS 压缩class空间(Compressed class space)的百分比使用率
  • YGC Young GC的次数,11次
  • YGCT Young GC的总时间,0.118秒,占用总运行时间不多,可以忽略
  • FGC FullGc的次数,只发生了3次,问题不大
  • FGCT FullGc的时间,平均每次80ms左右,考虑优化
  • GCT 所有GC加起来消耗的总时间,即YGCT + FGCT
jstat -gc -t pid 1000 1000
//查看对应pid的Java进程的GC情况
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
26624.0 21504.0 0.0 21489.8 438784.0 18726.5 163840.0 39192.5 77056.0 73010.4 10752.0 10017.1 11 0.118 3 0.226 0.344

-t选项的位置是固定的,不能在前也不能在后,可以看出是用于显示时间戳,即对应的JVM线程启动到现在的秒数

  • TimeStamp JVM启动的时间,大约10分钟
  • S0C 0号存活区的总空间,单位kb
  • S0U 0号存活区已使用的内存大小
  • S1C1号存活区的总空间,单位kb
  • S1U1号存活区已使用的内存大小
  • EC Eden区,新生代的总空间,单位kb
  • EU Eden区,新生代已使用的内存大小
  • OC Old区,老年代的总空间,单位kb
  • OU Old区,老年代已使用的内存大小
  • MC Meta区,元数据区的总空间,单位kb
  • MU Meta区,元数据区已使用的内存大小
  • CCSC 压缩class空间(Compressed class space)的总空间,单位kb
  • CCSU 压缩class空间(Compressed class space)已使用的内存大小

YGC YGCT FGC FGCT GCT等信息与-gcutil中相同,不再赘述

jmap *

# 打印堆内存(/内存池)的配置和使用信息
jmap -heap pid
#查看哪些类占用的空间最多,直方图
jmap -histo pid
#Dump堆内存快照
jmap -dump:format=b,file=3826.hprof=3826

jstack

#
jstack -l pid
  • -F 强制执行 thread dump,可在 Java 进程卡死

    (hung 住)时使用,此选项可能需要系统权限。

  • -m混合模式(mixed mode),将 Java 帧和

    native 帧一起输出,此选项可能需要系统权限。

  • -l 长列表模式,将线程相关的 locks 信息一起输

    出,比如持有的锁,等待的锁。

jcmd

jcmd 综合了前面的几个命令

示例:

# 查看jvm版本
jcmd pid VM.version
# 
jcmd pid VM.flags
#
jcmd pid VM.command_line
#
jcmd pid VM.system_properties
# 查看线程相关信息
jcmd pid Thread.print
# 查看gc信息,相当于 jmap -histo pid
jcmd pid GC.class_histogram
#
jcmd pid GC.heap_info

jrunscript/jjs

  • jrunscript:执行js代码,或者js文件
  • jjs:开启js的shell进程

JDK 相关图形化工具

GC的背景与一般原理

串行GC、并行GC(Serial GC、Paraller GC)

CMS GC 、G1 GC

ZGC