# Jdk VisualVM使用线程 dump 制作分析

Posted 爱码代码的喵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# Jdk VisualVM使用线程 dump 制作分析相关的知识,希望对你有一定的参考价值。

Jdk VisualVM使用、线程 dump 制作分析

代码异常监控

  • 应用代码在面对线上各种请求时,经常会发生死锁,OOM等问题。这个时候我们如何去查看呢? 如果我们不想连上远程服务器,通过本地的一些可视化工具连接远程程序,查看远程程序的线程,CPUGC,堆内存等使用情况。

制作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的信息
  • 资源监控页面:显示GcCpu的情况、展示堆、线程类的相关信息
  • 线程展示页面:记录活跃线程、结束等线程
  • 取样器页面: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 制作分析的主要内容,如果未能解决你的问题,请参考以下文章

使用VisualVM远程监控JVM Linux服务器配置方法

如何使用jvisualvm进行cpu或内存抽样

jvisualvm是啥

010-JDK可视化监控工具-VisualVM

VisualVM导入dump提示“不是有效的核心dump”

VisualVM导入dump提示“不是有效的核心dump”