1. 将JDK动态代理生成的类保存为 .class文件

1
java -Djdk.proxy.ProxyGenerator.saveGeneratedFiles=true foo.jar

2. CMS垃圾回收器

  • Concurrent Mark Sweep 并发标记清除。
  • CMS的特点是垃圾回收线程和应用程序线程是并发执行的,相对于Stop The World来说,停顿时间较少。
  • 使用的是标记清除算法,运作过程为四个步骤,分别是初始标记、并发标识、重新标记、并发清除。
  • 因使用标记清除算法,故会产生内存空间碎片。又因内存空间是连续的,所以当空间足够、碎片较多时,不得已会进行FullGC。
1
2
3
4
5
6
7
8
9
10
11
-XX:+UseConcMarkSweepGC 激活CMS收集器
-XX:+CMSParallelRemarkEnabled 并行运行最终标记阶段,加快最终标记的速度
-XX:ConcGCThreads 设置CMS线程的数量
-XX:+UseCMSInitiatingOccupancyOnly 只根据老年代使用比例来决定是否进行CMS
-XX:CMSInitiatingOccupancyFraction 设置触发CMS老年代回收的内存使用率占比
-XX:+CMSParallelRemarkEnabled 并行运行最终标记阶段,加快最终标记的速度
-XX:+UseCMSCompactAtFullCollection 每次触发CMS Full GC的时候都整理一次碎片
-XX:CMSFullGCsBeforeCompaction=* 经过几次CMS Full GC的时候整理一次碎片
-XX:+CMSClassUnloadingEnabled 让CMS可以收集永久带,默认不会收集
-XX:+CMSScavengeBeforeRemark 最终标记之前强制进行一个Minor GC
-XX:+ExplicitGCInvokesConcurrent 当调用System.gc()的时候,执行并行gc,只有在CMS或者G1下该参数才有效

3. 调整内存

-XX:NewRatio=3

  • 调整老年代与新生代在整个堆中的占比。
  • 默认值:2。即新生代与老年代的占比为1:2,新生代占1/3,老年代占2/3。
  • 当设置为4时,即新生代与老年代的占比为1:4,新生代占1/5,老年代占4/5。