jvm 调优 原则 步骤 方向 方法 实践
https://tech.meituan.com/2016/12/02/performance-tunning.html
https://tech.meituan.com/2017/12/29/jvm-optimize.html
https://www.jianshu.com/p/2c4b091deaa3
JVM 调优 基本是 GC调优
1 关于GC优化原则
1 首先再次声明,在进行GC优化之前,需要确认项目的代码和架构等已经没有优化空间。我们不能指望一个代码层次优化没有穷尽或者系统架构有缺陷的应用,通过GC优化令其性能达到一个质的飞跃。(就像 一位前辈说的 只要代码足够好 棋牌游戏现在日活5w 用户再增加五倍 也撑得住)
2. 其次,通过上述分析,可以看出虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反。
3. 最后,GC优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。GC优化必须建立在我们深入理解各种垃圾回收器的基础上,才能有事半功倍的效果。
2 介绍调优的一般流程:明确优化目标→优化→跟踪优化结果。
为啥要先明确目标
确定目标
明确应用程序的系统需求是性能优化的基础,系统的需求是指应用程序运行时某方面的要求,譬如: - 高可用,可用性达到几个9。 - 低延迟,请求必须多少毫秒内完成响应。 - 高吞吐,每秒完成多少次事务。
明确系统需求之所以重要,是因为上述性能指标间可能冲突。比如通常情况下,缩小延迟的代价是降低吞吐量或者消耗更多的内存或者两者同时发生。
由于笔者所在团队主要关注高可用和低延迟两项指标,所以接下来分析,如何量化GC时间和频率对于响应时间和可用性的影响。通过这个量化指标,可以计算出当前GC情况对服务的影响,也能评估出GC优化后对响应时间的收益,这两点对于低延迟服务很重要。
3 方向
1 堆的大小及各代比例调整
2 垃圾收集器选择
3 参数调整
4 方法
对象生命周期的分布情况:如果应用存在大量的短期对象,应该选择较大的年轻代;如果存在相对较多的持久对象,老年代应该适当增大。
代码缓存调优(Tuning the Code Cache)
当JVM对代码进行编译后,被编译的代码以汇编指令的形式存在于代码缓存中(Code Cache),显然这个缓存区域也是有大小限制的,当此区域被填满了之后,编译器就不能够再编译其他Java字节码了。
Code Cache的最大空间可以通过:-XX:ReservedCodeCacheSize=N来进行设置。
内存溢出: