十八.性能测试-jvisualvm之gc

本文介绍了jVisualVM工具中的GC分析,包括spaces区域、Graphs区域、histogram的解读,以及JVM参数和垃圾收集器的工作原理,如串行、并行、CMS和G1回收器的特性。
摘要由CSDN通过智能技术生成

1.前面几篇文章简单介绍了visual gc插件的安装和一些内存相关基础知识,本次简单介绍一下visual gc中的一些相关知识
在这里插入图片描述
如图所示主要分为三块:

1.spaces区域:

代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为Metaspace、Old、Eden、S0、S1

2.Graphs区域:

代表内存的详细使用信息。
Compile Time(编译时间):图中显示编译了19904个类总耗时2m57.562s,一个驼峰表示一次JIT编译,越窄表示时间越短
Class Loader Time(类加载时间):表示加载、卸载类的数量、总消耗时间
GC Time(GC Time):显示GC次数、耗时、最近垃圾收集的原因
Eden Space(Eden 区):括号内的2.196G表示最大容量,2.175G表示当前容量,后面的1.308G表示当前占用空间,173 collections表示垃圾收集次数,7.893s表示垃圾收集花费时间
Survivor 0/Survivor 1(S0和S1区):和Eden Space类似
Old Gen(老年代):和Eden Space类似
Metaspace(元空间):表示最大空间、当前空间、当前占用大小。

3.histogram:

显示survivor区域对象的年龄。
有时显示不受此jvm支持,因为Java应用默认使用UseParallelGC 并行收集器,需要将jvm的gc方式改为CMS+Parnew
在这里插入图片描述
在这里插入图片描述
Tenuring Threshold:表示新生代年龄大于当前值则进入老年代
Max Tenuring Threshold:表示新生代最大年龄值。
Tenuring Threshold与Max Tenuring Threshold区别:Max Tenuring Threshold是一个最大限定,所有的新生代年龄都不能超过当前值,而Tenuring Threshold是个动态计算出来的临时值,一般情况与Max Tenuring Threshold相等,如果在Suivivor空间中,相同年龄所有对象大小的总和大于Survivor空间的一半,则年龄大于或者等于该年龄的对象就都可以直接进入老年代(如果计算出来年龄段是6,则Tenuring Threshold=6,age>=6的Suivivor对象都符合要求),它才是新生代是否进入老年代判断的依据。
Desired Survivor Size:Survivor空间大小阈值(默认是survivor空间的一半),用于Tenuring Threshold判断对象是否提前进入老年代。
Current Survivor Size:当前survivor空间大小

对象如何进入老年代:

(1)当对象首次创建时, 会放在新生代的eden区, 若没有GC的介入,会一直在eden区, GC后,是可能进入survivor区或者年老代 
(2)当对象年龄达到一定的大小 ,就会离开年轻代, 进入老年代, 对象进入老年代的事件称为晋升, 而对象的年龄是由GC的次数决定的, 每一次GC,若对象没有被回收, 则对象的年龄就会加1, 可以使用以下参数来控制新生代对象的最大年龄: 
  -XX:MaxTenuringThreshold=n  假设值为n , 则新生代的对象最多经历n次GC, 就能晋升到老年代, 但这个必不是晋升的必要条件 
  -XX:TargetSurvivorRatio=n  用于设置Survivor区的目标使用率,即当survivor区GC后使用率超过这个值, 就可能会使用较小的年龄作为晋升年龄 
(3)除年龄外, 对象体积也会影响对象的晋升的, 若对象体积太大, 新生代无法容纳这个对象, 则这个对象可能就会直接晋升至老年代, 可通过以下参数使用对象直接晋升至老年代的阈值, 单位是byte 
  -XX:PretenureSizeThreshold  即对象的大小大于此值, 就会绕过新生代, 直接在老年代分配, 此参数只对串行回收器以及ParNew回收有效, 而对ParallelGC回收器无效

4.JVM参数大全:

搜集了各个不同版本不同平台的调优参数大全,我自己也只用过很少一部分,仅供大家参考。
参数规则

-XX 被称为不稳定参数,此类参数的设置很容易引起JVM性能上的差异。
-XX:+<option> '+'表示启用该选项
-XX:-<option> '-'表示关闭该选项
-XX:<option>=<number> 可跟随单位,例如:'m''M'表示兆字节;'k''K'千字节;'g''G'千兆字节
-XX:<option>=<string> 通常用于指定一个文件、路径或一系列命令列表。例如:-XX:HeapDumpPath=./dump.core

运行参数

-XX:-AllowUserSignalHandlers 允许为java进程安装信号处理器,仅限于Linux和Solaris默认关闭
-XX:AltStackSize=1024  备用信号堆栈大小(以字节为单位),仅适用于Solaris
-XX:-DisableExplicitGC  禁止在运行期显式地调用 System.gc(),默认关闭
-XX:+FailOverToOldVerifier  如果新的Class校验器检查失败,则使用老的校验器。解决兼容性问题。
-XX:+UseSplitVerifier  使用新的Class类型校验器。关联选项:-XX:+FailOverToOldVerifier
-XX:+HandlePromotionFailure 新生代收集担保,于年老代预留内存。Java1.6后默认启用
-XX:+MaxFDLimit  设置java进程可用文件描述符为操作系统允许的最大值。限于Solaris,默认启用
-XX:PreBlockSpin  控制多线程自旋锁优化的自旋次数,默认10,前置选项:-XX:+UseSpinning
-XX:-UseSpinning  启用多线程自旋锁优化。关联选项:-XX:PreBlockSpin=10
-XX:-RelaxAccessControlCheck  在Class校验器中,放松对访问控制的检查。作用与reflection里的setAccessible类似。
-XX:+UseLWPSynchronization	使用轻量级进程(内核线程)替换线程同步。仅限于Solaris,默认启用。
-XX:+UseAltSigs  为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1和SIGUSR2。
-XX:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值