一、前言

工欲善其事必先利其器,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次。

其他命令不做过多介绍。

四、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等。
使用方法:

然后在游览器输入http://ip:7000/就可以看到分析结果,如图。

七、jstack:Java堆栈跟踪工具

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

每个线程都有这个选项Locked ownable synchronizers,这是个什么呢?官方定义如下

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

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

八、JConsole

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

1.启动JConsole

双击JDK/bin目录的jconsole.exe即可启动,如图。

连接本地虚拟机比较简单,直接选就可以了,下面先说怎么连接远程虚拟机?
实现对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.输入地址,用户名,密码等信息即可登陆。


jvisualvm的连接方法也类似。

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

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

  1. 显示虚拟机以及进程的配置、环境信息(jps、jinfo)
  2. 监视应用的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
  3. dump以及分析堆转储快照(jmap、jhat)
  4. 离线程序快照

小试JVM工具的更多相关文章

  1. Linux ---> 监控JVM工具

    Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(J ...

  2. jvm工具

    jvm工具 知识,经验是基础,数据是依据,工具是运营知识处理数据的手段 数据:运行日志.异常堆栈.GC日志.线程快照.堆转存储快照 JPS:虚拟机进程状况工具 jvm process status t ...

  3. 【原创】大叔经验分享(71)docker容器中使用jvm工具

    java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...

  4. jvm工具及命令大全

      虚拟机栈 栈桢大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k 堆 -Xms:堆的最小值: -Xmx:堆的最大值: -Xmn:新生代的大小: -XX:NewSize:新生代最小值: ...

  5. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具

    1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...

  6. 【深入JVM】JVM工具之JMAP

    一.工具介绍 假设把java\bin文件夹配置到环境变量.在cmd输入jmap会有例如以下提示: 翻译:打印出某个java进程(使用pid)内存内的,全部'对象'的情况(如:产生那些对象,及其数量). ...

  7. JVM工具使用和Linux-top命令解析

    top 命令 top 命令查看现在线程占用资料的情况. 第三行,cpu状态信息,具体属性说明如下: us — 用户空间占用CPU的百分比.(重要) sy — 内核空间占用CPU的百分比. ni — 改 ...

  8. [JVM工具(1)] 堆栈检查利器jstat的使用

    jstat 可以检查 JVM 整体的运行情况,可以看到 新生代,老年代等的内存使用情况,以及GC 次数和耗时 命令格式 如 jstat -<option> [-t] [-h<line ...

  9. jvm工具的使用

    打开Java VisualVm->工具->插件  如图: 关于要填写的URL地址到 http://visualvm.java.net/pluginscenters.html 找到jdk版本 ...

随机推荐

  1. xcode环境变量设置(转载)

    一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径的 ...

  2. linux EXT文件系统

    将一个硬盘分区之后如何创建文件系统(windows来讲就是如何针对分区来进行格式化,是采用FAT32的文件系统来格式化,还是采用NTFS的文件系统来格式化).Linux主要采用EXT2,EXT3分区格 ...

  3. Oracle Meger into 函数

    Oracle 在 9i 引入了 merge 命令, 通过这个 merge 能够在一个SQL 语句中对一个表同时执行 inserts 和 updates 操作.Merge into 可以实现用 B 表来 ...

  4. require实现单页应用程序(SPA)

    写了一个测试代码,用require.js配合它的一个插件text.js实现了最简单的单页应用程序,简单的记录一下,方便以后复习, git地址:https://github.com/lily1010/r ...

  5. "未预编译文件 因此不能请求该文件"问题处理

    手里一个项目重新编译后发布,访问时提示未预编译文件“default.aspx”, 因此不能请求该文件.综合网上的解决方法,做了如下操作: 1.重新安装了AJAX Extension: 2.项目添加引用 ...

  6. 一套完整的前台页面增删改查以及js(easyui)

    增加页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  7. html5--3.14 lable元素和label属性

    html5--3.14 lable元素和label属性 学习要点 掌握label元素的使用 掌握label属性的使用 lable元素 用来为 input 元素定义标注(标记),建立一个与之相关联的标签 ...

  8. openssl生成公钥私钥对 加解密

    在计算机软件开发世界中,编程语言种类极多,数据在各种语言的表现形式可能有所差异,但数据本身的处理可能,或者说本质上是完全一样的:比如数据在某个算法中的运算过程是一样的.在这里,我以加密与解密来作为例子 ...

  9. NOI2017退役记

    Day1 全世界都200+我162,考场上fread和fwrite写挂了直接删了,然后就被卡了48也是没谁了. Day2 2-SAT写挂,就没有然后了. 明明退役前一直都在做自己最想做的事情,连这就是 ...

  10. react之redux增加删除数字

    比如在页面中添加和删除‘222’ action.js export const ADD= 'ADD'; export const RED='RED'; export const add=(str)=& ...