跳至主要內容

JVM (十五) visualVM 的图形解释

安图新大约 8 分钟

JVM (十五) visualVM 的图形解释

Java VisualVM 默认没有安装 Visual GC 插件,需要手动安装,JDK 的安装目录的 bin 目录下双击 jvisualvm.exe,即可打开 Java VisualVM,点击菜单栏 工具->插件 安装 Visual GC

 
 

安装完成后重启 Java VisualVM,Visual GC 界面自动打开,即可看到 JVM 中堆内存的分代情况

 
 

被监控的程序运行一段时间后 Visual GC 显示如下

 
 

一:整个区域分为三部分:spaces、graphs、histogram

1,spaces 区域:代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为 Perm、Old、Eden、S0、S1

注意:如果对每个区域基本概念不是很熟悉的可以先了解下java 虚拟机运行时数据区open in new window这篇文字。

1、 1)perm:英文叫做 PermanentGeneration,我们称之为永久代(根据深入 java 虚拟机作者说明,这里说法不是不是很正确,因为 hotspot 虚拟机的设计团队选择把 GC 分代收集扩展至此而已,正确的应该叫做方法区或者非堆);

1、 1.1)通过 VMArgs:-XX:PermSize=128m-XX:MaxPermSize=256m 设置初始值与最大值;

1、 2)heap:java 堆(Javaopen in new windowheap)它包括老年代(图中 Old 区域)和新生代(图中 Eden/S0/S1 三个统称新生代,分为 Eden 区和两个 Survivor 区域),他们默认是 8:1 分配内存;

1、 2.1)通过 VMArgs:-xms512m-Xmx512m-XX:+HeapDumpOnOutofMemoryError-Xmn100m-XX:SurvivorRatio=8 设置初始堆内存、最大堆内存、内存异常打印 dump、新生代内存、新生代内存分配比例(8:1:1),因为 Heap 分为新生代跟老年代,所以 512M-100M=412M,老年代就是 412M(初始内存跟最大内存最好相等,防止内存不够时扩充内存或者 FullGC,导致性能降低);

2,Graphs 区域:内存使用详细介绍

2、 1)CompileTime(编译时间):6368compiles 表示编译总数,4.407s 表示编译累计时间一个脉冲表示一次 JIT 编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长;

2、 2)ClassLoaderTime(类加载时间):20869loaded 表示加载类数量,139unloaded 表示卸载的类数量,40.630s 表示类加载花费的时间;

2、 3)GCTime(GCTime):2392collections 表示垃圾收集的总次数,37.454s 表示垃圾收集花费的时间,lastcause 表示最近垃圾收集的原因;

2、 4)EdenSpace(Eden 区):括号内的 31.500M 表示最大容量,9.750M 表示当前容量,后面的 4.362M 表示当前使用情况,2313collections 表示垃圾收集次数,8.458s 表示垃圾收集花费时间;

2、 5)Survivor0/Survivor1(S0 和 S1 区):括号内的 3.938M 表示最大容量,1.188M 表示当前容量,之后的值是当前使用情况;

2、 6)OldGen(老年代):括号内的 472.625M 表示最大容量,145.031M 表示当前容量,之后的 87.031 表示当前使用情况,79collections 表示垃圾收集次数,28.996s 表示垃圾收集花费时间;

2、 7)PermGen(永久代):括号内的 256.000M 表示最大容量,105.250M 表示当前容量,之后的 105.032M 表示当前使用情况;

3,Histogram 区域:survivor 区域参数跟年龄柱状图

3、 1)TenuringThreshold:表示新生代年龄大于当前值则进入老年代;

3、 2)MaxTenuringThreshold:表示新生代最大年龄值;

3、 3)TenuringThreshold 与 MaxTenuringThreshold 区别:MaxTenuringThreshold 是一个最大限定,所有的新生代年龄都不能超过当前值,而 TenuringThreshold 是个动态计算出来的临时值,一般情况与 MaxTenuringThreshold 相等,如果在 Suivivor 空间中,相同年龄所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或者等于该年龄的对象就都可以直接进入老年代(如果计算出来年龄段是 5,则 TenuringThreshold=5,age>=5 的 Suivivor 对象都符合要求),它才是新生代是否进入老年代判断的依据;

3、 4)DesiredSurvivorSize:Survivor 空间大小验证阙值(默认是 survivor 空间的一半),用于 TenuringThreshold 判断对象是否提前进入老年代;

3、 5)CurrentSurvivorSize:当前 survivor 空间大小;

3、 6)histogram 柱状图:表示年龄段对象的存储柱状图;

3、 7)如果显示指定-XX:+UseParallelGC--新生代并行、老年代串行收集器,则 histogram 柱状图不支持当前收集器;

内存溢出( out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;比如申请了一个 integer,但给它存了 long 才能存下的数,那就是内存溢出。

内存泄露 (memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。其实说白了就是该内存空间使用完毕之后未回收。

二 Java VisualVM 的其他功能

1、 监视界面(cpu,类,堆,线程);

 
 

2、 线程界面;

VisualVM 的线程标签提供了三种视图,默认会以时间线的方式展现。另外两种视图分别是表视图和详细信息视图。

时间线视图上方的工具栏提供了缩小,放大和自适应三个按钮,以及一个下拉框,我们可以选择将所有线程、活动线程或者完成的线程显示在视图中。

 
 

3、 Profile 界面(性能剖析);

在 Profiler 标签,点击“CPU”按钮启动一个 CPU 性能分析会话 ,VisualVM 会检测应用程序所有的被调用的方法。当进入一个方法时,线程会发出一个“method entry”的事件,当退出方法时同样会发出一个“method exit”的事件,这些事件都包含了时间戳。然后 VisualVM 会把每个被调用方法的总的执行时间和调用的次数按照运行时长展示出来。

此外,我们也可以通过性能分析结果下方的方法名过滤器对分析结果进行过滤。

 
 

点击内存按钮执行内存分析查看类

 
 

4、 快照功能;

我们可以使用 VisualVM 的快照功能生成任意个性能分析快照并保存到本地来辅助我们进行性能分析。快照为捕获应用程序性能分析数据提供了一个很便捷的方式因为快照一旦生成可以在任何时候离线打开和查看,也可以相互传阅。

VisualVM 提供了两种类型的快照:

  • Profiler 快照:当有一个性能分析会话(内存或者 CPU)正在进行时,我们可以通过性能分析结果工具栏的“快照”按钮生成 Profiler 快照捕获当时的性能分析数据。
  • 应用程序快照:我们可以右键点击左侧 Applications 窗口中应用程序节点,选择“应用程序快照”为生成一个应用程序快照。应用程序快照会收集某一时刻的堆转储,线程转储和 Profiler 快照,同时也会捕获 JVM 的一些基本信息。

5、 堆 dump(转储)和线程 dump(转储)操作;

线程转储的生成与分析

VisualVM 能够对正在运行的本地应用程序生成线程转储,把活动线程的堆栈踪迹打印出来,帮助我们有效了解线程运行的情况,诊断死锁、应用程序瘫痪等问题。

堆转储的生成与分析

VisualVM 能够生成堆转储,统计某一特定时刻 JVM 中的对象信息,帮助我们分析对象的引用关系、是否有内存泄漏情况的发生等。

Dump 文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到 dump 文件中,堆 dump 的 dump 文件内容如下图所示

当 VisualVM 统计完堆内对象数据后,会把堆转储信息显示在新的堆转储标签内,我们可以看到摘要、类、实例数等信息以及通过 OQL 【对象查询语言是专门为 ODMG(Object Database Management Group)对象模型制定的查询语言】控制台执行查询语句功能。

堆转储的摘要包括转储的文件大小、路径等基本信息,运行的系统环境信息,也可以显示所有的线程信息

从类视图可以获得各个类的实例数和占用堆大小数,分析出内存空间的使用情况,找出内存的瓶颈,避免内存的过度使用。

通过实例数视图可以获得每个实例内部各成员变量的值以及该实例被引用的位置。首先需要在类视图选择需要查看实例的类。

此外,还能对两个堆转储文件进行比较。通过比较我们能够分析出两个时间点哪些对象被大量创建或销毁。

线程转储和堆转储均可以另存成文件,以便进行离线分析。

参考:

https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

http://tianxingzhe.blog.51cto.com/3390077/1651384/

http://blog.csdn.net/xuelinmei_happy/article/details/51090115

http://www.cnblogs.com/linghu-java/p/5689227.html

上次编辑于:
贡献者: Andy