默认使用的是mixed mode
用的不多, 只需要做了解, 用的比较多的是XX参数
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
使用示例: java -XX:+PrintFlagsFinal -version
这里查看的仅仅是调用java命令的当前进程的配置值, 后续会使用jinfo查看启动后的进程的参数配置
可以根据网站查询具体的jps使用方法:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html#CHDCGECD
包含JVM命令的所有使用方法: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html
jps
jps -l
查看最大内存:
jinfo -flag MaxHeapSize
查看垃圾回收器:
jinfo -flag UseConcMarkSweepGCjinfo -flag UseG1GC jinfo -flag UseParallelGC
可以看出使用的是并行回收的垃圾回收器
命令格式:
options :
# 1000 输出间隔1000ms 10 表示输出总次数为10次 jstat -class1000 10
-gc , -gutil , -gccause , -gcnew , -gcold
所有的输出含义都可以在上文中提到的网站中进行查询
JVM内存结构:
-compiler , -printcompilation
# dump出运行程序的堆状态, 以二进制文件格式保存到当前命令路径下的heap.hprof jmap -dump:format=b,file=heap.hprof 48954
双击文件直接在IDEA中就可以直接查看分析结果:
测试com.imooc.monitor_tuning.chapter2.MemoryController#heap
idea程序启动运行参数:
-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./data
请求: http://localhost:8080/heap
使用mat查看:提示可能内存溢出的是某个controller
查看GC Roots, 排除弱引用,软引用等,只看强引用
分析得知: Tomcat的thread引用了一个MemoryController, MemoryController引用了一个UserList, list里面是所有的User对象
一般CPU飙升很有可能就是死循环之类, 这时候就需要定位哪个线程出了问题
其中,pid 表示进程 ID,executable 表示 Java 可执行文件,core 表示核心转储文件,remote-hostname-or-IP 表示远程调试服务器主机名或 IP 地址,server-id 是可选的唯一 ID,用于在同一远程主机上运行多个调试服务器时进行区分。jps 命令可以用于获取在计算机上运行的 Java 进程列表,jsadebugd 命令可以用于启动远程调试服务器。
简单实用:
# 指定pid简单输出分析一下 jstack 61091 > data/61091.txt
线程生命周期和状态:
具体可以参考: JAVA线程状态及状态间转换介绍 | 盖娅计划
打包程序为jar包到远程服务器进行运行
上传服务器:
# 需要改为你自己的服务器用户和ip地址 scp target/monitor_tuning-0.0.1-SNAPSHOT.jar root@172.16.237.144:/root/
登录服务器,然后启动服务:
java -jar monitor_tuning-0.0.1-SNAPSHOT.jar
浏览器访问: http://172.16.237.144:8080/loop , 可以多开几个窗口访问
再开一个服务端的端口进行查看负载和进程:
打印stack信息:
jstack 36850 > 36850.txt
查看对应的进程的线程信息:
# 用于查看进程 36850 的线程信息。具体来说,-p 选项指定要查看的进程 ID,-H 选项表示显示线程层次结构。 top -p 36850 -H
由于Stack的信息是16进制,所以需要打印一下:
printf "%x" 36870
得到对应的16进制的线程id为9006, 然后打开前面的打印的栈信息进行查看,
这里可以下载下来用一些软件查看,不建议使用vim直接在线上环境打开 36850.txt,这里只是测试这样查看
vim 36850.txt ## /9006 即可找到
定位到是com.imooc.monitor_tuning.chapter2.CpuController.getPartneridsFromJson 这个方法导致CPU升高, 最后检查代码进行修复
浏览器访问: http://172.16.237.144:8080/deadlock
jps
查看程序的java进程:
同样适用jstack打印栈信息:
jstack 37143 > 37143.txt vim 37143.txt
翻到文件末尾, 可以发现死锁的两个线程信息和对应的方法名