这两天看了下Java虚拟机性能分析相关的东西,做一下总结,主要是jconsole和jvisualvm这两个工具,在java的jdk/bin里面都内置了
jconsole
分为本地连接和远程连接,我的不知道为啥本地连接连不上,所以用了远程连接,在idea运行的VM Option里面添加了如下参数
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8011
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
注意里面有个
-Dcom.sun.management.jmxremote.port=8011
就是端口开放在8011,这样我们点击远程连接,输入localhost:8081就能登录了
比较重要的是内存和线程两个栏
MarkSweeP是老年代的GC,Scanvage是young GC,也可点击右上角按钮实现手动GC
线程栏里面记录的是首先是线程状态,比如RUNNABLE,(锁上的)WAITING,下面就是堆栈跟踪,也就是显示了当前线程是由哪些方法调用的堆栈,下面有个检测死锁的功能,可以检查程序有没有死锁,后面介绍的jvisulalvm能够自动检测,相对上更方便一点
jvisualvm
官方推荐工具,功能强大,而且可以集成插件,比如Visual GC,集成过程见https://blog.csdn.net/newbaby2012/article/details/117932447
概述
右上角有两个按钮,一个是执行垃圾回收,一个是堆DUMP,执行堆dump其实就是生成一个堆内存的快照
快照文件内容如下:
概要,这个不讲
主要讲下类:
这一栏就是各种类型的类占堆内存的大小及比例
选中其中某一行,比如String,右键,选择"在实例视图中显示",就能在实例数栏里面看到:
左下角就是String的值"malformed input around byte",右上角的字段,就是描述了这个字段的hash, 序列号,classLoader信息,可以看到String的classLoader为null,这个我记得原生类型的classLoader就是null(好像代表bootStraper加载器??)
接下来看下线程栏:
介绍下右上角按钮线程dump
点击以后也会生成一个dump文件,主要记录各个进程的堆栈信息,好像自动检测死锁以后,也会把死锁相关信息放到这里