深入JVM《三》 JVM常用配置参数
一、Trace 跟踪参数
1、打印GC的简要信息
-verbose:gc
-XX:+PrintGC
2、打印GC详细信息
-XX:+PrintGCDetails
3、打印CG发生的时间戳
-XX:+PrintGCTimeStamps
4、指定GC log的位置,以文件输出
-Xloggc:log/gc.log
5、每次一次GC后,都打印堆信息
-XX:+PrintHeapAtGC
6、监控类的加载
-XX:+TraceClassLoading
7、按下Ctrl+Break后,打印类的信息。分别显示:序号、实例数量、总大小、类型
-XX:+PrintClassHistogram
二、堆的分配参数
1、指定最大堆和最小堆
-Xmx –Xms
-Xmx20m -Xms5m 运行代码: 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、新生代(eden+2*s)和老年代(不包含永久区)的比值。
4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
-XX:NewRatio
4、设置两个Survivor区和eden的比(s0/s1区,或者叫from/to区,幸存区)
8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
-XX:SurvivorRatio
5、OOM时导出堆到文件
-XX:+HeapDumpOnOutOfMemoryError
6、导出OOM的路径(堆dump的时候放置的位置)
-XX:+HeapDumpPath
7、在OOM时,执行一个脚本
-XX:OnOutOfMemoryError // %p 是当前线程的pid -XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p // 当程序OOM时,会执行脚本printstack.bat,如果脚本里写 // D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt 在D:/a.txt中将会生成线程的dump // 可以在OOM时,发送邮件,甚至是重启程序
8、堆的分配参数总结
a)、根据实际事情调整新生代和幸存代的大小
官方推荐新生代占堆的3/8
幸存代占新生代的1/10
在OOM时,记得Dump出堆,确保可以排查现场问题
三、永久区
1、设置永久区的初始空间和最大空间。他们表示,一个系统可以容纳多少个类型
-XX:PermSize -XX:MaxPermSize
堆空间实际占用非常少。但是永久区溢出 一样抛出OOM
如果堆空间没有用完也抛出了OOM,有可能是永久区导致的
四、栈的分配
1、栈空间分配。
通常只有几百K。决定了函数调用的深度。(会影响递归的次数)
每个线程都有独立的栈空间
局部变量、参数 分配在栈上
-Xss