JVM性能优化


JVM的性能优化可以分为代码层面和非代码层面。  在代码层面,大家可以结合字节码指令进行优化, 1、比如一个循环语句,可以将循环不相关的代码提取到循环体之外,这样在字节码层面就不需要重复执行这些代码了。 2、finally 中级的关闭资源 3、 适用集合框架的时候指定长度,防止他不够的时候,扩容,导致资源浪费。   在非代码层面,一般情况可以从参数、内存、GC以及cpu占用率等方面进行优化。 注意,JVM调优是一个漫长和复杂的过程,而在很多情况下,JVM是不需要优化的,因为JVM本身已经做了很多的内部优化操作,大家千万不要为了调优和调优。 1.1 参数优化
(1)‐XX:MaxTenuringThreshold 2 
该参数主要是控制新生代需要经历多少次GC晋升到老年代中的最大阈值。在JVM中用4个bit存储(放在对象头中),所以其最大值是15。
但并非意味着,对象必须要经历15次YGC才会晋升到老年代中。例如,当survivor区空间不够时,便会提前进入到老年代中,但这个次数一定不大于设置的最大阈值。
(2)‐XX:PretenureSizeThreshold 5 超过多大的对象直接在老年代分配,避免在新生代的Eden和S区不断复制 67 
(3)‐XX:+/‐ UseAdaptiveSizePolicy 8
会动态调整 Eden、Survivor 的大小,有些情况存在Survivor 被自动调为很小,比如十几MB甚至几MB的可能,这个时候YGC回收掉 Eden区后,还存活的对象进入Survivor 装不下,
就会直接晋升到老年代,导致老年代占用空间逐渐增加,从而触发FULL GC,如果一次FULL GC的耗时很长(比如到达几百毫秒),那么在要求高响应的系统就是不可取的。
(4)‐XX:SurvivorRatio 11 默认值为8 
它定义了新生代中Eden区域和Survivor区域(From幸存区或To幸存区)的比例,默认为8,也就是说Eden占新生代的8/10,From幸存区和To幸存区各占新生代的1/10 
1.2 内存调优   可以根据业务场景,挑战yang:old 区的比例。比如秒杀。默认 old:yang = 2:1 如果公司内存紧张,可以短暂调到 1:2. 1.3 GC调优  根据不同GC垃圾收集器的特性。为不同的区域选择为不同GC垃圾收集器。   1.8JVM性能优化指南  
JVM