转:https://blog.csdn.net/qq_31075763/article/details/98584858
0.工具地址:jdk安装目录injvisualvm.exe
1.插件安装
工具->插件 可用插件 选择 Visual GC和BTrace Workench 两项安装。
自带的插件url已经不可用了,我们需要在设置中更改url,查询对应版本url,填写完成后可以安装插件,比如visual gc常用插件。
2.visual gc使用,jvm内存信息可以查看下图
visual gc图形界面如下图
整个区域分为三个部分:spaces、graphs、histogram
1.spaces区域:代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为Metaspace、Old、Eden、S0、S1
1.1)Metaspace:元空间,
1.1.1)java1.8用来替换PermGen永久代,最大区别是元空间不在jvm中,而是本地内存,但是可以通过参数指定大小。相关的参数:
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:
-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
1.1.2)为啥替换掉PermGen:
1.1.1.1、字符串存在永久代中,容易出现性能问题和内存溢出。
1.1.1.2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
1.1.1.3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
1.1.1.4、Oracle 可能会将HotSpot 与 JRockit 合二为一。
1.2)heap:
1.2.1)java堆(java heap)。它包括老年代(图中Old区域)和新生代(图中Eden/S0/S1三个统称新生代,分为Eden区和两个Survivor区域),他们默认是8:1分配内存。
1.2.1)
-xms512m 设置初始堆内存、
-Xmx512m 最大堆内存、
-XX:+HeapDumpOnOutofMemoryError 内存异常打印dump 、
-Xmn100m 新生代内存 因为Heap分为新生代跟老年代,所以512M-100M=412M老年代就是412M、
-XX:SurvivorRatio=8 新生代内存分配比例(8:1:1),
(初始内存跟最大内存最好相等,防止内存不够时扩充内存或者Full GC,导致性能降低)
2,Graphs区域:内存使用详细介绍
2.1)Compile Time(编译时间):47381compiles 表示编译总数,1m 34.372s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。
2.2)Class Loader Time(类加载时间): 66576loaded表示加载类数量, 1829 unloaded表示卸载的类数量,1m 42.148s表示类加载花费的时间
2.3)GC Time(GC Time):114collections表示垃圾收集的总次数,3.701s表示垃圾收集花费的时间,last cause表示最近垃圾收集的原因
2.4)Eden Space(Eden 区):括号内的200M表示最大容量,200M表示当前容量,后面的137.520M表示当前使用情况,92collections表示垃圾收集次数,1.544s表示垃圾收集花费时间
2.5)Survivor 0/Survivor 1(S0和S1区):括号内的25M表示最大容量,25M表示当前容量,之后的值是当前使用情况
2.6)Old Gen(老年代):括号内的500M表示最大容量,500M表示当前容量,之后的265.26表示当前使用情况,3collections表示垃圾收集次数 ,2.158s表示垃圾收集花费时间
2.7) Metaspace括号内的1.279G表示最大容量,408.836M表示当前容量,后面的392.074M表示当前使用情况。
3,Histogram区域:survivor区域参数跟年龄柱状图
3.1)Tenuring Threshold:表示新生代年龄大于当前值则进入老年代
3.2)Max Tenuring Threshold:表示新生代最大年龄值。
3.3)Desired Survivor Size:Survivor空间大小验证阙值(默认是survivor空间的一半),用于Tenuring Threshold判断对象是否提前进入老年代。
3.4)Current Survivor Size:当前survivor空间大小 。
3.5)histogram柱状图:表示年龄段对象的存储柱状图。
3.7)如果显示指定-XX:+UseParallelGC --新生代并行、老年代串行收集器 ,则histogram柱状图不支持当前收集器
4.安装 ”Visual GC"插件:
这个插件是jvisualvm的插件,它非常强大,可以动态的对指定的进程进行监控,并且来通过统计面板来分类显示出各项任务/事件的总时间开销:
需要进行远程jvm监测的,需要启动时添加参数
-Djava.rmi.server.hostname=ip
-Dcom.sun.management.jmxremote.port=port
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false