1. JVM参数
官网: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
怎么查看有没有启用jvm相关命令呢
jps -l //查看进程
jinfo -flag UseTLAB 16268
设置JVM
- 开发工具,例如idea
- java -jar -XX:InitialHeapSize = 100M xx.jar
- 比如一些中间件中是可以配置文件的
tomcat、dubbo rocktmq
2. JVM命令
- jps -l 查看当前的进程
- jinfo 查看某一个参数最基本的用法 ,例如 -flag 参数名 进程。还可以进行修改,例如
jinfo -flag InitialHeapSize=1024*1024*100 16268
这个修改值有一个前提条件,就是这个参数是可修改的
也就是标记为manageable的参数可以修改
- jstack
- 排查死锁:
jps -l //获取程序进程id
jstack 进程数
- jmap
查看堆内存
jmp -heap 进程号
会发现当前的Eden、S0、S1的大小不是设定号的比例,-XX:-UseAdaptiveSizePlicy 禁用了也没用,因为jvm中的垃圾回收器会根据当前业务代码的对象大小,动态调整Eden、S0和S1的大小。
如果想自己调整
(1)Eden区大一些,因为有很多对象需要创建
(2)Eden区小一些,因为S区需要更多的空间,没有回收掉,也没有到达
但是你不调整,虚拟机也会自己调优。
jmap -dump:file=heap.hprof 进程号
jhat eap.hprof
会给出一个端口
在游览器上,输入localhost:端口号,就会显示
3. 工具
除了jdk自己带的视图化工具外,还可以用arthas,在生产环境中,可以监视。
通用型工具:
jconsole
jvisualvm
arthas
就是内存基本情况、线程情况、垃圾收集情况都可以看到
3.1. 内存分析的专业工具
- MAT ,基于dump下来的问题进行分析 heap.hprof,可以看到哪些对象占用空间比较大、哪些占用空间比较小
- 在线访问工具heaphero.io,也就基于dump文件分析
- console.perfma.com
3.2. 垃圾收集的专业工具
垃圾收集一定也有日志文件,而且不同的收集器会有不同类型文件
那怎么获取日志文件呢,可以用-XX:-PrintGC打印出日志内容,在线网站
//比如启用G1
-XX:+UseG1GC
//打印日志
-XX:PrintGC
//打印日志详情
-XX:PrintGCDetails
//保存日志在哪里
-Xloggc: D:\gq-gc.log (文件地址)
3.2.1. gcview.jar
//是一个jar包,可以本地启动
java -jar gcviewer-1.36-SNAPHOT.jar
重点看的是
吞吐量 - Throughput 96.33% 吞吐量越高越好
停顿时间
平均停顿时间 Avg Pause
GC次数: