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


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

    代码异常监控

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

    制作dump文件

    • 线程dump的目的是转存线程快照。快照中是当前JVM所有线程正在执行方法的堆栈信息
    • 通过线程dump来分析定位线程出现长时间停顿的原因,如线程死锁、线程死循环、线程请求外部资源长时间等待等。

    JVM启动命令增加参数

    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=./
    
    • 1
    • 2
    • 当应用抛出OutOfMemoryError时生成dump文件。

    • Idea 启动服务的时候添加 JVM参数
      请添加图片描述

    • 模拟堆溢出代码,可以添加jvm堆大小参数

    /**
         * 模拟堆溢出
         */
    @Override
    public void testTwo() {
        String name = "hello";
        for (int i = 0; i < 10000000; i++) {
            name += name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    用jmap命令直接生成

    • 命令
    jmap -dump:format=b,file=serviceDump.dump 55572
    
    • 1

    小结

    • 由于第一种方式是一种事后方式,需要等待当前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
    
    • 1
    • 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; 
    };
    
    • 1
    • 2
    • 3
    • 启动 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
    
    • 1
    • 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
  • 相关阅读:
    为什么选择Codigger静态分析?
    【Linux开发实用篇】Webmin和宝塔
    5G之ULCL
    云原生Service Mesh服务网格简单介绍
    OpenOFDM接收端信号处理流程
    动态规划-矩阵连乘
    C++编译底层
    用例图包含关系、扩展关系、泛化关系解析(最全总结,非常详细)
    月报总结|Moonbeam 9月份大事一览
    【手撕STL】AVL树
  • 原文地址:https://blog.csdn.net/qq_37248504/article/details/125460410