当前位置: 首页 > news >正文

Java垃圾收集调优实战

1 资料

  • JDK5.0垃圾收集优化之--Don't Pause(花钱的年华)
  • 编写对GC友好,又不泄漏的代码(花钱的年华)
  • JVM调优总结
  • JDK 6所有选项及默认值

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,

      参数定稿:

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

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

转载于:https://www.cnblogs.com/doudouxiaoye/p/5685318.html

相关文章:

  • jqeury轮播图插件 简单教程(适合新手)
  • android 文件的权限
  • 研磨设计模式之 策略模式--转
  • Android 完美退出 App (Exit)
  • 初识 linux 正则表达式
  • swift - UILabel的用法
  • 抽象类是否可继承实体类的问题
  • CAS客户端票据分发问题
  • 实用 —— PowerCLI (二)
  • Java集合-----java集合框架常见问题
  • 本地通知和推送通知编程指南
  • web.xml文件的作用
  • 计算机网络笔记--绪论(一)
  • 三星GT-S7562i 刷机 完整版
  • .NET中使用Redis (二)
  • php的引用
  • 0基础学习移动端适配
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • JavaScript设计模式与开发实践系列之策略模式
  • Laravel Telescope:优雅的应用调试工具
  • mongo索引构建
  • Mysql数据库的条件查询语句
  • Node 版本管理
  • React系列之 Redux 架构模式
  • React中的“虫洞”——Context
  • tab.js分享及浏览器兼容性问题汇总
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 开发基于以太坊智能合约的DApp
  • 爬虫模拟登陆 SegmentFault
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 实战|智能家居行业移动应用性能分析
  • 我的面试准备过程--容器(更新中)
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用Python写一份独特的元宵节祝福
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​VRRP 虚拟路由冗余协议(华为)
  • #100天计划# 2013年9月29日
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma once
  • (003)SlickEdit Unity的补全
  • (1)STL算法之遍历容器
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (备忘)Java Map 遍历
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (三分钟)速览传统边缘检测算子
  • (实战篇)如何缓存数据
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .java 9 找不到符号_java找不到符号
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务