参数设置
堆大小设置
- -Xmx3550m:设置JVM最大可用内存为3550M
- -Xms3550m:设置JVM初始内存为3550m,此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
- -Xmn2g:设置年轻代大小为2G
- -Xss128k:设置每个线程的堆栈大小
- -XX:NewRatio=4:设置年轻代与年老代的比值,设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
- -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值,设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
- -XX:MetaspaceSize=64m:元空间初始大小
- -XX:MaxMetaspaceSize=128m:元空间最大容量
- -XX:MaxTenuringThreshold=0:设置垃圾最大年龄
- -XX:PetenureSizeThreshold=100000:设置进入老年代的最大年龄
### 回收器选择
- 吞吐量优先的并行收集器,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等
- -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即年轻代使用并发收集,而年老代仍旧使用串行收集
- -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集 - -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等
- -XX:GCTimeRatio
设置吞吐量大小,值是一个0到100之间的整数。假设GCTimeRatio的值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾收集。默认值为99,即允许1%的GC时间 - -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值
- -XX:+UseAdaptiveSizePolicy:打开自适应GC策略,开启这个参数后,就不需要手工指定新生代大小,Eden 与 Survivor 比例(SurvivorRatio)等细节,只需要设置好-Xmx,MaxGCPauseMills和GCTimeRatio,虚拟机就会根据当前系统运行情况收集监控信息,动态调整这些参数以尽可能地达到我们设定的最大垃圾收集时间或吞吐量大小这两个指标,此值建议使用并行收集器时,一直打开
- 响应时间优先的并发收集器,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间,适用于应用服务器、电信领域等
- -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置
- -XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值 - -XX:ParallelCMSThreads:设定CMS的线程数量
- -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少%后触发
- -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理
- -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩(碎片整理)
- -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即年轻代使用并发收集,而年老代仍旧使用串行收集
辅助信息
- -XX:+PrintGC:输出GC日志
- -XX:+PrintGCDetails: 输出GC的详细日志
- -XX:+PrintGCTimeStamps:输出GC的时间戳(以基准时间的形式)
- -XX:+PrintGCDateStamps:输出GC的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)
- -XX:+PrintHeapAtGC:在进行GC的前后打印出堆的信息
- -Xloggc:/logs/gc.log:日志文件的输出路径
- -XX:ErrorFile=./hs_err_pid.log:保存错误日志或数据到指定文件中
- -XX:OnError=";":出现致命ERROR后运行自定义命令
- -XX:OnOutOfMemoryError=";":当首次遭遇内存溢出时执行自定义命令
- -XX:-PrintClassHistogram:按下Ctrl+Break后打印堆内存中类实例的柱状信息,同JDK的 jmap -histo 命令
- -XX:-PrintConcurrentLocks:按下Ctrl+Break后打印线程栈中并发锁的相关信息,同JDK的 jstack -l 命令
- -XX:-PrintCompilation:当一个方法被编译时打印相关信息
- -XX:-TraceClassLoading:跟踪类的加载信息
- -XX:-TraceClassLoadingPreorder:跟踪被引用到的所有类的加载信息
- -XX:-TraceClassResolution:跟踪常量池
- -XX:-TraceClassUnloading:跟踪类的卸载信息
- -XX:-CITime:打印消耗在JIT编译的时间
调优经验
如何将新对象预留在年轻代
- 调大新生代的比例