这篇文章是关于最近一次性能调优的经历。跟往常一样,开始的时候总会有一些模糊的征兆。这次的现象看起来是”应用程序运行缓慢,但是我们无法获取到对应的源代码。我们该如何来解决这个问题“。
仔细观察下这个应用会发现它运行着一些批量任务。分析下性能相关的指标会发现它在运行某个特定任务的时候花费的时间太长了。进一步分析我得出了一个可量化的优化目标。我需要将这个任务预分配内存所占用的时间减少两分钟。
这个出问题的应用程序只是个非常无辜的小jar包而已。幸运的是,我对它进行了压测。
打开GC日志开关(-XX:+PrintGCTimeStamps -Xloggc:/path-to/gc.log -XX:+PrintGCDetails)后运行这个应用程序,并分析日志,很快你就会发现第一个要优化的目标。GC暂停时间加起来花了有3分半钟,这说明这块是一个优化的机会。
像这种情况一般有好几种解决办法 ,下面几种是比较简单和直接的:
修改堆的大小
调整GC算法
调整内存堆各区域的大小比例。
我选择了修改堆大小的方式。这并不是我运气好而蒙对的,是因为我最近学习了一些关于存活数据集大小和推荐的堆大小关系的东西。从GC日志中我注意到存活数据集大概是240M。因此根据我最近所了解到的知识来看,应用的最佳堆大小大概是在720M到960M之间。
不过我发现现在配置的堆大小只有300M。调整了下参数后我重新运行了下该测试用例 ,结果如下:
堆大小 |
总的GC暂停时间 | 吞吐量 |
300m | 207.48s | 92.25% |
384m | 54.13s | 97.97% |
720m | 20.52s | 99.11% |
1,440m | *11.37s | *99.55% |
号表示没有出现Full GC。
如果你光看这个结果的话可能会认为结论是” 越大越好“。如果你只看这个毫秒值的话,你这么想也是对的。但如果成功的指标中有一项是和钱有关的话,就不那么容易了。成百上千台机器上进行大规模部署的话,你这么搞 ,到时光电费单就能吓你一跳。
除此之外,这篇文章也是性能调优课程上的一个用例。如果你有一个可测量的目标并且你可以去测量它的结果而不是去猜测,那么你就已经成功了。如果我没有一个明确的目标或者没法进行压测的话,可能我现在还在东调整下西调整下那么瞎捣鼓。
原创文章转载请注明出处:
http://it.deepinmind.com
英文原文链接
分享到:
相关推荐
jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机
jvm内存调优是高级工程师以上岗位的面试中经常会被问到的问题,有一定深度和难度的问题,学习java,如果不知道jvm内存调优,说明肯定是个小菜鸟,小编总结了一些知识点供大家学习与分享
jvm常用调优方式jvm常用调优方式jvm常用调优方式jvm常用调优方式
long果 深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)。讲解相当详细,值得一看。下载仅供参考学习,侵权联删。
jvm知识点总览:jvm 内存机构、JVM监控工具、JVM调优、GC优化
最近总结JVM内存调优的一些东西,基本上是网上一些资料的汇总。 文章从算法,垃圾回收机制等多个方面对JVM的工作机制进行描述,使读者对JVM 有个全面的了解。
JVM性能调优
jvm 参数调优实践,有代码可供参考,详细调优比较!
jvm性能调优,主要讲解jvm性能调优和垃圾回收性能优化
JVM参数调优 及 JAVA相关工具使用
JVM内存调优
JAVA JVM性能调优监控工具详解
NULL 博文链接:https://younglibin.iteye.com/blog/1959816
1.2 JVM调优总结(一)-- 一些概念 4 1.3 JVM调优总结(二)-一些概念 7 1.4 JVM调优总结(三)-基本垃圾回收算法 9 1.5 JVM调优总结(四)-垃圾回收面临的问题 12 1.6 JVM调优总结(五)-分代垃圾回收详述1 14 1.7 ...
JVM 性能调优_JVM 内存区域划分.pdf
JVM性能调优-JVM内存整理及GC回收
如何配置jvm参数,并且调优,适合各路开发者,
java虚拟机(JVM)调优案例分析与MyEclipse性能调优实战
对于java底层jvm技术的介绍,以及调优策略,性能优化,对于我们开发有着极大的帮助。