并非所有基于Java的应用都需要进行GC优化,例如基于Java的系统有如下参数或行为:
- 已经通过-Xms 和 -Xmx 指定了内存大小
- 包含了 -server 参数
- 系统中未出现 超时 等日志
换句话说,如果你没有设置内存大小而且出现了大量超时日志,那么你需要在系统中进行GC优化了。
但是有件事要铭记于心:GC优化是你最后的手段。
思考下GC优化的根本原因:Java中创建的对象由垃圾收集器来清理,同时待清理对象的数量和各类GC的执行次数又和创建对象总数量成正比。因此,为了控制GC的执行,首先要做的是 减少创建对象的总数量。
俗话说,”积少成多”。我们需要关注一些小事情,否则”养成气候”之后将难以驾驭。例如:
- 使用StringBuilder或StringBuffer代替String
- 尽可能少的输出日志
然而,有些场景我们也无能为力。我们知道,XML和JSON的解析会消耗大量的内存,就算尽可能少的使用String和日志也作用不大,因为还是会使用大量的临时内存来解析它们,有时甚至是10-100M。但是,又不太可能不使用XML和JSON,只能任由内存被消耗。
如果在几次参数调整后内存使用情况有所改善,你就可以进行GC优化了。我将GC优化的目的分成两类:
1.将转移到老年代的对象数量降到最少
2.减少Full GC的执行时间
Oracle JVM提供了分代垃圾回收机制(JDK1.7及