JVM实用参数-G1收集器

1.gc参数配置:

-XX:+UseG1GC

使用 G1 垃圾收集器

-XX:MaxGCPauseMillis=200

设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)

-XX:InitiatingHeapOccupancyPercent=45

启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示”一直执行GC循环”. 默认值为 45.

-XX:NewRatio=n

新生代与老生代(new/old generation)的大小比例(Ratio). 默认值为 2.

-XX:SurvivorRatio=n

eden/survivor 空间大小的比例(Ratio). 默认值为 8.

-XX:MaxTenuringThreshold=n

提升年老代的最大临界值(tenuring threshold). 默认值为 15.

-XX:ParallelGCThreads=n

设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同.

-XX:ConcGCThreads=n

并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同.

-XX:G1ReservePercent=n

设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10.

-XX:G1HeapRegionSize=n

使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为1Mb, 最大值为 32Mb.

2.jvm日志参数配置

-Xmx10M -Xmn10M -XX:+PrintGCTimeStamps -XX:+UseG1GC  -XX:+PrintGCDetails -Xloggc:./gclogs

3.最佳实践

3.1 不要设置年轻代的大小(Young Generation Size)

假若通过 -Xmn 显式地指定了年轻代的大小, 则会干扰到 G1收集器的默认行为.

  • G1在垃圾收集时将不再关心暂停时间指标. 所以从本质上说,设置年轻代的大小将禁用暂停时间目标.
  • G1在必要时也不能够增加或者缩小年轻代的空间. 因为大小是固定的,所以对更改大小无能为力

3.2 什么是转移失败(Evacuation Failure)

对 survivors 或 promoted objects 进行GC时,如果JVM的heap区不足,就会发生提升失败(promotion failure)。堆内存不能继续扩充,因为已经达到最大值了。当使用 -XX:+PrintGCDetails 时将会在GC日志中显示 to-space overflow (to-空间溢出)。

GC仍继续所以空间必须被释放,拷贝失败的对象必须被放到正确的位置(tenured in place),CSet指向区域中的任何 RSets 更新都必须重新生成(regenerated),所有这些步骤都是代价高昂的

3.3 如何避免转移失败(Evacuation Failure)

要避免避免转移失败, 考虑采纳下列选项:

  • 增加堆内存大小  
    • 增加 -XX:G1ReservePercent=n, 其默认值是 10.
    • G1创建了一个假天花板(false ceiling),在需要更大 ‘to-space’ 的情况下会尝试从保留内存获取(leave the reserve memory free).
  • 更早启动标记周期(marking cycle)
  • 通过采用 -XX:ConcGCThreads=n 选项增加标记线程(marking threads)的数量.

4.日志格式分析

4.1 日志格式

3种日志详情格式:

  • -verbosegc。和-XX:+PrintGC等效,日志级别为fine。
  • -XX:+PrintGCDetails。日志级别为finer,包含的信息比较完整。
  • -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest。日志级别为finest,包含finer信息以及每个工作线程的信息。

2种时间戳格式:

  • -XX:+PrintGCTimeStamps。毫秒时间。
  • -XX:+PrintGCDateStamps。日期时间。

-XX:+PrintGCDetails日志示例:

0.522: [GC pause (young), 0.15877971 secs]                                         // 程序运行0.522秒后发生一个Evacuation Pause,耗时0.15877971秒。

      [Parallel Time: 157.1 ms]                                                    // 并行GC耗时157.1 ms         

         [GC Worker Start (ms):  522.1  522.2 522.2  522.2                        // 每个工作线程启动时间,时间根据线程id排序

          Avg: 522.2, Min: 522.1, Max: 522.2, Diff:   0.1]                         // 所有工作线程启动时间的平均值、最小值、最大值、差别

         [Ext Root Scanning (ms):  1.6  1.5 1.6  1.9                              // 每个扫描root的线程耗时

          Avg:   1.7, Min:   1.5, Max:  1.9, Diff:   0.4]                         

         [Update RS (ms):  38.7  38.8 50.6  37.3                                  // 每个执行更新RS(Remembered Sets)的线程的耗时

          Avg:  41.3, Min:  37.3, Max: 50.6, Diff:  13.3]                         

            [Processed Buffers : 2 2 3 2                                           // 每个工作线程执行UB(Update Buffers)的数量

              Sum: 9, Avg: 2, Min: 2, Max: 3, Diff: 1]                              

         [Scan RS (ms):  9.9  9.7 0.0  9.7                                        // 每个工作线程扫描RS的耗时

          Avg:   7.3, Min:   0.0, Max:  9.9, Diff:   9.9]                         

         [Object Copy (ms):  106.7  106.8 104.6  107.9                            // 每个工作线程执行OC(Object Copy)的耗时

          Avg: 106.5, Min: 104.6, Max: 107.9, Diff:   3.3]                         

         [Termination (ms):  0.0  0.0 0.0  0.0                                    // 每个工作线程执行终止的耗时

          Avg:   0.0, Min:   0.0, Max:  0.0, Diff:   0.0]

            [Termination Attempts : 1 4 4 6                                        // 每个工作线程执行终止的重试的次数

              Sum: 15, Avg: 3, Min: 1, Max: 6, Diff: 5]

         [GC Worker End (ms):  679.1  679.1 679.1  679.1                          // 每个工作线程终止时的时间

          Avg: 679.1, Min: 679.1, Max: 679.1, Diff:   0.1]

         [GC Worker (ms):  156.9  157.0 156.9  156.9                              // 每个工作线程的生命时间

          Avg: 156.9, Min: 156.9, Max: 157.0, Diff:   0.1]

         [GC Worker Other (ms):  0.3  0.3 0.3  0.3                                // 每个工作线程执行其他任务(上述未统计的内容)的耗时

          Avg:   0.3, Min:   0.3, Max:  0.3, Diff:   0.0]

      [Clear CT:   0.1 ms]                                                        // 清理CT(Card Table)的耗时

      [Other:   1.5 ms]                                                           // 其他任务(上述未统计的内容)的耗时

         [Choose CSet:   0.0 ms]                                                   //选择分区的耗时

         [Ref Proc:   0.3 ms]                                                     // 执行关联(Reference objects)的耗时

         [Ref Enq:   0.0 ms]                                                      // 将references放入ReferenceQueues的耗时

         [Free CSet:   0.3 ms]                                                    // 释放CS(collection set)的耗时

      [Eden: 12M(12M)->0B(10M) Survivors: 0B->2048K Heap: 13M(64M)->9739K(64M)]    // Eden容量为12M,使用了12M,GC后变为0,容量目标大小增加到13M。

                                                                                   // SurvivorsGC前为0,GC后变为2048K

                                                                                   // GC前,Heap容量为64M,使用13M;GC后,Heap容量为64M,使用9739k。

    [Times: user=0.59 sys=0.02, real=0.16 secs]

你可能感兴趣的:(java虚拟机(JVM))