博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA程序员养成计划之JVM学习笔记(3)-JVM性能监控
阅读量:4225 次
发布时间:2019-05-26

本文共 1864 字,大约阅读时间需要 6 分钟。

本文对JVM的性能监控方法做整理。

持续更新中… …

1. JDK命令行工具

1.1. jps:虚拟机进程状况工具

  • JVM Process Status Tool, 显示系统内所有的HotSpot虚拟机进程,用于查看当前在jvm中运行的程序,包括虚拟机执行主类的名称以及进程ID。

1.2. jstat:虚拟机统计信息监视工具

  • JVM Statistics Monitoring Tool, 用于收集Hotspot虚拟机各方面的运行数据,包括类装载、内存、垃圾收集、JIT编译等运行数据。

1.3. jinfo:Java配置信息工具

  • Configuration Info for Java, 显示虚拟机配置信息。可以实时的查看和调整虚拟机各项参数,即VM参数。

1.4. jmap:Java内存映像工具

  • Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件),查看Finalizer线程执行finalize方法的对象,显示堆的详细信息(如回收器、参数配置、分代状况等),显示堆中对象的统计信息(对象数量,类数量,合计容量等)等等,不过只有存储快照可以在windows下运行。另外,还有其他的生成方法为通过VM参数-XX:+HeapDumpOnOutOfMemoryError,可以在出现OOM异常时候生成dump文件。

1.5. jhat:虚拟机堆存储快照分析工具

JVM Heap Analysis Tool,与jmap搭配使用,用于分析heapdump文件,会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果。

1.6. jstack:Java堆栈跟踪工具

Stack Trace for Java,显示虚拟机当前时刻的线程快照,也称为threaddump或javacore文件。即每一条线程正在执行的方法堆栈的集合,通过该命令一般用于检测线程长时间停顿原因,死锁,死循环,请求外部资源等待等导致线程长时间停顿的原因。

2. JDK的可视化工具

2.1. JConsole

  • 位于JDK/bin目录下,启动后可以自动搜索出本机运行的所有虚拟机进程,然后可以进行选择一个进程进行监控。
  • jconsole-新建连接

  • 这里写了个生产者消费者的代码用于测试,也就是PCTest,共有3个生产者和3个消费者,每次生产的节点都有一个byte[1024]用于占内存。连接之后,可以看到概述,然后每个页面也可以看到具体的相关信息:

jconsole-概述

  • 可以通过查看内存情况各个区的分配情况,来对vm参数进行配置调整

jconsole-内存

  • 在线程页面,也可以看到每个线程的运行情况,如运行状态,等待的锁,持有的锁等等,也可以检测死锁情况

jconsole-线程

2.2. VisualVM

  • 位于JDK/bin目录下,启动后可以自动搜索出本机运行的所有虚拟机进程,然后可以进行选择一个进程进行监控。
  • VisualVM功能和jconsole差不太多,不过提供了一个更为好看的界面,这是启动时各个进程的情况。

    VisualVM-开始

  • VisualVM提供和jconsole一样的对内存使用情况的概述,以及线程情况的概述

    VisualVM-内存情况

    VisualVM-线程情况

  • 还有其他一些功能,这里就不在赘述。

3. 其他

3.1 Eclipse Memory Analyzer

  • Eclipse Memory Analyzer与前面两者相比,提供了更为细节的分析,包括引用链的情况,各个线程、对象占据的内存等等。
  • 首先需要安装Eclipse Memory Analyzer插件,通过Eclipse的Install from site进行安装,如图所示:

    MAT安装

  • 还是用生产者消费者程序作为样例,配置好以下jvm参数:

    -Xmx10m -Xms10m -XX:+HeapDumpOnOutOfMemoryError

  • 为了更快的发生内存溢出,也将每个节点的内存设置为了1M大小,程序运行之后,很快就发生了OOM错误

    OOM

  • 从上面可以看出,内存溢出的时候,生成了堆存储快照

    Dumping heap to java_pid8056.hprof …

  • 然后在工程目录下,可以看到该堆存储快照

    堆快照

  • 直接双击打开,可以选择默认的让插件自己进行可疑内存泄露分析,根据堆的大小,在一定时间内会出结果,如下:

    堆存储快照

  • 这是堆中各个线程的使用内存的情况,在这个之下,还有插件分析的结果:

    分析结果-1

  • 通过Details信息,可以查看具体的信息

    分析结果-2

  • 这里面shallow heap代表对象本身所占的空间,retained heap代表如果把这个对象给gc了,可以收回多少空间

4.参考资料

[1]《深入理解Java虚拟机》第二版,周志明著

你可能感兴趣的文章
JupyterNotebook‘s Magic
查看>>
在Linux 上部署Jenkins和项目
查看>>
Python+requests+unittest+excel实现接口自动化测试框架
查看>>
那些年我们听过的互联网公司的套路?
查看>>
谈谈python里面那些高级函数
查看>>
40行代码带你免费看《海贼王-和之国》篇章
查看>>
搭建炫酷的服务器监控平台
查看>>
垃圾分类:人机搭配,干活不累
查看>>
ThinkPHP3.2 多个where()使用问题【已解决】
查看>>
spring-dubbo 异常统一捕获
查看>>
《系统架构》之技术债务
查看>>
办公常用工具之Typora使用教程
查看>>
关于Memory,Cache,Buffer的区别
查看>>
Python之时间处理模块time
查看>>
Hbase优化之Region分割设置的问题
查看>>
学习hadoop需要具备基础知识
查看>>
HDFS基础操作一览
查看>>
MapReduce原理
查看>>
hive总结(四)Hive中的桶
查看>>
Hive总结(五)表的基本操作
查看>>