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的频率。