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次。

java生产环境的安装部署 java生产环境问题_内存溢出

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,具体可在这里查询