GC调优

Reference:https://time.geekbang.org/column/article/107396

GC算法

JVM提供了不同的回收算法来实现这?套回收机制,通常垃圾收集器的回收算法可以分为以下?种:

如果说收集算法是内存回收的?法论,那么垃圾收集器就是内存回收的具体实现,JDK1.7 update14 之后Hotspot虚拟机所有的回收器整理如下(以下为服务端垃圾收集器):

其实在JVM规范中并没有明确GC的运作?式,各个?商可以采?不同的?式实现垃圾收集器。我们可以通过JVM?具查询当前JVM使?的垃圾收集器类型,?先通过ps命令查询出经常ID,再通过jmap -heap ID查询出JVM的配置信息,其中就包括垃圾收集器的设置类型。

GC性能衡量指标

?个垃圾收集器在不同场景下表现出的性能也不?样,那么如何评价?个垃圾收集器的性能好坏呢?我们可以借助?些指标。

吞吐量这?的吞吐量是指应?程序所花费的时间和系统总运?时间的?值。我们可以按照这个公式来计算GC的吞吐量:系统总运?时间=应?程序耗时+GC耗时。如果系统运?了100分钟,GC耗时1分钟,则系统吞吐量为99%。GC的吞吐量?般不能低于95%。

停顿时间指垃圾收集器正在运?时,应?程序的暂停时间。对于串?回收器而言,停顿时间可能会?较长;而使?并发回收器,由于垃圾收集器和应?程序交替运?,程序的停顿时间就会变短,但其效率很可能不如独占垃圾收集器,系统的吞吐量也很可能会降低。

垃圾回收频率:多久发??次指垃圾回收呢?通常垃圾回收的频率越低越好,增?堆内存空间可以有效降低垃圾回收发?的频率,但同时也意味着堆积的回收对象越多,最终也会增加回收时的停顿时间。所以我们只要适当地增?堆内存空间,保证正常的垃圾回收频率即可。

GC调优策略

找出问题后,就可以进?调优了,下?介绍?种常?的GC调优策略。

1. 降低Minor GC频率

通常情况下,由于新?代空间较?,Eden区很快被填满,就会导致频繁Minor GC,因此我们可以通过增?新?代空间来降低Minor GC的频率。

可能你会有这样的疑问,扩容Eden区虽然可以减少Minor GC的次数,但不会增加单次Minor GC的时间吗?如果单次Minor GC的时间增加,那也很难达到我们期待的优化效果呀。

我们知道,单次Minor GC时间是由两部分组成:T1(扫描新?代)和T2(复制存活对象)。

假设?个对象在Eden区的存活时间为500ms,Minor GC的时间间隔是300ms,那么正常情况下,Minor GC的时间为 :T1+T2。

当我们增?新?代空间,Minor GC的时间间隔可能会扩?到600ms,此时?个存活500ms的对象就会在Eden区中被回收掉,此时就不存在复制存活对象了,所以再发?Minor GC的时间为:两次扫描新?代,即2T1。

可见,扩容后,Minor GC时增加了T1,但省去了T2的时间。通常在虚拟机中,复制对象的成本要远?于扫描成本。

如果在堆内存中存在较多的长期存活的对象,此时增加年轻代空间,反?会增加Minor GC的时间。如果堆中的短期对象很多,那么扩容新?代,单次Minor GC时间不会显著增加。因此,单次Minor GC时间更多取决于GC后存活对象的数量,??Eden区的大小

2. 降低Full GC的频率

通常情况下,由于堆内存空间不足或老年代对象太多,会触发Full GC,频繁的Full GC会带来上下?切换,增加系统的性能开销。我们可以使用哪些?法来降低Full GC的频率呢?

减少创建?对象:在平常的业务场景中,我们习惯?次性从数据库中查询出?个大对象?于web端显?。例如,我之前碰到过?个?次性查询出60个字段的业务操作,这种大对象如果超过年轻代最大对象阈值,会被直接创建在?年代;即使被创建在了年轻代,由于年轻代的内存空间有限,通过Minor GC之后也会进?到?年代。这种大对象很容易产?较多的Full GC。

我们可以将这种大对象拆解出来,首次只查询?些?较重要的字段,如果还需要其它字段辅助查看,再通过第?次查询显示剩余的字段。

增大堆内存空间:在堆内存不足的情况下,增大堆内存空间,且设置初始化堆内存为最大堆内存,也可以降低Full GC的频率。

选择合适的GC回收器

假设我们有这样?个需求,要求每次操作的响应时间必须在500ms以内。这个时候我们?般会选择响应速度较快的GC回收器,CMS(Concurrent Mark Sweep)回收器和G1回收器都是不错的选择。

而当我们的需求对系统吞吐量有要求时,就可以选择Parallel Scavenge回收器来提?系统的吞吐量。

总结

垃圾收集器的种类很多,我们可以将其分成两种类型

  • 响应速度快
  • 吞吐量?

通常情况下,CMS和G1回收器的响应速度快,Parallel Scavenge回收器的吞吐量?

在JDK1.8环境下,默认使?的是Parallel Scavenge(年轻代)+ Serial Old(?年代)垃圾收集器。

通常情况,JVM是默认垃圾回收优化的,在没有性能衡量标准的前提下,尽量避免修改GC的?些性能配置参数。如果?定要改,那就必须基于?量的测试结果或线上的具体性能来进?调整。

原文地址:https://www.cnblogs.com/agilestyle/p/11488008.html

时间: 2024-11-10 04:31:17

GC调优的相关文章

GC调优在Spark应用中的实践[转]

作者:仲浩   出处:<程序员>电子刊5月B 摘要:Spark立足内存计算,常常需要在内存中存放大量数据,因此也更依赖JVM的垃圾回收机制.与此同时,它也兼容批处理和流式处理,对于程序吞吐量和延迟都有较高要求,因此GC参数的调优在Spark应用实践中显得尤为重要. Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的运行离不开JVM的支持.由于Sp

深入JVM系列(二)之GC机制、收集器与GC调优(转)

一.回顾JVM内存分配 需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配 1.1.内存分配: 1.对象优先在EDEN分配2.大对象直接进入老年代 3.长期存活的对象将进入老年代 4.适龄对象也可能进入老年代:动态对象年龄判断 动态对象年龄判断: 虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,当Survivor空间的相同年龄的所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代

JVM GC调优一则--增大Eden Space提高性能

缘起 线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增. 思路 思路是Tomcat本身的代码应该是没有问题的,有问题的可能是应用代码升级,或者环境改变了,总之Tomcat的优先级排在最后. 先把应用的heap dump下来分析下: jmap -dump:format=b,file=path pid 用IBM的Heap Analyser分析,发现dubbo rpc调用的RpcInvocation对象和taglibs的Si

Java GC 专家系列3:GC调优实践

本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在第二篇Java垃圾回收的监控中介绍了在真实场景中JVM是如何运行GC,如何监控GC数据以及有哪些工具可用来方便进行GC监控. 在本篇中,我将基于真实的案例来介绍一些GC调优的最佳选项.写本篇文章时,我假设你已经理解了前两篇的内容.为了深入理解本部分内容,你最好先浏览一下前两篇的内

GC 调优(实战篇) - GC参考手册

本章介绍导致GC性能问题的典型情况.相关示例都来源于生产环境, 为演示需要做了一定长度的精简. 说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间内分配的量; 同理, Promotion Rate 翻译为 提升速率; 您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册 Java中的垃圾收集 - GC参考手册 GC 算法(基础篇) - GC参考手册 GC 算法(实现篇) - GC参考手册 GC 调优(基础篇) - GC参考手册 GC

深入JVM系列(二)之GC机制、收集器与GC调优

一.回想JVM内存分配 须要了解很多其它内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配 1.1.内存分配: 1.对象优先在EDEN分配 2.大对象直接进入老年代 3.长期存活的对象将进入老年代 4.适龄对象也可能进入老年代:动态对象年龄推断 动态对象年龄推断: 虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才干晋升到老年代,当Survivor空间的同样年龄的全部对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就能够直接进入

6. GC 调优(工具篇) - GC參考手冊

进行GC性能调优时, 须要明白了解, 当前的GC行为对系统和用户有多大的影响. 有多种监控GC的工具和方法, 本章将逐一介绍经常使用的工具. 您应该已经阅读了前面的章节: 垃圾收集简单介绍 - GC參考手冊 Java中的垃圾收集 - GC參考手冊 GC 算法(基础篇) - GC參考手冊 GC 算法(实现篇) - GC參考手冊 GC 调优(基础篇) - GC參考手冊 JVM 在程序执行的过程中, 提供了GC行为的原生数据. 那么, 我们就能够利用这些原生数据来生成各种报告.原生数据(raw dat

JVM层GC调优(上)

JVM内存结构简介(jdk1.8) JVM层的GC调优是生产环境上必不可少的一个环节,因为我们需要确定这个进程可以占用多少内存,以及设定一些参数的阀值.以此来优化项目的性能和提高可用性,而且这也是在面试中经常会被问到的问题. 想要进行GC调优,我们首先需要简单了解下JVM的内存结构,Java虚拟机的规范文档如下: https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 在介绍JVM内存结构之前,我们需要先知道运行时数据区这样的一

JVM层GC调优(下)

GC日志格式 本文是 JVM层GC调优(上) 的后续,在上一篇文章中,我们介绍了JVM的内存结构.常见的垃圾回收算法以及垃圾收集器和不同收集器中的一些GC调优参数.所以通过上文,我们也对GC相关的内容有了一定的了解. 但是光知道一些调优参数是没用的,我们需要能够从GC的日志中去分析可以调优的地方,这样才能使用这些参数去进行相应的调整,所以本小节将介绍一下不同收集器的GC日志格式. 我们这里以Tomcat为例,首先需要在Tomcat的catalina.sh脚本文件中加入打印GC日志的相关参数,如下

Java GC调优

当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化.但GC算法复杂,影响GC性能的参数众多,且参数调整又依赖于应用各自的特点,这些因素很大程度上增加了GC优化的难度.即便如此,GC调优也不是无章可循,仍然有一些通用的思考方法.本篇会介绍这些通用的GC优化策略和相关实践案例,主要包括如下内容: 优化前准备: 简单回顾JVM相关知识.介绍GC优化的一些通用策略.优化方法: 介绍调优的一般流程:明确优化目标→优化→跟踪优化结果.优化案例: