# Jdk VisualVM使用线程 dump 制作分析
Posted 爱码代码的喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# Jdk VisualVM使用线程 dump 制作分析相关的知识,希望对你有一定的参考价值。
Jdk VisualVM使用、线程 dump 制作分析
代码异常监控
- 应用代码在面对线上各种请求时,经常会发生死锁,
OOM
等问题。这个时候我们如何去查看呢? 如果我们不想连上远程服务器,通过本地的一些可视化工具连接远程程序,查看远程程序的线程,CPU
,GC
,堆内存等使用情况。
制作dump文件
- 线程
dump
的目的是转存线程快照。快照中是当前JVM
所有线程正在执行方法的堆栈信息 - 通过线程
dump
来分析定位线程出现长时间停顿的原因,如线程死锁、线程死循环、线程请求外部资源长时间等待等。
JVM启动命令增加参数
-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命令直接生成
- 命令
jmap -dump:format=b,file=serviceDump.dump 55572
小结
- 由于第一种方式是一种事后方式,需要等待当前
JVM
出现问题后才能生成dmp
文件,实时性不高,第二种方式在执行时,JVM
是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。
分析dump文件
Java VisualVM 分析dump
jvisualvm
可以监控本地、远程的java
进程,实时查看进程的cpu
、堆、线程等参数,对java
进程生成dump
文件,并对dump
文件进行分析。
load
已经制作好的线程dump
,点击错误链接会自己跳转到错误详情界面
- 点击选择类分析对象实例:
JVisualVM远程监控
JMX
- 通过
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
的使用情况内存占用情况
Jstat
JVM jstat Daemon
:守护进程,一个RMI
服务器程序,用于监控本地所有JVM从创建开始直到销毁整个过程中的资源使用情况,同时提供接口给监控工具(如这里的VisualVM
),让工具能连接到本机所有的JVM
。
配置启动 Jstat
- 新建
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连接与JStatD连接的区别
JMX
:使用JMX
需要远程JVM
在启动的时候开启远程访问支持,设定JMX
端口等,每一个JMX
连接一个远程JVM
。JStatD
:使用jstatd
连接方式时,需要在远程主机上创建安全策略文件然后启动jstatd
进程,并且此进程需要一直保持运行状态,客户端可以看到远程主机上当前用户的所有JVM
的信息,即只要创建一个jstatd
连接。
Jdk自带分析堆栈的命令
- 查看整个
JVM
的状态:jmap -heap [pid]
- 查看JVM堆中对象详细占用情况:
jmap -histo [pid]
- 查看进程的所有堆栈信息:
jstack [pid]
- 导出进程的所有堆栈信息:
jstack [pid] > jstack_17090.log
以上是关于# Jdk VisualVM使用线程 dump 制作分析的主要内容,如果未能解决你的问题,请参考以下文章