复杂的东西我们可不喜欢。一直以来,内存泄露,线程锁,GC调优这些东西处理起来都很痛苦。这三个邪恶的小伙伴带来的性能问题是最难复现的,这也使得修复这些问题有如噩梦一般。如果你不信的话,看一下LinkedIn最近关于性能调优的
一篇文章就知道了。
尽管这篇文章很好的剖析了性能调优的过程,但它也很好的证明了这个领域的复杂性。LinkedIn的工程师进行GC调优改善吞吐量和延迟用的是下面这组参数:
-server -Xms40g -Xmx40g -XX:MaxDirectMemorySize=4096m -XX:PermSize=256m -XX:MaxPermSize=256m-XX:NewSize=6g -XX:MaxNewSize=6g -XX:+UseParNewGC -XX:MaxTenuringThreshold=2
-XX:SurvivorRatio=8 -XX:+UnlockDiagnosticVMOptions -XX:ParGCCardsPerStrideChunk=32768
-XX:+UseConcMarkSweepGC -XX:CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled
-XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
-XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:-OmitStackTraceInFastThrow
知道这些参数的人请举手。知道一半的也行。为了让这组配置能满足LinkedIn对延迟时间和吞吐量的要求,处理过程大概是这样的:
1. 收集信息了解当前的情况。在调优之前你得先知道底层的问题具体是什么。在上面那个案例中,看起来应该是频繁的长时间的GC暂停惹的祸,不过也有可能是锁或者内存泄露的问题,或者是别的什么问题。我们先假设你运气不错,GC暂停就是你要优化的地方了。
2. 接下来,你得知道如何去收集GC暂停的数据。先跟这组参数打声招呼吧( -XX:+PrintGCDetails -XX:+PrintGCTimeStamps),它们会把GC暂停的数据给你的。
3. 现在你得能够读懂这些数据。如果之前没有过经验的话,要在上百页的下面这些数据中掏出东西可不是什么美差事:
0.167: [Full GC [PSYoungGen: 3071K->0K(3584K)] [ParOldGen: 8191K->227K(7168K)] 11263K->227K(10752K) [PSPermGen: 2544K->2544K(21504K)], 0.0064320 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
0.173: [GC [PSYoungGen: 0K->0K(3584K)] 227K->227K(11776K), 0.0004670 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
我再假设你有一根魔杖,能在这些日志中点出问题所在的地方。那现在你得分清楚CMS和G1的区别,知道在什么时候该用哪一个 (-XX:+UseParNewGC是新生代的,而-XX:+UseConcMarkSweepGC是指老生代的) ,还得弄明白eden区和suvivor区的区别,并正确的设置它们的大小(-XX:NewSize=6g -XX:MaxNewSize=6g -XX:MaxTenuringThreshold=2 -XX:SurvivorRatio=8)。
这只是个开始,如果你看过原文,你会发现最终的配置里面还包含GC工作线程的调优,堆碎片的优化甚至是操作系统页面交换的处理。好吧,如果之前听说过 -XX:ParGCCardsPerStrideChunk参数的也请举下手看看。
现在这篇文章可不止是发发牢骚而已了。如果上面这些东西让你感觉到一团糟的话,你或许会对我们实验室研发了一段时间的这个产品感兴趣,我们也很愿意将它分享给更多的人。就在上个月,我们挑选出一批用户,试用了Plumbr,它能对你的程序的GC行为进行分析,并给你推荐合适的参数配置。
如果你再也不想看到长时间的GC暂停,或者想确定下吞吐量或者延迟有没有问题的话——
把你的邮箱留下,我们很乐意把这款GC优化工具的beta版发给你。
译注:到最后发现是篇软文?不过他们的网站上面确实有不少不错的文章,相信plumbr应该也是款不错的产品。
原创文章转载请注明出处:
http://it.deepinmind.com
英文原文链接
分享到:
相关推荐
JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...
### JVM_GC调优详解 #### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,我们首先来了解一下JVM的基本组成部分。 1. **类装载器子系统(Class ...
**JVM体系结构与GC调优** Java虚拟机(JVM)是Java应用程序的核心组成部分,它为Java程序提供了一个运行时环境。理解JVM的体系结构对于优化Java应用的性能至关重要,尤其是垃圾收集(Garbage Collection, GC)的...
大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...
jvm体系结构与GC调优,图文齐飞,方便理解,,非常适合入门的java工程师以及性能测试工程师阅读,欢迎大家下载
JVM体系结构与GC调优
GC调优是优化Java应用程序性能的关键环节,尤其是在大型系统中,正确配置和调整GC参数可以显著减少程序暂停时间,提高整体运行效率。 在Java中,堆内存是GC的主要工作区域,它分为新生代、老年代和永久代(Java 8...
在Java应用程序中,尤其是对于大型系统或高并发环境,进行JVM GC调优是提升性能、减少系统停顿时间的关键步骤。"用于测试jvm gc调优-share-jvm-gc.zip"这个压缩包文件很可能包含了一些工具、脚本或教程,用于帮助...
在《浅谈JVM内存管理》的PPT中,可能包含了对上述概念的详细讲解,包括JVM内存模型的解析、GC算法的工作原理、如何配置和调整GC参数,以及通过实例分析GC调优的具体步骤。通过学习这个PPT,开发者可以深入理解JVM...
JVM体系结构与GC调优
GC(Garbage Collection)调优和JVM调优是优化Java应用性能的关键环节,尤其是在处理大量数据或者高并发场景时显得尤为重要。 GC调优主要是对JVM的垃圾回收机制进行调整,以确保内存的有效利用和避免系统出现长时间...
Java GC与性能调优 Java GC与性能调优是 Java programming language 中非常重要的一部分,直接影响着 Java application 的性能。本文档将对 Java GC 与性能调优进行详细的介绍。 一、 Java 平台的逻辑结构 Java ...
JVM体系结构与GC调优,46页+PPT,包括JVM体系结构概述、GC算法介绍、内存管理、垃圾回收、调优方法和监控工具