在使用jconsole监控jvm之前,首先需要先打开jmx。启动jvm时,添加以下参数。jmx通过58088端口对外开放。
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=58088 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
找到jdk安装的目录,在 $INSTALL_PATH/bin 目录下,执行 ./jconsole
填写机器IP地址,及jmx端口。
点击连接,即可打开jconsole 可视化界面,对java 应用运行情况进行分析。
在概览页面,可以查看堆内存、线程、类、CPU占用率等信息。
内存页面,可以查看JVM各个区域内存使用情况。包括:堆内存PS Old Gen、PS Eden Space、PS Survivor Space、Metaspace、Code Cache、Compressed Class Space.
PS Old Gen 区
老年代内存占用情况,老年代存放经过多次年轻代垃圾回收都没有回收掉的对象。与此同时,对于大对象的分配内存,也是存放在老年代。大对象判断阈值:-XX:PretenureSizeThreshold=0 ** 默认值是0,意味着任何对象都会现在新生代分配内存。**
PS Eden Space 区
新生代内存占用情况,新创建的对象,都是在堆内存年轻代分配。
PS Survivor Space 区
幸存者区内存占用情况,存放年轻代垃圾回收时被标记对象,两个survivor区用于复制算法。
Metaspace
元空间区
Code cache
代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code)。
当然JNI(Java本地接口)的机器码也放在codeCache里,不过JIT编译生成的native code占主要部分。
字节码编译:.java -> .class
机器码编译:.class -> JIT 机器码
JVM 执行一段class字节码,分两种方式:解释执行 和 编译执行。
解释执行是指,在执行字节码时,逐行解释成机器码,然后再执行。
编译执行是指,提前将经常被调用(达到一定次数)的方法字节码编译成功机器码,并进行各层次的优化,提升执行效率,缓存至codeCache里,避免重复编译。
Compressed Class Space
压缩类空间。