jvm优化原则是什么

尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。核心是STW的时间,相对于YoungGC,FullGC会有很长的STW时间。所以JVM优化首先就是减少FullGC执行次数和时间。

怎样减少FullGC?

就是让对象尽可能少的进入老年代!对象进入老年代有四个条件:
  1. 存活对象达到年龄阈值(默认为15)根据实际情况可以通过参数 -XX:MaxTenuringThreshold 来设置年龄阈值
  2. 大对象直接进入老年代(超过了JVM中-XX:PretenureSizeThreshold参数的设置)
  3. Survivor中如果有年龄1+年龄2+… 年龄n的对象所占空间大于Survivor的一半,那么年龄大于等于年龄n的对象就可以直接进入老年代。(动态对象年龄判定)
  4. Young GC后,Survivor区空间不能容纳全部存活对象,直接进入老年代。
  • 针对条件2:所以在写程序的时候要尽量避免大对象,更要尽量避免朝生夕死的大对象
  • 针对条件3:Survivor区要足够大,每次YGC剩余的存活对象最好不超过Survivor的一半
  • 针对条件4:Survivor要足够大