目标

满足应用的响应时间和吞吐量需求,尽量减少GC对应用的影响

原则

  1. 大部分时候都不需要调优GC,只需配置-Xms,-Xmx即可,JVM会自动进行调整
  2. 先满足响应时间需求,再满足吞吐量需求
  3. FullGC对应用的影响更大,要尽量减少FullGC执行的时间和频率,减少转移到Old的对象数量

监控GC状态

  • 查看一下GC的总体执行情况
jstat -gcutil pid
参数 说明
YGC Minor GC执行的次数
YGCT Minor GC执行的总耗时
YGCT/YGC Minor GC平均耗时
FGC Full GC执行的次数
FGCT Full GC执行的总耗时
FGCT/FGC Full GC平均耗时
  • 查看一下GC执行的频率和详细情况
    在命令行中加入-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename
    查看GC日志中每次GC的间隔时间,即可得出GC执行的频率
    也可以使用GcViewer工具,导入GC日志,进行更详细的分析(趋势分析,什么时间段GC执行得更频繁,耗时更多等)

分析监控结果

分析GC结果,确定是否需要调优,可参考以下标准(实际标准以应用的实际情况为准)

  • Minor GC平均耗时少于50毫秒
  • Minor GC平均频率少于10秒
  • Full GC平均耗时少于1秒
  • Full GC平均频率少于10分钟

当出现OutOfMemoryError时,要确定是什么问题,是内存分配不足还是因为内存泄漏或者没有及时,可以通过jmap命令或者在命令行加入-XX:+HeapDumpOnOutOfMemoryError,然后对dump出的Heap进行分析(可以使用MAT或者jvisualvm工具)

调优GC

基本策略

  1. 代空间调整。调整Heap中各区的大小,目标是寻找一个平衡点,在不发生OutOfMemoryError的情况下,满足应用响应时间和吞吐量的需求
    增大内存,可以减少GC执行频率,但会增加GC执行时间
    减少内存,可以减少GC执行时间,但会增加GC执行频率

  2. 内存不作动态调整,因为每次调整内存(Heap或Perm)都会触发FullGC
    -Xms和-Xmx设置成相同(整个Heap大小不变)
    设置-Xmn(Young区大小不变,从而Old区的大小也不变)
    设置-XX:SurvivorRatio(Eden、两个Survivor大小不变)
    -XX:PermSize和-XX:MaxPermSize设置成相同(Perm区大小不变)

  3. 永久代和元空间的调整
    注意:永久代或者元空间内并没有保存类实例的具体信息(即类对象),也没有反射对象(如方法对象);这些内容都保存在常规的堆空间内。只在编译器或者JVM的运行时有用,这部分信息被称为“类的元数据”。
    对永久代而言,可以通过-XX:PermSize=N和-XX:MaxPermSize=N调整大小;而元空间大小可以通过-XX:MetaspaceSize=N和-XX:MaxMetaspaceSize=N调整。
  4. 避免主动触发GC
    程序调用了System.gc方法,会触发FullGC
    在命令行中加入-XX:+DisableExplicitGC,可以忽略主动GC的调用

  5. 控制并发
    除Serial收集器之外几乎所有的垃圾收集器使用的算法基于多线程。启动的线程数由-XX:ParallelGCThreads=N参数控制。下面的参数可以调整线程的数目:
    使用-XX:+UseParallelGC收集新生代空间
    使用-XX:+UseParallelOldGC收集老年代空间
    使用-XX:+UseParNewGC收集新生代空间
    使用-XX:+UseG1GC收集新生代空间
    CMS收集的“时空停顿”阶段(但并非Full GC)
    G1收集器的“时空停顿”阶段(但并非Full GC)
  6. 自适应调整
    根据调优的策略,JVM会不断地尝试,寻找优化性能的机会,所以在JVM的运行过程中,堆、代以及Survivor空间的大小都可能会发生变化。
    自适应调整在两个方面能提供重要帮助:
    A、意味着小型应用程序不需要再为指定了过大的堆而担心。
    B、意味着很多应用程序根本不需要担心它们堆的大小,如果需要使用的堆大小超过了平台的默认值,可以放心的分配更大的堆,而不用关心其他的细节。JVM会自动调整堆和代的大小,依据垃圾回收算法的性能目标,使用优化的内存量。自适应调整就是让自动调整生效的法宝。
    使用-XX:-UseAdaptiveSizePolicy可以在全局范围内关闭自适应调整功能。(如果想了解JVM空间如何调整,可以通过-XX:+PrintAdaptiveSizePolicy)

更多高级调优见《Java性能权威指南》中的6.4章节。

响应时间调优

  1. 使用-XX:+UseParallelOldGC策略

  2. 观察Minor GC的频率和耗时,确定Young大小
    确保只调整Young大小,不调整Old和Perm的大小
    耗时大,则减少Eden,频率高则增加Eden,此时Survivor大小不变
    如果耗时和频率都合适,则保持Eden大小不变,调整Survivor大小,相应要调整Young大小,主要目的是减少从Young移到Old的对象数量
    观察每次GC后是否有对象迁移到Old,如果有,则增加Survivor大小或对象Age大小,确保将对象尽可能地留在Young(设置-XX:+PrintTenuringDistribution,可以看到每次GC后Survivor的大小和各个Age对象的数量,如果Survivor满了,则增加Survivor大小,如果Survivor未满,但仍有对象迁移到Old(排除大对象),则设置age=max(age)+1,-XX:MaxTenuringThreshold=N[0-31])

  3. 观察Full GC的频率和耗时,确定Old大小
    确保只调整Old大小,不调整Young和Perm大小
    耗时大则减少Old,频率高则增加Old
    如果调整后仍然不能满足耗时需求,则考虑使用CMS策略。此时Old要增大20%-30%,因为CMS会产生碎片,要预留更多的内存给应用,否则容易产生concurrent mode error错误,会退化成Serial回收,耗时更大。如果出现concurrent mode error,可以增大Old或者减少碎片整理的百分比(-XX:CMSInitiatingOccupancyFraction=N),增大CMS的频率,加快收集Old

吞吐量调优

在满足响应时间的前提下,增加Young和Old的大小,然后再进行响应时间的分析

推荐配置

基本配置

-Xms=-Xmx
-XX:PermSize=-XX:MaxPermSize
设置-Xmn
设置-XX:SurvivorRatio
-Xss=256k(默认是1M,一般不需要那么大,如果发生StackOverflowError,则增加此值)
-XX:-UseAdaptiveSizePolicy(不允许JVM动态调整各区的大小)
-XX:+DisableExplicitGC(关闭主动GC调用)
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:filename

CMS配置

-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+ ScavengeBeforeFullGC
-XX+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=X
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:CMSInitiatingPermOccupancyFraction=80
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

转自:https://www.jianshu.com/p/b2dff817f983

GC之九--gc调优的更多相关文章

  1. GC浅析之三-性能调优经验总结

    性能调优经验总结 问题的出现: 在日常环境下,以某server 为例,该机器的每秒的访问量均值在368左右,最大访问量在913.对外提供服务的表现为每两三个小时就有秒级别的时间客户端请求超时,在访问量 ...

  2. 46张PPT弄懂JVM、GC算法和性能调优!

    来源:cnblogs.com/cyfonly/p/5807121.html 本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述. ...

  3. GC调优在Spark应用中的实践(转载)

    Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的 ...

  4. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

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

    作者:仲浩   出处:<程序员>电子刊5月B   摘要:Spark立足内存计算,常常需要在内存中存放大量数据,因此也更依赖JVM的垃圾回收机制.与此同时,它也兼容批处理和流式处理,对于程序 ...

  6. jvm系列(六):Java服务GC参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  7. 为什么Java有GC调优而没听说过有CLR的GC调优?

    前言 在很多的场合我都遇到过一些群友提这样的一些问题: 为什么Java有GC调优而CLR没有听说过有GC调优呢? 到底是Java的JVM GC比较强还是C#使用的.NET CLR的GC比较强呢? 其实 ...

  8. Java系列笔记(4) - JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...

  9. JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     转:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html光说不练假把式,学习J ...

随机推荐

  1. win10下安装VS2005运行程序出现0x000007b错误的解决方法

    项目工程一运行就报错...真心坑... 方法如下: 1.安装DirectX 9.0c 形成原因是因为DirectX 9.0被损坏, 只需要安装即可. 如果有电脑管家的.在电脑管家里面搜索“Direct ...

  2. Linux系统中DHCP的配置

    DHCP为动态主机配置协议,负责IP地址的动态分配(当一个主机的IP为自动,则不需要自己写IP,他会在DHCP服务器的范围内自动获取) 在真机或虚拟机下配置DHCP服务时,需要先下载dhcp软件,使用 ...

  3. Shell 命令行获取本机IP,grep的练习

    Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...

  4. 随手一写就是一个侧滑关闭activity

    刚忙完一段时间,今天刚清闲会,就把以前写的东西整理整理.于是冥冥中发现有些东西完全可以共享出来,毕竟那么常见,而且简单实用. 实现原因 其实侧滑关闭activity在网上也有大量的文章去介绍他,我也有 ...

  5. softmax的多分类

    关于多分类 我们常见的逻辑回归.SVM等常用于解决二分类问题,对于多分类问题,比如识别手写数字,它就需要10个分类,同样也可以用逻辑回归或SVM,只是需要多个二分类来组成多分类,但这里讨论另外一种方式 ...

  6. Ubuntu 12.04.1 OK335xS busybox-1.24.1 文件系统编译错误及解决方案

    Ubuntu OK335xS busybox- 文件系统编译错误及解决方案 一.参考文档: 编译busybox的一些错误: http://blog.csdn.net/hshl1214/article/ ...

  7. TCP的粘包

    产生原因: * tcp传输以字节流的方式发送消息,消息之间没有边界 * 发送比接受的速度快,因此不能保证每次都能及时被接收 影响 : 对每次发送的内容是一个独立的意思需要单独识别 如何处理: 1. 每 ...

  8. HDU2037 今年暑假不AC

    解题思路:贪心问题,关键突破口是,先将节目的结束时间 从小到大排个序,然后依次判断后面一个节目的开始时间 是否大于或等于前一个符合条件的节目的结束时间.见代码: #include<cstdio& ...

  9. scrapy与scrapyd安装

    Scrapy是用python编写的爬虫程序. Scrapyd是一个部署与运行scrapy爬虫的应用,提供JSON API的调用方式来部署与控制爬虫 . 本文验证在fedora与centos是安装成功. ...

  10. ueditor编辑器【实际项目使用】

    [页面效果] [代码] 说明: ueditor插件的公共代码: 如果是一个可以放在对应模块的js代码中   如果有多个就要提到全局的高度(即提到公共部分) <script type=" ...