OOM等问题。这个时候我们如何去查看呢? 如果我们不想连上远程服务器,通过本地的一些可视化工具连接远程程序,查看远程程序的线程,CPU,GC,堆内存等使用情况。dump的目的是转存线程快照。快照中是当前JVM所有线程正在执行方法的堆栈信息dump来分析定位线程出现长时间停顿的原因,如线程死锁、线程死循环、线程请求外部资源长时间等待等。-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
当应用抛出OutOfMemoryError时生成dump文件。
Idea 启动服务的时候添加 JVM参数

模拟堆溢出代码,可以添加jvm堆大小参数
/**
* 模拟堆溢出
*/
@Override
public void testTwo() {
String name = "hello";
for (int i = 0; i < 10000000; i++) {
name += name;
}
}
jmap -dump:format=b,file=serviceDump.dump 55572
JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。
load已经制作好的线程dump,点击错误链接会自己跳转到错误详情界面

JMX方式监控远程linux上运行java程序,远程服务器:要求在执行java程序时,加入若干参数:java -Dcom.sun.management.jmxremote.port=40124 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.111.100 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar springboot-project-1.0.0-SNAPSHOT.jar
Remote处添加远程监控端口可以实时监控服务,概述页面可以看到Jvm配置的运行参数,Jvm的信息
Gc和Cpu的情况、展示堆、线程类的相关信息

Cpu的使用情况内存占用情况
JVM jstat Daemon:守护进程,一个RMI服务器程序,用于监控本地所有JVM从创建开始直到销毁整个过程中的资源使用情况,同时提供接口给监控工具(如这里的VisualVM),让工具能连接到本机所有的JVM。demo.policy,内容如下:grant codeBase "file:/version/java/jdk1.8.0_231/lib/tools.jar" {
permission java.security.AllPermission;
};
jsatat jstatd -J-Djava.security.policy=/ldfolder/demo/demo.policy -J-Djava.rmi.server.hostname=192.168.111.100 -p 2222 -J-Djava.rmi.server.logCalls=true
Gc过程图
JMX:使用JMX需要远程JVM在启动的时候开启远程访问支持,设定JMX端口等,每一个JMX连接一个远程JVM。JStatD:使用jstatd连接方式时,需要在远程主机上创建安全策略文件然后启动jstatd进程,并且此进程需要一直保持运行状态,客户端可以看到远程主机上当前用户的所有JVM的信息,即只要创建一个jstatd连接。JVM的状态: jmap -heap [pid]
jmap -histo [pid]
jstack [pid]jstack [pid] > jstack_17090.log