1. -Xmx -Xms
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
查看运行时参数的值:
ps -ef | grep tomcat (获得进程号)
jinfo -flag MaxHeapSize 进程id
显示结果:-XX:MaxHeapSize=268435456
2. PrintFlagsFinal
3. jps
4.jinfo
怎样查看一个正在运行的jvm中的一些参数的值?
jinfo -flag MaxHeapSize 进程id
更多可查询官方文档
5.jstat
查看垃圾回收的信息:jstat -gc 进程id 1000 10,打印S0C S1C S0U S1U EU OC OU...等区域的大小,最后的1000 10表示每秒打印一次,一共打印10次。
6. 如何导出内存印象文件
1)内存溢出自动导出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
2)使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof 进程id ,导出内存印象文件到当前路径下,文件名称是heap.hprof
jmap -heap 查看heap中每一块区域的使用情况
7. MAT分析内存溢出
1)分析程序中每个对象的数量
2)分析程序中每个对象所占的空间
两个功能基本就可以排查出内存溢出
8. jstack实战死循环与死锁
cpu飙高的排查方法:
1) jstack 进程id > 进程id.txt,jstack打印出tomcat中所有线程的信息,可以帮助排查CPU突然飙高的问题
2)top查看占用cpu最高的进程或者tomcat所在的进程,然后jstack导出该进程中的所有线程
3)top -p 进程id -H ,打印这个进程中的所有线程,然后找到占cpu很高的线程id,这里打印出的线程ID是十进制的,而jstack打印出的线程id是十六进制的,所以需要将十进制的id转换成十六进制的,以便在导出的线程文件中找到对应的线程信息。可以用“printf "%x" 十进制进程id”转换。
4)在jstack导出的文件中查找对应的线程,查看线程执行的堆栈信息,定位问题
死锁问题排查:
首先jstack导出tomcat中的线程信息,然后拉到最底下,如果有死锁,会显示在该文件的末尾
9. 监控java进程——jvisualvm
1)监控本地java进程
在本地java安装目录下启动D:\Install\Java1.8\jdk1.8.0_181\bin\jvisualvm.exe,在启动的图形化界面中即可监控本地java进程。界面中展示的信息类似MAT,jstack这些命令行实现的功能,但没有MAT的功能强大。
2)监控远程java进程,通过JMX连接
第一步:启动项目,启动参数参考连接https://www.jianshu.com/p/923580d3a5a2
第二步:在jvisualvm的图形化界面中添加远程主机,添加完以后,右击添加JMX连接。
https://visualvm.github.io/这个地址有visualvm的document,具体可在这里查询