JAVA性能优化笔记(一)

1.为每个线程生成自己的Random对象,因为不同线程在使用Random对象时,为更新一个内部种子而竞争。

2.使用ConcurrentHashMap而不是SynchronizedMap

3.使用各Collection类、StringBuilder和StringBuffer时,预先给定一个容量大小,因为自动扩容会占用不少的CPU。

4.对生产环境可以用 -server -XX:TieredCompilation 启动JVM,让JVM更多的优化代码.

5.2G~32G环境,用 -d64 -XX:+UseCompressedOops

6,32G以上环境,用 -d64

7.使用 -XX:+UseParallelOldGC 来启用多程的垃圾回收,如果不支持 -XX:+UseParallelOldGC ,可以用 -XX:+UseParallelGC 只开启多线程新生代垃圾回收

8.用 -Xms 和 -Xmx 将 JVM的堆空间最小值和最大值设定为相同大小,可以减少动态调整空间,fullGC对系统的影响。

9.用 -Xmn  将 JVM的新生代空间最小值和最大值设定为相同大小,可以减少动态调整空间,fullGC对系统的影响,仅在前一条配置下生效。

10.用 -XX:PermSize 和 -XX:MaxPermSize 指定JVM永久代的大小为相同值,可以减少动态调整空间,fullGC对系统的影响

11.大小设定经验:不设置空间参数,让系统正常运行一段时间,收集在JVM自动进行FullGC后几个空间的大小,堆空间大小建议值为FullGC后时老年代大小的3~4倍。永久代的大小建议值为FullGC后永久代大小的1.2~1.5倍。新生代空间建议值为FullGC时老年代大小1~1.5倍。

12.如果MinorGC的时间过长,超过系统可接受的最大停顿时间,减小新生代空间,不得小于总堆大小的10%如果MinorGC的过于频繁,超过系统可接受的停顿频率,增大新生代空间。

13.如果日志中只有FullGC,每次老年代空间并得到足够的释放,需增加老年代空间的大小。

14.如果启用 -XX:+UseConcMarkSweepGC ,采用CMS收集器并行的老年代GC时,需增大老年代大小约20~30%,因为并发的老年代GC需要的时间更长,增加空间能减少GC的频率。

    为GC申请最大内存原则:让老年代空间大到足以避免由堆内存碎片引起的Stop-The-World压缩,Stop-The-World压缩是因为空间在使用中发生了碎片化,必须要停下来对空间进行一次重新整合。

    MinorGC回收原则:减少从新生代空间提升到老年代的比率,也就是说尽量让对象在对新生代进行MinorGC时就回收掉,提升到老年代后再回收的成本要高,可通过调整新生代中Survivor空间的大小,使其有足够的空间来容纳对象足够长的时间。使用 -XX:SurvivorRatio 配置Eden空间是与一个Survivor空间的倍数。如配置为4,一个Survivor大小=新生代空间/(4+1+1)。配置值越大,Eden空间越小,MinorGC越频繁,对象老化越快。增大Survivor空间大小时,应同步增加整个新生代空间的大小。

15.使用 -XX:CMSInitiatingOccupancyFraction 配置CMS收集器在老年代空间占用到百分之多少时,进行第一次回收。-XX:+UseCmsInitaitionOccupancyOnly 指定一直使用这个比例进行回收。恰当的回收比例可以减少发生老年代溢出的几率。建议让系统正常运行,进行几次自动FullGC后,求几次FullGC后老年代的大小的平均值,恰当的回收比例应为此大小的1.5倍。其若平均值为300M,那应该配置占用到450M时进行回收,若整个老年代的大小为600M,这个比例值为75。




你可能感兴趣的:(JAVA性能优化笔记(一))