JVM常见参数总结

这篇主要讲CMS的日志格式G1的日志格式常用参数纤程 学习过程中用到的一些知识。

CMS日志分析

    首先启动linux 然后执行 命令java -Xms20M -Xmx20M -XX:+printGCDetails -XX:+UserConcMarkSweepGC com.study.jvm.gc.GcTest
Xms :堆大小
PrintGCDetails :打印GC的详细信息
UserConcMarkSweepGC:启动CMS
    看项目年轻代回收的日志信息,刚开始是YGC ,是ParNew 这个垃圾回收器来做的。Allocation Failure 分配失败了所以ParNew 开始执行对象越来越多 我的年轻代已经满了怎么办,启动我的年轻代垃圾回收器。
[GC(Allocation Failure)[Parnew : 6144k->640k(6144k),0.0265885 secs] 6585k ->2770k(19840k),0.0268035 secs [Times:user = 0.02 sys=0.00,real=0.02secs]]

  • Parnew:年轻代收集器
  • 6144->640:收集前后的对比
  • (6144):整个年轻代容量
  • 6585 ->2770:整个堆的情况
  • (19840):整个堆大小
    最主要的是在于CMS启动之后,是一个非常复杂的日志格式。里面牵扯到了CMS的一些阶段。看下面的代码注释:
[GC (CMS Initial Mark) [1 CMS-initial-mark:8511k(1369k)] 9866k(19840k),0.0040321 secs] 
[Times: user=0.01 sys=0.00,real=0.00 secs]
//CMS Initial Mark : 谁启动的
//8511 (13696) : 老年代使用(最大)
//9866 (19840) : 整个堆使用(最大)
//一般来说PN+CMS+SO,单线程对于o的区markcompact机会卡死,新生代升不到老年代了,
//如果频繁发生SerialOld卡顿,应该调小,调小代表着,原来到了68%会发生CMS,
//调小到34%就会发生CMS,那我这时候已经CMS在运行了,不断的开始回收了,哪怕这个时候对象不断的往里回收,后面预留的空间
//没问题,这个时候就不容易发生SerialOld,当然调小了也有不好的地方(频繁CMS回收)

[CMS-concurrent-mark-start]//并发标记
[CMS-concurrent-mark: 0.018/0.018 secs] [Times: user=0.01 sys=0.00,real=0.02secs]//并发时间  这里的时间意义不大 ,因为是并发执行
[CMS-concurrent-preclean-start]//清理之前的阶段,它是把某些Card标记Dirty,GC去标记的代记引用
[CMS-concurrent-preclean: 0.000/0.000 secs] [Times : user=0.00 sys= 0.00,real = 0.00 secs] //标记Card为Dirty,也称为Card Marking

]
G1日志详解

    G1要记住几个阶段回收,他都是分为几个区,G1是有STW的,不管是PS+PO还是PN+CMS都需要指定样区,XMN不指定就会有默认比例,G1 不推荐指定比例,原因是G1会动态进行调整,调整的依据就是把YGC暂停时间。
    启动G1: java -Xms20M -Xmx20M -XX:+PrintGCdetails -XX:+UserG1GC com.study.jvm.gc.GcTest
看详细的日志,发现这三个阶段它不是顺序执行的,而是在一定条件之后会触发的。

    了解了CMS和G1的日志之后再加上PS和PO的日志基本上常用的日志都见过了,如果说不知道应用程序使用哪一种垃圾回收器的时候,除了常见的方法外还可以通过日志的格式。看日志应该知道它到底是用的是哪种垃圾回收期
,下面是总结GC的常用参数,不分垃圾回收器。

GC常用参数
  • -Xmn、-Xms、 -Xms 、-Xss :年轻代、 最小堆、最大堆、栈空间
  • -XX:+UserTLAB :使用TLAB,默认打开
  • -XX:+PrintTLAB :打印TLAB的使用情况
  • -XX:+DisableExplictGC : System.gc()不管用,FGC
  • -XX:+PrintGC :打印GC信息
  • -XX:+PrintGCDetails :GC详细信息
  • -XX:+PrintHeapAtGC :GC打印堆栈情况
  • -XX:+PrintGCTimeStamps :发生GC系统时间
  • -XX:+PrintGCApplicationConcurrenTime :(低)打印应用程序时间
  • -XX:+PrintGCApplicationStoppedTime :(低)打印暂停时长
  • -XX:+PrintReferenceGC :(重要性低)记录回收了多少种不同引用类型的引用
  • -verbose:class :类加载详细过程
  • -XX:+PrintVMOptions :打印jvm的参数
  • -XX+PrintFlagsFinal -XX:+PrintFlagsInitial : 最终的 - 初始化默认的参数,这个参数必须得会用
  • -XX:MaxTenuringThreshold :GC升代年龄,最大值15
Parallel常用参数
  • -XX:SurivorRatio :比例,默认是8:1:1,可以调
  • -XX:PreTenureSizeThreshold:大对象到底多大,通过这个指定
  • -XX:MaxTenuringThreshold :GC升代年龄,最大值15
  • -XX:+ParallelGCThreads:并行收集器的线程数,同样适用于CMS,一般设为和CPU核数相同
  • -XX:+UseAdaptiveSizePolicy : 自动选择各区大小比例
CMS 常用参数
  • -XX:+UserConcMarkSweepGC : CMS启动
  • -XX:ParllelCMsThreads :CMS线程数量,核默认是一半
  • -XX:CMSInitiatingOccupancyFraction :使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld 卡顿,应该调小,(频繁CMS回收)
  • -XX:UserCMSCompactAtFullColletion :当进行FGC时进行压缩,当然回收过程中耗时特别长,会损失用户的相应时间
  • -XX:CMSFullGCsBeforeCompaction :多少次CMS回收之后FGC进行压缩
  • -XX:CMSClassUnloadingEnabled:回收我们的永久代没回收方法区不用的class,1.8之前的
  • GCTimeRatio : 设置GC时间占用程序运行时间的百分比
  • -XX:MaxGCPauseMillis : 停顿时间,响应时间,是一个建议时间,GC会尝试用各种手段达到这个时间,比如减小年轻代
G1常用参数
  • -XX:+UseG1Gc :启动FC
  • -XX:MaxGcPauseMillis :建议值,G1会尝试调整Young区的块数来达到这个值
  • -XX:GCPauseIntervalMills : GC的间隔时间
  • -XX:G1HeapRegionSize : 分区大小,建议逐渐增大该值,1 2 4 816 32。随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长ZGC做了改进(动态区块大小)
  • G1NewSizePercent :新生代最小比例,默认5%
  • G1MaxNewSizePercent :新生代最大比例,默认60%
  • GCTimeRatio :GC时间建议比例,G1会根据这个值调整堆空间
  • ConcGcThreads :线程数量
  • InitiatingHeapOccupancyPercent : 启动G1的堆空间占用比例

到目前为止 jvm日志格式,常用参数 告一段落,纤程这一部分 下一篇再讲吧

你可能感兴趣的:(JVM常见参数总结)