小机灵鬼|troubleshoot之:GC调优到底是什么
简介我们经常会听到甚至需要自己动手去做GC调优 。 那么GC调优的目的到底是什么呢?让程序跑得更快?让GC消耗更少的资源?还是让程序更加稳定?
带着这些疑问来读一下这篇文章 , 将会得到一个系统的甚至是不一样的结果 。
那些GC的默认值其实GC或者说JVM的参数非常非常的多 , 有控制内存使用的:
有控制JIT的:
有控制分代比例的,也有控制GC并发的:
当然 , 大部分的参数其实并不需要我们自行去调整 , JVM会很好的动态帮我们设置这些变量的值 。
如果我们不去设置这些值 , 那么对GC性能比较有影响的参数和他们的默认值有哪些呢?
GC的选择我们知道JVM中的GC有很多种 , 不同的GC选择对java程序的性能影响还是比较大的 。
在JDK9之后 , G1已经是默认的垃圾回收器了 。
我们看一下G1的调优参数 。
G1是基于分代技术的 , 其实JVM还在开发一些不再基于分代技术的GC算法 , 比如ZGC , 我们可以根据需要来选择适合我们的GC算法 。
GC的最大线程个数GC是由专门的GC线程来执行的 , 并不是说GC线程越多越好 , 这个默认线程的最大值是由heap size和可用的CPU资源动态决定的 。
当然你可以使用下面两个选项来修改GC的线程:
-XX:ParallelGCThreads=threads 设置STW的垃圾收集线程数 -XX:ConcGCThreads = n 设置并行标记线程的数量一般情况下ConcGCThreads可以设置为ParallelGCThreads的1/4 。
初始化heap size默认情况下加初始化的heap size是物理内存的1/64 。
你可以使用
-XX:InitialHeapSize=size来重新设置 。
最大的heap size默认情况下最大的heap size是物理内存的1/4 。
你可以使用:
-XX:MaxHeapSize来重新设置 。
分层编译技术默认情况下分层编译技术是开启的 。 你可以使用:
-XX:-TieredCompilation来关闭分层编译 。 如果启用了分层编译 , 那么可能需要关注JIT中的C1和C2编译器带来的影响 。
我们到底要什么鱼 , 我所欲也 , 熊掌亦我所欲也;二者不可得兼 , 舍鱼而取熊掌者也 。 –孟子
java程序在运行过程中 , 会发生很多次GC , 那么我们其实是有两种统计口径:
- 平均每次GC执行导致程序暂停的时间(Maximum Pause-Time Goal) 。
- 总的花费在GC上的时间和应用执行时间的比例(Throughput Goal) 。
我们可以通过设置:
-XX:MaxGCPauseMillis=来控制这个值 。不管怎么设置这个参数 , 总体需要被GC的对象肯定是固定的 , 如果单次GC暂停时间比较短 , 可能会需要减少heap size的大小 , 那么回收的对象也比较少 。 这样就会导致GC的频率增加 。 从而导致GC的总时间增加 , 影响程序的Throughput 。
推荐阅读
- 小机灵鬼|干货速来!透彻剖析微服务架构设计模式,深入开发Java有奇效
- 执笔抒情|万茜发文向宁静郁可唯几位姐姐道歉,配图还在抖机灵
- 小机灵鬼|央视重磅关注天府新区这件事
- NBA|原创万茜发文向宁静郁可唯几位姐姐道歉,配图还在抖机灵
- 小机灵鬼|小米截胡?雷军宣布第三代自研屏下摄像头明年量产,中兴黯然失色
- 小机灵鬼|4K屏设计专业神器!ROG幻15成开学季最香生产力工具
- 小机灵鬼|带你看看世界电力“皇冠上的明珠”的中国智慧
- 小机灵鬼|日本学生参加线上学校旅行 远程操控机器人参观全日空
- 小机灵鬼|苹果12还未发布,就被扒出5大缺点,郭台铭:中国离不开苹果
- 穿搭|张嘉译娶了个“宝”,51岁王海燕低调优雅,抿起嘴让人心都化了
