Java架构师必懂的GC日志知识
在Java,Android,C#等中,GC是自动的,而在几种前代编程语言(C,C ++)中,程序员必须明确编写代码才能释放对象。 所以,这对于Java,Android和C#应用程序开发人员来说是一个很大的方便。 但这种自动垃圾收集不是免费的,它有一个代价。 自动GC可以对以下方面产生比较明显的的影响:
-
程序响应时间
-
CPU
-
内存
程序响应时间
在进行自动GC对象,整个应用程序必须间歇性地暂停,以标记正在使用的对象,并清除未使用的对象。 在这个暂停期间,应用程序中正在运行的所有客户端处理将被冻结(即冻结)。 根据您配置的GC算法和内存设置的类型,暂停时间可以从几毫秒到几秒到几分钟。 因此,垃圾收集可以显着影响您的应用程序SLA(服务级别协议)。
CPU
GC消耗了大量的CPU时间偏。 每个应用程序将有成千上万个存在内存中的对象。 内存中的每个对象都应定期进行调查,看它们是否在使用中。 如果正在使用,谁在引用它? 这些引用仍然活跃吗? 如果他们没有被使用,他们应该从内存中移除。 所有这些调查和计算都需要大量的CPU能力。
内存
当然,糟糕的GC配置会导致高内存消耗,反之亦然。 在饱和其他资源(CPU,网络带宽,存储)之前,大多数应用程序首先饱和内存。 大多数应用程序升级其EC2实例大小,以获得额外的内存,而不是获得额外的CPU或网络带宽。
因此,为了让您的云托管服务提供商拥有一流的SLA并减少费用,您的应用程序的垃圾收集必须能够有效运行。 为了研究和优化垃圾回收对应用程序性能的影响,必须启用垃圾回收日志。 除此之外,垃圾收集日志可以用来解决应用程序中与内存有关的问题。
启用GC日志
GC日志记录可以通过在应用程序启动过程中传递下面提到的系统属性来启用。
-
Java 8之前是这样配置的:-XX:+PrintGCDetails -Xloggc:<gc-log-file-path>,例如我们的项目是:-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log
-
Java 9是这样的配置的:-Xlog:gc:file=<gc-log-file-path>,我们的项目的写法就是:-Xlog:gc:file=/opt/tmp/myapp-gc.log
怎么分析GC日志
高级Java架构师必懂的GC日志知识GC日志具有丰富的信息,但是理解GC日志并不容易。 没有足够的文档来解释GC日志格式。 最重要的是,GC日志格式不是标准化的。 它的性能因JVM供应商(Oracle,IBM,HP,Azul等),Java版本(1.4,5,6,7,8,9),GC算法(串行,并行,CMS,G1,Shenandoah),GC系统属性 (-XX:+ PrintGC,-XX:+ PrintGCDetails,-XX:+ PrintGCDateStamps,-XX:+ PrintHeapAtGC ...)。 基于这种排列和组合,很容易有60多种不同的GC日志格式。
因此,为了分析GC日志,强烈建议使用GC日志分析工具,如GCeasy,HPJmeter。 这些工具解析GC日志,并生成数据的良好图形可视化,报告关键性能指标和其他一些有用的指标。
GCeasy是一个很棒的工具。你可以试着去使用使用。对大家的分析有很大的帮助。