以管理员身份打开cmd命令行窗口查看JDK版本(Visual GC插件需要对应JDK的版本)
在cmd窗口输入 jvisualvm 命令打开Java VisualVM工具(JDK自带)
点击jvisualvm 工具-》插件-》可用插件
找找里面有没有Visual GC插件,有的话就勾上,然后安装。
安装失败,不要着急!因为安装插件的网站已经更新地址了,修改地址即可。
去visualvm的新访问地址,找到自己JDK对应版本的插件下载下来
(1) 访问新地址:https://visualvm.github.io/index.html
(2)进入 “Plugins” 》“Plugins Centers”,找到对应自己JDK版本的更新地址
(3)将地址复制保存起来。
【https://visualvm.github.io/uc/8u131/updates.xml.gz】
进入jvisualvm 工具-》插件-》设置
点击“编辑”按钮,修改替换为之前保存起来的最新地址。如依旧出现第3步的报错多重试几次。
安装VisualGC插件
双击本地pid进程,即可看到VisualGC
代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为Metaspace、Old、Eden、S0、S1
注意:如果对每个区域基本概念不是很熟悉的可以先了解下java虚拟机运行时数据区概念。
1.1)
perm:英文叫做Permanent Generation,我们称之为永久代。(根据深入java虚拟机作者说明,这里说法不是很正确,因为hotspot虚拟机的设计团队选择把GC分代收集扩展至此而已,正确的应该叫做方法区或者非堆)。
Meta space: 在 Java 8 中取代了 Perm space,是一块动态的内存区域,用于存储类的元数据信息,包括类名、方法名、字段名、注解等。 Meta space 是在 Java 堆中分配的,它不再有固定的大小限制,而是能够根据应用程序的需要动态增长或缩小。另外,Meta space 中的元数据信息可以通过 JVM 参数进行调整和控制,例如设置元数据的最大大小。
Meta space 和 Perm space 的区别在于:
存储位置:Perm space 是 JVM 堆外的一块内存,而 Meta space 是在 Java 堆中分配的。
大小限制:Perm space 有固定的大小限制,而 Meta space 是动态分配的,可以根据需要动态增长或缩小。
控制方式:Perm space 的大小和回收方式需要通过 JVM 参数进行调整和控制,而 Meta space 的元数据信息可以通过 JVM 参数进行调整和控制。
1.1.1)
通过VM Args:-XX:PermSize=128m -XX:MaxPermSize=256m 设置初始值与最大值
1.2)
heap:java堆(java heap)。它包括老年代(图中Old区域)和新生代(图中Eden/S0/S1三个统称新生代,分为Eden区和两个Survivor区域),他们默认是8:1分配内存
1.2.1)
通过VM Args:-xms512m -Xmx512m -XX:+HeapDumpOnOutofMemoryError-Xmn100m -XX:SurvivorRatio=8 设置初始堆内存、最大堆内存、内存异常打印dump、新生代内存、新生代内存分配比例(8:1:1),因为Heap分为新生代跟老年代,所以512M-100M=412M,老年代就是412M(初始内存跟最大内存最好相等,防止内存不够时扩充内存或者Full GC,导致性能降低)
内存使用详细介绍
2.1)Compile Time(编译时间):14483 compiles 表示编译总数,35.340s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。
2.2)Class Loader Time(类加载时间): 28779 loaded表示加载类数量, 11 unloaded表示卸载的类数量,1m 4.567s表示类加载花费的时间
2.3)GC Time(GC Time):47 collections表示垃圾收集的总次数,525.859s表示垃圾收集花费的时间,last cause表示最近垃圾收集的原因
2.4)Eden Space(Eden 区):括号内的525.375M表示最大容量,34.125M表示当前容量,后面的17.669M表示当前使用情况,48 collections表示垃圾收集次数,527.320s表示垃圾收集花费时间
2.5)Survivor 0/Survivor 1(S0和S1区):括号内的1.285G表示最大容量,261.387M表示当前容量,之后的值是当前使用情况
2.6)Old Gen(老年代):括号内的1.285G表示最大容量,261.387M表示当前容量,之后的172.638表示当前使用情况,0collections表示垃圾收集次数 ,0s表示垃圾收集花费时间
2.7)Metaspace(元空间):括号内的1,152G表示最大容量,183.008M表示当前容量,之后的172.638M表示当前使用情况
survivor区域参数跟年龄柱状图
3.1)Tenuring Threshold:表示新生代年龄大于当前值则进入老年代。
3.2)Max Tenuring Threshold:表示新生代最大年龄值。
3.3)Tenuring Threshold与Max Tenuring Threshold区别:Max Tenuring Threshold是一个最大限定,所有的新生代年龄都不能超过当前值,而Tenuring Threshold是个动态计算出来的临时值,一般情况与Max Tenuring Threshold相等,如果在Suivivor空间中,相同年龄所有对象大小的总和大于Survivor空间的一半,则年龄大于或者等于该年龄的对象就都可以直接进入老年代(如果计算出来年龄段是5,则Tenuring Threshold=5,age>=5的Suivivor对象都符合要求),它才是新生代是否进入老年代判断的依据。
3.4)Desired Survivor Size:Survivor空间大小验证阙值(默认是survivor空间的一半),用于Tenuring Threshold判断对象是否提前进入老年代。
3.5)Current Survivor Size:当前survivor空间大小
3.6)histogram柱状图:表示年龄段对象的存储柱状图
3.7)如果显示指定-XX:+UseParallelGC --新生代并行、老年代串行收集器 ,则histogram柱状图不支持当前收集器
http://www.oracle.com/technetwork/java/visualgc-136680.html
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html