java开发一般都会涉及到jvm调优其中gc调优是个重点项。那gc调优调整的究竟是什么呢准确来说是业务。下面围绕这个话题展开

  起因

  为什么说是业务呢得从cc++开始说起如果说是用c/c++做开发运行的效果是比较稳定的。毕竟没有gc这种问题也就没有什么gc造成的停顿没有响应。但是c/c++开发要比java慢尤其是跨平台运行的程序需要不停的做宏定义区分系统的区别。包括开源的库还有框架整体是比java少的。java的框架特别多可以说如果面对的是比较成型的业务那么基本就是java框架的应用并不会自己重头来做。所以java开发效率上带来了极大的便利。

  java的缺点也就是他的垃圾回收。java没有delete这样释放内存的操作这个本来算是个有点不需要过多的操心内存泄漏问题。他的结局方案是垃圾回收器。会导致带来的短暂停顿然后jvm去做对象回收。

  业务

  虽然有以上的问题但是业务场景确实是多样的根据业务场景调优这个才是我们要做的。业务场景大概能分为以下几种

  任务型

  交互型

  任务型

  任务型主要是执行一段代码一旦执行不需要过多的交互。例如计算一个月的数据等等大多数的表现都是计算出结果就完毕一般就是希望全力跑出结果对应到java里的部分就是在乎吞吐量。吞吐量就是业务执行时间/gc时间+业务执行时间。

  任务型的情况parallel gc基本就是唯一选择我们只需要注意-XX:GCTimeRatio这个参数即可公式为1/1+N默认为99表示吞吐量gc只占用1%的时间剩下99%都是业务执行。

  交互型

  交互型的一般表现为我们的网站这种需要人参与的。这种情况下响应速度就比较重要了gc了5秒那么jvm停顿5秒这个显然是不能接受的。

  一般首选cms。cms的优点是老年带回收时分多个步骤只有初始标记和再次标记是stw的。其余的步骤并不会导致jvm业务停顿由于gc线程和业务线程并行在跑响应也不会和没有gc时的一样好。

  cms的问题在于浮动垃圾最终会采取单线程回收老年代的情况会有次回收导致时间特别长。

  G1相对缓解了cms浮动垃圾的问题他通过region管理堆对象的分配可以规整管理。G1也有fullgc的问题。也需要合理的避免。

  特例

  上面说明了大多数场景的选择但是具体还需要根据自己的场景来测试例如虽然是个交互型但是用的堆少物理机的机器资源很多那么这种场景下parallel gc不一定比cms表现差虽然他gc的时候整体停顿了但是堆小gc线程多。压测起来qps比cms更好。

  观察方式

  gc的初步选择已经出来了接下来需要调整具体的搭配的gc参数了。这时候就需要一个观察者来看调整的参数知否有效。选择的方式有很多比较建议prometheus的方案主要是他是开源且简单搭建的可以通过grafana把参考的指标都打出来。我们就可以通过查看曲线图等等对参数调整的状态有一个比较直观的认知这里不用通过日志来看图像更直观一点日志中的细节很多但是随着时间线的对比确实是不直观。

  小结

  gc调优需要分析业务资源选择几种垃圾回收器的组合然后通过类似prometheus这样的监控来对比gc各种参数以及配套参数中的细节效果。

gc调优我们到底在调整什么的更多相关文章

  1. troubleshoot之:GC调优到底是什么

    目录 简介 那些GC的默认值 GC的选择 GC的最大线程个数 初始化heap size 最大的heap size 分层编译技术 我们到底要什么 最大暂停时间 吞吐率 简介 我们经常会听到甚至需要自己动 ...

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

    本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种G ...

  3. 性能测试系列-java gc调优

    性能测试中除了需要做好性能测试外,我们还需要做性能测试后的,性能调优,需要发现性能问题,也需要做性能调优,在做性能调优中,jvm的性能调优是经常遇到的一个. 随着jdk版本的迅速变化,jdk里面的GC ...

  4. 八张图彻底了解JDK8 GC调优秘籍-附PDF下载

    目录 简介 分代垃圾回收器的内存结构 JDK8中可用的GC 打印GC信息 内存调整参数 Thread配置 通用GC参数 CMS GC G1参数 总结 简介 JVM的参数有很多很多,根据我的统计JDK8 ...

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

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

  6. GC参考手册 —— GC 调优(基础篇)

    GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理.初学者可能会被 200 多个 GC参数弄得一头雾水, 然后随便调整几个来试试结果,又或者修改几行代码来测试.其 ...

  7. GC调优

    Gc调优的目标:1.降低停顿时间 2.提高吞吐量 3.避免full-gc 调优可以使用的手段:1.各个内存区的大小调整:堆,年轻代,老年代,方法区等等2.减少短暂对象的存活时间,提高长期对象的复用率( ...

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

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

  9. GC调优入门笔记

    想给项目代码做做调优但有许多疑惑,比如有哪些参数要调.怎么调.使用什么工具.调优的效果如何定量测量等.发现Oracle的这份资料不错,简洁直接,回答了我的许多问题,给了许多很实用的大方向上的指导.将其 ...

随机推荐

  1. shell 冒号

    : ${TEST_LOOP:='1'} 如果不在前面加上:(冒号)命令,那么就会把${TEST_LOOP:='1'}本身当做一个命令来执行,报错是肯定的. [root@node56 ~]# : abc ...

  2. 从2D图片生成3D模型(3D-GAN)

    https://blog.csdn.net/u014365862/article/details/54783209 3D-GAN是使用生成对抗网络学习2D图像到3D模型的映射,生成网络负责生成3D模型 ...

  3. Golang的值类型和引用类型的范围、存储区域、区别

    常见的值类型和引用类型分别有哪些? 值类型:基本数据类型 int 系列, float 系列, bool, string .数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变 ...

  4. ORA-38301:can not perform DDL/DML Over Object in Recycle Bin 11.2.0.4

    我们最近有两台测试服务器在oci direct load期间出现下列异常: 从表象上看,是我们在对表执行ddl操作,确实内部也是用了truncate table XXX,可是这个XXX并不是回收站里面 ...

  5. linux 计划任务 crontab 简单用法

    添加计划任务: 方法1: crontab -e 方法2: vim /etc/crontab #这种方式进去的文件有个sample可供参考 查看已经启动的任务:crontab -l 查看运行状态:ser ...

  6. 【python39--面向对象组合】

    一.组合 定义:当几个对象是水平方向的时候,就应该考虑组合,当对象是纵向的时候用继承,组合就是用一个类把2个平级层次的类放在一起,然后实例化就可以了 #现在定义一个类,叫水池,水池里面有鱼和乌龟cla ...

  7. 王之泰201771010131《面向对象程序设计(java)》第一周学习总结

    王之泰201771010131<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.co ...

  8. git如何修改用户名和邮箱名?

    答: 使用git config --global --edit即可进行修改

  9. SpringBoot 整合使用dubbo

    这里主要是按照teaey作者的spring-boot-starter-dubbo框架进行一些变化的使用 依赖包: <dependency> <groupId>com.aliba ...

  10. 题解——loj6281 数列分块入门5 (分块)

    分块 若块内最大值为0或1,则不用再开方 然后暴力修改 可以证明,如果开方后向下取整,则最多开方4次一个数就会变成0或1 #include <cstdio> #include <cm ...