1. jps
#查看
jps -mlVv
2. 高CPU使用率分析
2.1. 线程死锁
- 使用 jstack -p
<pid>
> jstack1.txt 将当前的jvm执行栈打印 - 搜索 block状态的线程
- 看被阻塞的线程是因为什么哪个锁被占用,造成的阻塞
2.2. alibaba arthas
#top 命令分析,是否高CPU使用率、负载率,但是CPU空闲时间长
#安装arthas
thread 查询有多少线程,及其CPU使用率
thread -n [tid] >> [filename] 将某个线程的执行方法栈及CPU状态字输出到某个文件
thread -b 查看BLOCKED状态的线程
- 参考 https://www-jianshu-com/p/3ba1e933682b
2.3. top命令结合 jstack
#命令分析,是否高CPU使用率、负载率,但是CPU空闲时间长
top
#查询pid中的线程
top -Hp <pid>
#把线程id转为16进制
printf "%x\n" <tid>
#将此时的jvm快照打印到指定txt文件
jstack -l <pid> >> -/jstack_result-txt
#可以结合 | grep 来检索不同状态的线程
#在txt文件中搜索16进制的线程id
- https://www-cnblogs-com/fengweiweicoder/p/10992043-html
3. 高内存分析
3.1. jmap 文件下载
#打印出jvm进程堆使用情况
jmap -heap <pid>
#下载快照到文件
jmap -dump:file=filename-dump <pid>
jmap -dump:format=b,file=heapdump.phrof <pid>
#使用jhat命令
jhat -port 9998 filename-dump
- 在windows可以使用jvisualvm-exe命令,加载文件分析
- 使用jhat
- 使用eclipse MAT
3.2. 内存对象统计与排序
jmap -histo <pid> | grep <class full path> | sort -n -k 3 | head -17
排序出目前容量最大的一些类,-k 2是根据第2列排序,就是数据最大的
num #instances #bytes class name
1: 4632416 392305928 [C
2: 6509258 208296256 java-util-HashMap$Node
3: 4615599 110774376 java-lang-String
5: 16856 68812488 [B
6: 278914 67329632 [Ljava-util-HashMap$Node;
7: 1297968 62302464
4. JvmGC
4.1. gc查看
#查看帮助
jstat -help
#查看统计的可选项
jstat -option
#使用jstat命令查看gc情况 每5秒一次,统计20次,每5行显示一个表头
jstat -gcutil -h5 <pid> 5000 20
#使用jstat命令查看gc情况 每5秒一次,统计20次,每5行显示一个表头
jstat -gc -h5 <pid> 5000 20
S0C: 当前幸存者区0的容量 (kB)
S1C: 当前幸存者区1的容量(kB)
S0U: 幸存者区0已用内存 (kB)
S1U: 幸存者区1已用内存 (kB)
EC: 伊甸园区容量 (kB)
EU: 伊甸园区已用内存 (kB)
OC: 当前老旧区容量 (kB)
OU: 老旧区已用内存 (kB)
MC: 元数据区容量 (kB)
MU: 元数据区已用内存 (kB)
CCSC: 类压缩区容量 (kB)
CCSU: 类压缩区已用内存 (kB)
YGC: 新生垃圾回收事件数量
YGCT: 新生垃圾回收时间
FGC: 垃圾回收事件总和
FGCT: 完整的一次垃圾回收时间
GCT: 所有的垃圾回收时间
#查看到GC的内存占用情况
jstat -gccapbility
- 参考 https://zhuanlan-zhihu-com/p/481206194
4.2. Jvm启动参数-GC日志打印
#必备
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintTenuringDistribution
-XX:+PrintHeapAtGC
-XX:+PrintReferenceGC
-XX:+PrintGCApplicationStoppedTime
#可选
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
#GC日志输出的文件路径
-Xloggc:/path/to/gc-%t-log
#开启日志文件分割
-XX:+UseGCLogFileRotation
#最多分割几个文件,超过之后从头文件开始写
-XX:NumberOfGCLogFiles=14
#每个文件上限大小,超过就触发分割
-XX:GCLogFileSize=100M
- https://segmentfault-com/a/1190000039806436
4.3. javap 反编译代码
通过以下命令来反编译出一个Class文件字节码
javap -verbose -p Main-class
4.4. G1配置
- https://zhuanlan-zhihu-com/p/83804324
5. jvm启动获取参数
- 系统主机中的参数
System.getProperty()
- jvm 进程启动时参数
java -d
- main 函数中获取
String [] args