如何使用Jconsole查看JVM的memory性能

上一篇 / 下一篇  2015-06-26 15:55:58 / 个人分类:Java

GC(Garbage Collection):
GC是一套Java VM回收空闲memory的机制。GC的算法和参数影响着JVM的性能。

Java HotSpot VM GC使用的是generational GC(分代回收的策略),分代回收的策略把memory分成几代(generations),然后分配一个或者多个memory缓冲池到对应的年代中。如下图。

JVM会对年代执行局部GC来回收不用的对象,局部GC执行周期会比全局GC频繁。
Java HotSpot VM GC定义了两个年代:年轻代(young generation) 和 老年代(old generation)。年轻代由一个Eden和两个survivor组成。
JVM 最初尽量把对象分配到Eden, 大部分的对象会在这里被回收。当执行局部GC时,JVM 会把剩下的对象移动到某个survivor。
当对象在survivor存活一定时间后,会被移动到老年代的tenured,  当tenured填充了一定的对象后,会触发全局GC。全局GC通常比较慢,因为会涉及到所有存活的对象。
而永久代(permanent generation)存放着JVM的常在数据,例如类和方法对象。

Jconsole的使用
我们可以通过配置代(generation)的属性来优化GC的效率。Jconsole 可以用来查看整个memory和具体的堆使用情况。

1 启动Jconsole
在命令行属于Jconsole,然后选择对应的进程 或者 Jconsole processID(使用具体的进程ID替换),对应进程的Jconsole监视窗口会展示出来。
选择Memory Tab进入memory的数据部分。如下图。


2 在下拉列表中,可以查看到会展示如下类型的数据。

堆:堆包括了Eden Space,Survivor Space,Tenured Generation。堆内存用于JVM动态分配类实例所需要的内存。这个内存是可以固定的或者可变的。
 - Eden: 此缓冲池用于最初存放大部分的对象。
 - Survivor: 当Eden Space进行GC后,存活的对象会放到Survivor Space
 - Tenured Generation:在Survivor Space中存活了一定时间的对象会移到Tenured Generation中
非堆:非堆包括了Permanent Generation, Code Cache。非堆内存指JVM本部运行或者优化需要的内存。
 - Permanent Generation:JVM本身的类和方法对象会存在到此缓冲池。当JVM使用类数据共享时,本代会分成只读和可读写区域
 - Code Cache:JVM本身留有缓冲用于编辑和存储native代码。

Reference:
https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

TAG: GC gc jvm JVM

 

评分:0

我来说两句

Open Toolbar