开发者社区> 牧小农> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JVM性能优化(三)G1垃圾收集器(2)

简介: JVM性能优化(三)G1垃圾收集器
+关注继续查看

五、测试

5.1 测试代码:

public class TestGC {

    // 实现:不断的产生新的数据(对象),随机的去废弃对象(垃圾)
    public static void main(String[] args) throws Exception {
        List<Object> list = new ArrayList<>();
        while (true){
            int sleep = new Random().nextInt(100);
            if(System.currentTimeMillis() % 2 ==0){
                //当前的时间戳,是偶数
                list.clear();
            }else{
                //向List中添加1000个对象
                for (int i = 0; i < 10000; i++) {
                    Properties properties = new Properties();
                    properties.put("key_"+i,"value_"+System.currentTimeMillis()+i);
                    list.add(properties);
                }
            }
            Thread.sleep(sleep);
        }
    }
}


5.2 测试参数:

-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails -Xmx256m

image.png

5.3 日志输出:

[GC pause (G1 Evacuation Pause) (young), 0.0027884 secs]
   [Parallel Time: 2.2 ms, GC Workers: 8]
      [GC Worker Start (ms): Min: 542.1, Avg: 542.1, Max: 542.2, Diff: 0.1]
      # 扫描根节点
      [Ext Root Scanning (ms): Min: 0.1, Avg: 0.3, Max: 0.5, Diff: 0.4, Sum: 2.1]
      # 更新RS区域所消耗的时间
      [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Processed Buffers: Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
      # 对象拷贝
      [Object Copy (ms): Min: 1.6, Avg: 1.8, Max: 1.9, Diff: 0.4, Sum: 14.6]
      [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3]
         [Termination Attempts: Min: 1, Avg: 5.5, Max: 7, Diff: 6, Sum: 44]
      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2]
      [GC Worker Total (ms): Min: 2.1, Avg: 2.1, Max: 2.2, Diff: 0.1, Sum: 17.2]
      [GC Worker End (ms): Min: 544.2, Avg: 544.2, Max: 544.2, Diff: 0.0]
   [Code Root Fixup: 0.0 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.1 ms] # 清空CardTable
   [Other: 0.5 ms]
      [Choose CSet: 0.0 ms] # 选取 CSet
      [Ref Proc: 0.4 ms] # 弱引用、软引用的处理耗时
      [Ref Enq: 0.0 ms] # 弱引用、软引用的入队耗时
      [Redirty Cards: 0.0 ms]
      [Humongous Register: 0.0 ms] # 大对象区域注册耗时
      [Humongous Reclaim: 0.0 ms]  # 大对象区域回收耗时
      [Free CSet: 0.0 ms]
   [Eden: 12.0M(12.0M)->0.0B(13.0M) Survivors: 0.0B->2048.0K Heap: 12.0M(252.0M)->3282.5K(252.0M)] # 年轻代的大小统计
 [Times: user=0.00 sys=0.00, real=0.00 secs] 


五、对于G1垃圾回收器优化建议


年轻代大小:


避免使用 -Xmn选项或 -XX:NewRatio 等其他相关选项显示设置年轻代大小

固定年轻代的大小会覆盖暂停时间目标

暂停时间目标不要太过严苛


G1 GC 的吞吐量目标是 90% 的应用程序时间和 10%的垃圾回收时间

评估G1 GC的吞吐量时,暂停时间目标不要太严苛,目标太过严苛表示你愿意承受更多的垃圾回收开销,而这会直接影响到吞吐量

六、可视化GC日志分析工具


6.1 GC日志输出参数


前面通过 -XX:PrintGCDetails可以对GC日志进行打印,我们就可以在控制台查看,这样虽然可以查看GC的信息,但是并不直观,可以借助于第三方的GC日志分析工具进行查看


在日志打印输出设计到的参数如下:


-XX:+PrintGC:输出GC日志

-XX:+PrintGCDetails:输出GC的详细日志

-XX:+PrintGCTimeStamps:输出GC的时间戳(以基准的时间的形式)

-XX:+PrintGCDateStamps:输出GC的时间戳(以日期的形式,如: 2020-05-04T21:25.234+0800)

-XX:+PrintHeapAtGC:在进行GC的前后打印出堆的信息

-Xloggc:…/logs/gc.log 日志文件的输出路径

测试参数:


-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xmx256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:E://test//gc.log

1

运行main 方法后,我们就可以在 E://test//gc.log下发现一个 gc.log 的日志文件:

image.png


6.2 GC Easy 可视化工具


GC Easy是一款在线可视化工具,易用、功能强大,可以通过GC日志分析进行内存泄露检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用的

网站地址:http://gceasy.io


上传gc.log后,点击Analyze,就可以查看日志报告了

image.png

JVM的各个分代区域分配的内存及使用峰值的内存


image.png

关键性能指标: 吞吐量及GC暂停平均时间、最大时间、各个时间段的比例


Throughput表示的是吞吐量

Latency表示响应时间

Avg Pause GC Time 平均GC时间

Max Pause GC TIme 最大GC时间

image.png

第一部分是Heap after GC,GC后堆的内存图,堆是用来存储对象的

image.png


第二部分是Heap before GC,这是GC前堆的使用率,可以看出随着程序的运行,堆使用率越来越高,堆被对象占用的内存越来越大。

image.png

第三部分是GC Duration Time,就是GC持续时间。从图中可以看到,发生Full GC的时间持续的比较短,而Young GC持续的时间比较长。图中横坐标表示GC发生的时间段,纵坐标表示的是GC持续时间。

image.png


表示的是GC回收掉的垃圾对象的内存大小。image.png

GC Statistics

image.png

**Reclaimed Bytes(gb):**表示的是堆内存中Minor GC和Full GC回收垃圾对象的内存。

GC cumulative Time(ms):总计GC时间,包括Minor GC和Full GC,时间单位为ms。

GC Average Time(ms):GC平均时间,包括了Minor GC和Full GC。

image.png


总GC统计

MinorGC的统计

FullGC的统计

GC暂停程序的统计


七、结束语


到这里G1垃圾回收器就讲完了,感兴趣的小伙伴记得点赞关注,大家加油!


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
深入理解JVM - G1收集器
深入理解JVM - G1收集器
56 0
JVM性能优化 (一) 初识JVM(1)
JVM性能优化 (一) 初识JVM
17 0
GC垃圾收集器&JVM调优汇总(一)
最近朋友小B说想一份GC优化的资料内容,JVM内存分析以及性能调优的时候方便查询。可是文章太多根本看不过来,那么今天指北君就为大家带来这份,GC垃圾收集器总结及其优化指南,让你的JVM从此不再寂寞。
56 0
JVM垃圾收集
本博客为《深入理解java虚拟机》的学习笔记所以大部分内容来自此书。 一 是否可以回收 Java中对象能否被回收取决于对象是“死”还是“活”下面我们就介绍一下判定算法。
1367 0
深入理解JVM(五)——HotSpot垃圾收集器详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79612648 HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器。
1023 0
JVM垃圾收集(GC)
参考文献:周志明《深入理解Java虚拟机》第二版 因为 Java 具有自动垃圾回收机制,所以,垃圾收集(Garbage Collection,GC),是 Java 技术的核心之一,是...
1147 0
jvm系列(三):java GC算法 垃圾收集器
GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入...
1286 0
+关注
牧小农
业精于勤荒于嬉,行成于思毁于随。
134
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载