Trace跟踪参数
1.-verbose:gc
2.-XX:+printGC
可以打印GC的简要信息 [GC 51790K->1374K(115872K), 0.0001606 secs]
3.-XX:+PrintGCDetails(打印GC详细信息)
4.-XX:+PrintGCTimeStamps(打印CG发生的时间戳 )
[GC[DefNew: 6716K->0K(4528K), 0.0007 secs] 8790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] - 5.-XX:+PrintGCDetails的输出
6.-Xloggc:log/gc.log (制定GC的输出位置)
7.-XX:+PrintHeapAtGC(每次一次GC后,都打印堆信息)
8.-XX:+TraceClassLoading (打印class的加载) 9.-XX:+PrintClassHistogram(按下Ctrl+C后,打印类的信息)
堆的分配参数
1.-Xmx –Xms(指定最大堆和最小堆)
System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
System.out.print("free mem=");
System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
System.out.print("total mem=");
System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
2.-Xmn(设置新生代大小)
3.-XX:NewRatio
新生代(eden+s0+S1)和老年代(不包含永久区)的比值。
这个值其实是年老代与年轻代的比值,-XX:NewRatio=4表示年老代与年轻代的比值为4:1 即年轻代占堆的1/5
4.-XX:SurvivorRatio
设置两个Survivor区和eden的比8表示 两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10(会有一个s空置) 为什么需要两个s区?
堆的分配参数
1.-XX:+HeapDumpOnOutOfMemoryError (OOM时导出堆到文件)
2.-XX:+HeapDumpPath(导出OOM的路径)
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
3.-XX:OnOutOfMemoryError
在OOM时,执行一个脚本 "-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p“ 当程序OOM时,在D:/a.txt中将会生成线程的dump 可以在OOM时,发送邮件,甚至是重启程序
非堆的分配参数
1.-XX:PermSize(表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存))
2、-XX:MaxPermSize(表示对非堆区分配的内存的最大上限)
方法区和运行时常量
3.-Xss 栈内存大小
4.-XX:MaxDirectMemorySize 直接内存大小 不指定默认和堆的Xmx一样大小。
总结
根据实际事情调整新生代和幸存代的大小
官方推荐新生代占堆的3/8
幸存代占新生代的1/10
在OOM时,记得Dump出堆,确保可以排查现场问题