zoukankan      html  css  js  c++  java
  • 小试JVM工具

    一、前言

    工欲善其事必先利其器,jdk自带了很多工具,利用好这些工具能够帮我们获取想要的数据(运行日志、异常堆栈、GC日志、线程快照、堆转储快照等),从而快速的分析数据、定位问题。

    二、jps:虚拟机进程状况工具

    jps命令不光名字像Linux中的ps命令,功能也很类似,可以直接找到Java进程的ID(之前一直用的 ps aux | grep "关键字" 来查或许该改改了
    jps命令格式:
    jps [options] [hostid]
    样例:

    root@ship:/home/apps# jps -v -l
    6485 sun.tools.jps.Jps -Dapplication.home=/usr/local/jdk1.8.0_161 -Xms8m
    6297 alipay-demo-1.0.jar -Xms20M -Xmx40M
    
    

    -l 可以输出主类的全名,如果进程执行的是Jar包则输出Jar包路径
    -v 输出启动时JVM参数

    三、jstat:虚拟机统计信息监视工具

    jstat是用于监视虚拟机各种运行状态信息的命令行工具,它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
    jstat命令格式:
    jstat [option vmid [interval [s|ms] [count] ] ]
    样例:
    jstat -gc 6297 250 20
    这表示每250毫秒查询一次进程6297的垃圾收集情况,一共查询20次。
    enter description here
    其他命令不做过多介绍。

    四、jinfo:Java配置信息工具

    jinfo的作用是实时的查看和调整虚拟机的各项参数,虽然jsp -v命令也可以看到JVM参数但是未被指定的默认参数无法查看。
    jinfo命令格式:
    jinfo [option] pid
    样例:
    jinfo -sysprops 6297 会把虚拟机进程System.getProperties()的内存打印出来。
    jinfo 6297 不指定选项会打印所有的内容

    五、jmap:Java内存映像工具

    jmap命令用于生成堆转储快照(dump文件),除了这种方式还是可以在启动时添加 -XX:+HeapDumpOnOutOfMemoryError参数,让虚拟机出现OOM异常时自动生成dump文件。
    除了获取dump文件,该命令还可以查询finalize执行队列、Java堆和永久代的详细信息等。
    jmap命令格式:
    jmap [option] vmid
    样例:

    root@ship:/home/apps# jmap -dump:live,format=b,file=alipay.bin 12507
    Dumping heap to /home/apps/alipay.bin ...
    Heap dump file created
    
    

    jmap -heap 12507 显示Java堆的详细信息

    六、jhat:虚拟机堆转储快照分析工具

    jhat可以用来分析jmap生成的堆转储快照,分析完成后可以在游览器中查看,不过这个功能比较鸡肋,有好几个更专业更强大的工具,比如Eclipse Memory Analyzer、IBM HeapAnalyzer等。
    使用方法:
    enter description here
    然后在游览器输入http://ip:7000/就可以看到分析结果,如图。
    enter description here

    七、jstack:Java堆栈跟踪工具

    jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条进程正在执行的方法堆栈的集合,生成线程快照的主要是目的是定位线程出现长时间停顿的原因,比如线程死锁、死循环、请求外部资源长时间得不到响应等。之前遇到CPU使用率过高的问题,就使用了这个命令排查的,参考博客https://www.cnblogs.com/pangguoping/p/5715848.html
    jstack命令格式:
    jstack [option] vmid
    样例:
    enter description here
    每个线程都有这个选项Locked ownable synchronizers,这是个什么呢?官方定义如下

    一个可持有的同步器多半是线程独有并且使用了AbstractOwnableSynchronizer(或是其子类)去实现它的同步特性,ReentrantLock与ReentrantReadWriteLock就是JAVA平台提供的两个例子。

    真的要好好研究下死锁时它的堆栈信息了。

    八、JConsole

    JConsole是一个功能强大的可视化工具,可以监控本地和远程服务器虚拟机。

    1.启动JConsole

    双击JDK/bin目录的jconsole.exe即可启动,如图。
    enter description here
    连接本地虚拟机比较简单,直接选就可以了,下面先说怎么连接远程虚拟机?
    实现对springboot jar包的远程监控方法:
    1.添加启动参数
    nohup java
    -Djava.rmi.server.hostname=198.13.40.234
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=1099
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false

    -jar alipay-demo-1.0.jar >/dev/null 2>&1 &
    2.如果觉得这样太麻烦,也可以定义系统环境变量来表示,在/etc/profile文件添加如下内容。
    export JAVA_OPTS="-Djava.rmi.server.hostname=198.13.40.234 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
    然后使用命令source /etc/profile刷新配置
    最后运行这个脚本启动nohup java $JAVA_OPTS -jar alipay-demo-1.0.jar >/dev/null 2>&1 &
    3.输入地址,用户名,密码等信息即可登陆。
    enter description here
    enter description here
    jvisualvm的连接方法也类似。

    九、VisualVM:多合一故障处理工具

    VisualVM是目前为止功能最强大的运行监视和故障处理程序。
    VisualVM具备插件扩展功能,通过插件扩展可以做到:

    1. 显示虚拟机以及进程的配置、环境信息(jps、jinfo)
    2. 监视应用的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
    3. dump以及分析堆转储快照(jmap、jhat)
    4. 离线程序快照
  • 相关阅读:
    第八周总结和实验六
    第七周总结与实验五
    遍历目录中的所有文件和目录,并生成全路径
    python watchdog
    Offer_answer_with_SDP_rfc3264
    [转]UML八大误解
    leetcode周赛220
    Codeforces Round #690 (Div. 3)
    学习资料
    鱼眼图与六面图转换(python)
  • 原文地址:https://www.cnblogs.com/2YSP/p/10633403.html
Copyright © 2011-2022 走看看