常用JVM配置参数
Trace跟踪参数
名称 | 描述 | 说明 |
-verbose:gc 或者 -XX:+printGC |
可以打印GC的简要信息 | [GC 4790K->374K(15872K), 0.0001606 secs] [GC 4790K->374K(15872K), 0.0001474 secs] [GC 4790K->374K(15872K), 0.0001563 secs] [GC 4790K->374K(15872K), 0.0001682 secs] |
-XX:+PrintGCDetails | 打印GC详细信息 |
|
-XX:+PrintGCTimeStamps | 打印CG发生的时间戳 |
[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] |
-Xloggc:log/gc.log |
指定GC log的位置,以文件输出 |
|
-XX:+PrintHeapAtGC | 每次一次GC后,都打印堆信息 | |
-XX:+TraceClassLoading | 监控类的加载 |
[Loaded java.lang.Object from shared objects file] |
-XX:+PrintClassHistogram | 按下Ctrl+Break后,打印类的信息 |
num #instances #bytes class name
|
堆的分配参数
名称 | 描述 | 说明 |
-Xmx –Xms | 指定最大堆和最小堆 |
-Xmx20m -Xms5m 运行代码: System.out.print("free mem="); System.out.print("total mem=");
结果: Xmx=19.375M
|
-Xmn | 设置新生代大小 | 官方推荐新生代占堆的3/8 |
-XX:NewRatio | 新生代(eden+2*s)和老年代(不包含永久区)的比值 | 4 表示 新生代:老年代=1:4,即年轻代占堆的1/5 ,默认比例为1:2 |
-XX:SurvivorRatio | 设置两个Survivor区和eden的比 | 8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10 |
-XX:+HeapDumpOnOutOfMemoryError | OOM时导出堆到文件 | |
-XX:+HeapDumpPath | 导出OOM的路径 |
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump Vector v=new Vector();
|
-XX:OnOutOfMemoryError | 在OOM时,执行一个脚本 |
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p“
printstack.bat D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt
|
-XX:PermSize -XX:MaxPermSize | 设置永久区的初始空间和最大空间 | 使用CGLIB等库的时候,可能会产生大量的类,这些类,有可能撑爆永久区导致OOM |
栈大小分配
-Xss
通常只有几百K
决定了函数调用的深度
每个线程都有独立的栈空间
局部变量、参数 分配在栈上
举例:
public class TestStackDeep {
private static int count=0;
public static void recursion(long a,long b,long c){
long e=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=10;
count++;
recursion(a,b,c);
}
public static void main(String args[]){
try{
recursion(0L,0L,0L);
}catch(Throwable e){
System.out.println("deep of calling = "+count);
e.printStackTrace();
}
}
}
递归调用
-Xss128K
deep of calling = 701
java.lang.StackOverflowError
-Xss256K
deep of calling = 1817
java.lang.StackOverflowError