首页 > 编程语言 >一次Java垃圾收集调优实战

一次Java垃圾收集调优实战

时间:2023-07-24 16:03:27浏览次数:34  
标签:实战 Java 新生代 XX 调优 gc GC minor


1 资料

2 GC日志打印

  GC调优是个很实验很伽利略的活儿,GC日志是先决的数据参考和最终验证:



-XX:+PrintGCDetails -XX:+PrintGCTimeStamps(GC发生的时间) -XX:+PrintGCApplicationStoppedTime(GC消耗了多少时间) -XX:+PrintGCApplicationConcurrentTime(GC之间运行了多少时间)



 

3 收集器选择

CMS收集器:暂停时间优先

   配置参数:-XX:+UseConcMarkSweepGC
   已默认无需配置的参数:-XX:+UseParNewGC(Parallel收集新生代) -XX:+CMSPermGenSweepingEnabled(CMS收集持久代) -XX:UseCMSCompactAtFullCollection(full gc时压缩年老代)

   初始效果:1g堆内存的新生代约60m,minor gc约5-20毫秒,full gc约130毫秒。

Parallel收集器:吞吐量优先

    配置参数: -XX:+UseParallelGC -XX:+UseParallelOldGC(Parallel收集年老代,从JDK6.0开始支持)

    已默认无需配置的参数: -XX:+UseAdaptiveSizePolicy(动态调整新生代大小)

    初始效果:1g堆内存的新生代约90-110m(动态调整),minor gc约5-20毫秒,full gc有无UseParallelOldGC 参数分别为1.3/1.1秒,差别不大。

    另外-XX:MaxGCPauseMillis=100 设置minor gc的期望最大时间,JVM会以此来调整新生代的大小,但在此测试环境中对象死的太快,此参数作用不大。

4 调优实战

      Parallel收集高达1秒的暂停时间基本不可忍受,所以选择CMS收集器。

      在被压测的Mule 2.0应用里,每秒都有大约400M的海量短命对象产生:

  1. 因为默认60M的新生代太小了,频繁发生minor gc,大约0.2秒就进行一次。
  2. 因为CMS收集器中MaxTenuringThreshold(生代对象撑过过多少次minor gc才进入年老代的设置)默认0,存活的临时对象不经过Survivor区直接进入年老代,不久就占满年老代发生full gc。

     对这两个参数的调优,既要改善上面两种情况,又要避免新生代过大,复制次数过多造成minor gc的暂停时间过长。

  1. 使用-Xmn调到1/3 总内存。观察后设置-Xmn500M,新生代实际约460m。(用-XX:NewRatio设置无效,只能用 -Xmn)。
  2. 添加-XX:+PrintTenuringDistribution 参数观察各个Age的对象总大小,观察后设置-XX:MaxTenuringThreshold=5。

      优化后,大约1.1秒才发生一次minor gc,且速度依然保持在15-20ms之间。同时年老代的增长速度大大减缓,很久才发生一次full gc,

      参数定稿:



-server -Xms1024m -Xmx1024m -Xmn500m -XX:+UseConcMarkSweepGC   -XX:MaxTenuringThreshold=5  -XX:+ExplicitGCInvokesConcurrent



 

      最后服务处理速度从1180 tps 上升到1380 tps,调整两个参数提升17%的性能还是笔很划算的买卖。

 

     另外,JDK6 Update 7自带了一个VisualVM工具,内里就是之前也有用过的Netbean Profiler,类似JConsole一样使用,可以看到线程状态,内存中对象以及方法的CPU时间等调优重要参考依据。免费捆绑啊,Sun 这样搞法,其他做Profiler的公司要关门了。


<iframe id="aswift_0" style="left: 0px; position: absolute; top: 0px;" name="aswift_0" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="234" height="60"></iframe>


 

标签:实战,Java,新生代,XX,调优,gc,GC,minor
From: https://blog.51cto.com/u_16087105/6836053

相关文章

  • jvm参数调优
    PE29508G 双cpu,每cpu四核,raid1,两个tomcat6.0.14 1.JAVA_OPTS='-server-Xms2560m-Xmx2560m-Xmn768m-XX:PermSize=128m-XX:MaxPermSize=256m<strong>-Xss256k</strong>2.6-XX:+UseConcMarkSweepGC-XX:+UseParNewGC-XX:MaxTenuringThreshold=5......
  • JavaScript基础-数组(进阶)
    扩展运算符letarr1=[1,2],arr2=[3,4];letarr3=arr1.concat(arr2);letarr4=[...arr1,...arr2]console.log(arr4);用concat 连接然后...展开letarr1=[1,2];letarr2=[...arr1]console.log(arr1,arr2);把arr1的值传给arr2,输出[1,2][1,2]......
  • 【后端面经-Java】String与StringBuffer与StringBuilder的比较
    目录1.String2.StringBuffer3.StringBuilder4.性能提升5.总结和比较面试模拟参考资料1.String不可变查看String源码如下:publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence{/**Thevalueisusedforcharacterstora......
  • 【项目实战】Kafka 的 Leader 选举和负载均衡
    ......
  • Java基础--2021Java面试题系列教程--大白话解读
    前言序言再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点。适合阅读人群Java学习者和爱好者,有一定工作经验的技术人,准面试官等。阅读建议本教程是系列教程,包含Java基础,JVM,容器,多线程,反射,异常,网络,对象拷贝,JavaWeb,设计模式,Spring-SpringMVC,SpringB......
  • Mybatis实战教程
    欢迎大家前来白嫖PDF。下图回复:666本教程致力于最实用mybatis教程,个别图片粘贴有丢失,还有来领取原版。文章目录前言1,什么是Mybatis之JDBC攻城狮1,1,使用idea构建maven工程1,2,引入mysql依赖包1,3,准备数据1,4,jdbc代码回顾1,5,jdbc缺点分析4,MyBatis介绍3,MyBatis整体架构4,快速入门(quicksta......
  • rodert教你学Maven-实战这一篇就够了
    欢迎大家前来白嫖PDF。下图回复:666本教程致力于最实用教程,个别图片粘贴有丢失,还有来领取原版。文章目录前言1.什么是Maven?2.maven的作用2.1.Maven的功能2.2.为什么使用maven3.maven安装和配置3.1.安装3.2.配置4.maven项目规约5.命令行构建maven项目5.1.命令行构建Java项目5.2.使用......
  • Golang 规则引擎原理及实战
    本文主要介绍规则引擎在golang中的使用,将首先介绍golang中主要的规则引擎框架,然后利用golang原生的parser搭建一个简单的规则引擎实现基本的bool表达式解析工作。背景随着业务代码的不断迭代,诞生出了越来越多的if-else,并且if-else中的逻辑越来越复杂,导致代码逻辑复......
  • 【项目实战】Kafka 重平衡 Consumer Group Rebalance 机制
    ......
  • 济南 S NOIP 刷题实战梳理营游记
    前言期末砸力。这次暑假去两个营,一个在烟台,一个在青岛。在烟台的都是学算法,扔到目录里了,这篇文章就是来讲济南营的。一共十二天,每天上午八点到十二点打比赛,然后吃饭,然后讲题。Day-1\(6h\)的大巴,绷不住了,中途在潍坊西休息,热死了。到了济南,住在酒店旁边,楼下全是吃的,很赞。......