1、多数的Java应用不需要在服务器上进行GC优化
2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题
3、在应用上线前,先考虑将JVM参数设置到最优
4、减少对象创建的数量
5、减少全局变量和大对象
6、GC优化是最后不得已才使用的手段,在实际应用中,分析GC情况优化代码比优化GC参数要多得多
GC调优的目的:
将转移到老年代的对象数量降低到最少,减少GC的执行时间
策略1:将新对象预留在新生代,由于FullGC的成本远远高于MinorGC,因此尽可能将对象分配在新生代是明智的做法,实际项目
中 根据GC日志分析新生代空间大小分配是否合理,适当通过-Xmn来调节新生代大小,最大限度降低对象直接进入老年代
策略2:大对象直接进入老年代,虽然大部分对象分配在新生代是合理的,但是对于大对象值得商榷,大对象如果首次在新生代分配可能出现空间不足导致很多年龄小的对象被分配到老年代,破坏新生代的对象结构,可能会出现频繁GC。因此对于大对象,可以设置直接进入老年代。-XX:PretenureSizeThreshold可以设置直接进入老年代的对象大小
策略3:合理设置进入老年代对象的年龄,-XX:MaxTenuringThredhold 设置进入老年代对象的年龄大小,减少进入老年代的内存占用,降低fullGC的发生
策略4:设置稳定的堆内存大小 -Xms -Xmx
策略5:不需要优化
MinorGC执行时间<50ms
MinorGC执行不频繁,约10s一次
FullGC执行时间< 1s
FullGC执行不频繁,不低于10分钟1次