文章目录
  1. 1. JVM常用配置参数
    1. 1.1. 运行环境
    2. 1.2. Trace跟踪参数
      1. 1.2.1. 打印GC的简要信息
      2. 1.2.2. 打印GC的详细信息
      3. 1.2.3. 指定GC log的存放位置
      4. 1.2.4. 每次GC后,都打印堆信息
      5. 1.2.5. 监控类的加载
    3. 1.3. 堆的分配参数
      1. 1.3.1. 设置新生代的大小
      2. 1.3.2. OOM时导出堆到文件
      3. 1.3.3. 堆的分配参数总结
    4. 1.4. 永久区分配参数
    5. 1.5. 栈大小分配

JVM常用配置参数

本文将介绍 Trace跟踪参数堆的分配参数栈的分配参数

运行环境

1
2
java version:1.6.0_45
os:Linux centos6

Trace跟踪参数

打印GC的简要信息

  • -verbose:gc
  • -XX:+PrintGC

打印如下信息

1
2
3
4
5
6
7
8
9
[GC 2624K->192K(9856K), 0.0008670 secs]
[GC 2816K->160K(9856K), 0.0003540 secs]
[GC 2784K->160K(9856K), 0.0004030 secs]
[GC 2784K->160K(9856K), 0.0003710 secs]
[GC 2784K->160K(9856K), 0.0004080 secs]
[GC 2784K->160K(10048K), 0.0003660 secs]
[GC 3168K->124K(9920K), 0.0028390 secs]
[GC 3132K->124K(9984K), 0.0003210 secs]
[GC 3004K->124K(9984K), 0.0003490 secs]

ps:这里使用的Java代码是前文中使用的OnStackTest 类的代码

打印GC的详细信息

  • -XX:+PrintGCDetails
    • 打印GC详细信息
  • -XX:+PrintGCTimeStamps
    • 打印GC发生的时间戳

命令如下:

java -server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+PrintGCTimeStamps OnStackTest

打印结果如下,执行完代码前会打印堆信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.035: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0002520 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.036: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0002860 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
1.037: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0002680 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.038: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0002540 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.040: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0008810 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.042: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0003090 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.043: [GC [PSYoungGen: 3264K->0K(3328K)] 3388K->124K(10176K), 0.0003550 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
997
Heap
PSYoungGen total 3328K, used 1048K [0x00000000ffcb0000, 0x0000000100000000, 0x0000000100000000)
eden space 3264K, 32% used [0x00000000ffcb0000,0x00000000ffdb6018,0x00000000fffe0000)
from space 64K, 0% used [0x00000000ffff0000,0x00000000ffff0000,0x0000000100000000)
to space 64K, 0% used [0x00000000fffe0000,0x00000000fffe0000,0x00000000ffff0000)
PSOldGen total 6848K, used 124K [0x00000000ff600000, 0x00000000ffcb0000, 0x00000000ffcb0000)
object space 6848K, 1% used [0x00000000ff600000,0x00000000ff61f060,0x00000000ffcb0000)
PSPermGen total 21248K, used 2584K [0x00000000fa400000, 0x00000000fb8c0000, 0x00000000ff600000)
object space 21248K, 12% used [0x00000000fa400000,0x00000000fa6863a8,0x00000000fb8c0000)

ps:这里使用的Java代码是前文中使用的OnStackTest 类的代码

指定GC log的存放位置

  • -Xloggc:log/gc.log

具体命令如下:

java -server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/home/yinqi/apps/gc.log OnStackTest

将在指定目录生成一个gc.log文件

每次GC后,都打印堆信息

  • -XX:+PrintHeapAtGC

执行命令如下:

java -server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintHeapAtGC OnStackTest

打印结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{Heap before GC invocations=722 (full 0):
PSYoungGen total 3328K, used 3264K [0x00000000ffcb0000, 0x0000000100000000, 0x0000000100000000)
eden space 3264K, 100% used [0x00000000ffcb0000,0x00000000fffe0000,0x00000000fffe0000)
from space 64K, 0% used [0x00000000fffe0000,0x00000000fffe0000,0x00000000ffff0000)
to space 64K, 0% used [0x00000000ffff0000,0x00000000ffff0000,0x0000000100000000)
PSOldGen total 6848K, used 132K [0x00000000ff600000, 0x00000000ffcb0000, 0x00000000ffcb0000)
object space 6848K, 1% used [0x00000000ff600000,0x00000000ff621060,0x00000000ffcb0000)
PSPermGen total 21248K, used 2576K [0x00000000fa400000, 0x00000000fb8c0000, 0x00000000ff600000)
object space 21248K, 12% used [0x00000000fa400000,0x00000000fa684378,0x00000000fb8c0000)
Heap after GC invocations=722 (full 0):
PSYoungGen total 3328K, used 0K [0x00000000ffcb0000, 0x0000000100000000, 0x0000000100000000)
eden space 3264K, 0% used [0x00000000ffcb0000,0x00000000ffcb0000,0x00000000fffe0000)
from space 64K, 0% used [0x00000000ffff0000,0x00000000ffff0000,0x0000000100000000)
to space 64K, 0% used [0x00000000fffe0000,0x00000000fffe0000,0x00000000ffff0000)
PSOldGen total 6848K, used 132K [0x00000000ff600000, 0x00000000ffcb0000, 0x00000000ffcb0000)
object space 6848K, 1% used [0x00000000ff600000,0x00000000ff621060,0x00000000ffcb0000)
PSPermGen total 21248K, used 2576K [0x00000000fa400000, 0x00000000fb8c0000, 0x00000000ff600000)
object space 21248K, 12% used [0x00000000fa400000,0x00000000fa684378,0x00000000fb8c0000)
}

ps:这里使用的Java代码是前文中使用的OnStackTest 类的代码

监控类的加载

  • -XX:+TraceClassLoading

通过该参数可以追踪类的加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[yinqi@study ex]$ java -XX:+TraceClassLoading TestDump2
[Opened /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Object from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.io.Serializable from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Comparable from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.String from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.reflect.Type from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Class from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Cloneable from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.ClassLoader from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.System from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Throwable from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Error from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.ThreadDeath from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.Exception from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.lang.RuntimeException from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
[Loaded java.security.AccessControlContext from /home/yinqi/apps/jdk6/jdk1.6.0_45/jre/lib/rt.jar]
...

堆的分配参数

  • -Xmx -Xms 指定堆的最大值和最小值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestDump{
public static void main(String args[]){
System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
System.out.print("free men=");
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");
}
}

通过命令 java -Xmx20m -Xms5m TestDump 命令运行该类

1
2
3
Xmx=17.8125M
free men=6.647926330566406M
total mem=6.875M

通过添加使用内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestDump{
public static void main(String args[]){
byte[] b = new byte[1*1024*1024];
System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
System.out.print("free men=");
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");
}
}

通过命令 java -Xmx20m -Xms5m TestDump

结果如下,空闲内存少了1M:

1
2
3
Xmx=17.8125M
free men=5.647911071777344M
total mem=6.875M

再添加内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestDump{
public static void main(String args[]){
byte[] b = new byte[4*1024*1024];
System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
System.out.print("free men=");
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");
}
}

通过命令 java -Xmx20m -Xms5m TestDump

结果如下,总内存变多了:

1
2
3
Xmx=17.8125M
free men=6.710411071777344M
total mem=10.9375M

这也表明,JVM尽量维护最小的堆内存

设置新生代的大小

  • -Xmn 设置新生代大小
  • -XX:NewRatio 新生代(eden+2*s)和老年代的比值 例如 4 表示新生代:老年代=1:4,即年轻代占堆的1/5
  • -XX:SurvivorRatio 设置两个Survivor区和eden区的比;例如 8 表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10

创建如下代码

1
2
3
4
5
6
7
public class TestDump2{
public static void main(String[] args) {
byte[] b=null;
for(int i=0;i<10;i++)
b=new byte[1*1024*1024];
}
}

执行 java -Xmx20m -Xms20m -Xmn1m -XX:+UseSerialGC -XX:+PrintGCDetails TestDump2 命令,新生代设置为1m

1
2
3
4
5
6
7
8
9
10
Heap
def new generation total 960K, used 235K [0x00000000f9a00000, 0x00000000f9b00000, 0x00000000f9b00000)
eden space 896K, 26% used [0x00000000f9a00000, 0x00000000f9a3ac68, 0x00000000f9ae0000)
from space 64K, 0% used [0x00000000f9ae0000, 0x00000000f9ae0000, 0x00000000f9af0000)
to space 64K, 0% used [0x00000000f9af0000, 0x00000000f9af0000, 0x00000000f9b00000)
tenured generation total 19456K, used 10240K [0x00000000f9b00000, 0x00000000fae00000, 0x00000000fae00000)
the space 19456K, 52% used [0x00000000f9b00000, 0x00000000fa5000a0, 0x00000000fa500200, 0x00000000fae00000)
compacting perm gen total 21248K, used 2574K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb0839e8, 0x00000000fb083a00, 0x00000000fc2c0000)
No shared spaces configured.

通过查看堆的信息发现没有发生GC,并且都分配在老年代。因为新生代过小,将所有数据都放在老年代

还是上面的代码,通过该命令运行 java -Xmx20m -Xms20m -Xmn15m -XX:+UseSerialGC -XX:+PrintGCDetails TestDump2 ,设置新生代的大小为15m

1
2
3
4
5
6
7
8
9
10
Heap
def new generation total 13824K, used 10731K [0x00000000f9800000, 0x00000000fa700000, 0x00000000fa700000)
eden space 12288K, 87% used [0x00000000f9800000, 0x00000000fa27af30, 0x00000000fa400000)
from space 1536K, 0% used [0x00000000fa400000, 0x00000000fa400000, 0x00000000fa580000)
to space 1536K, 0% used [0x00000000fa580000, 0x00000000fa580000, 0x00000000fa700000)
tenured generation total 5120K, used 0K [0x00000000fa700000, 0x00000000fac00000, 0x00000000fae00000)
the space 5120K, 0% used [0x00000000fa700000, 0x00000000fa700000, 0x00000000fa700200, 0x00000000fac00000)
compacting perm gen total 21248K, used 2574K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb0839e8, 0x00000000fb083a00, 0x00000000fc2c0000)
No shared spaces configured.

还是没有发生GC,全部分配在eden区。因为新生代分配了15m,eden区占了12m,可以放下总共10m的数据,所以都分配在eden区

还是上面的代码,通过该命令运行 java -Xmx20m -Xms20m -Xmn6m -XX:+UseSerialGC -XX:+PrintGCDetails TestDump2 ,设置新生代的大小为6m

1
2
3
4
5
6
7
8
9
10
11
12
[GC [DefNew: 4311K->122K(5568K), 0.0024850 secs] 4311K->1146K(19904K), 0.0025200 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 4371K->122K(5568K), 0.0010390 secs] 5395K->2170K(19904K), 0.0010600 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Heap
def new generation total 5568K, used 2305K [0x00000000f9a00000, 0x00000000fa000000, 0x00000000fa000000)
eden space 4992K, 43% used [0x00000000f9a00000, 0x00000000f9c21968, 0x00000000f9ee0000)
from space 576K, 21% used [0x00000000f9ee0000, 0x00000000f9efeb18, 0x00000000f9f70000)
to space 576K, 0% used [0x00000000f9f70000, 0x00000000f9f70000, 0x00000000fa000000)
tenured generation total 14336K, used 2048K [0x00000000fa000000, 0x00000000fae00000, 0x00000000fae00000)
the space 14336K, 14% used [0x00000000fa000000, 0x00000000fa200020, 0x00000000fa200200, 0x00000000fae00000)
compacting perm gen total 21248K, used 2583K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb085fb8, 0x00000000fb086000, 0x00000000fc2c0000)
No shared spaces configured.

进行两次新生代的GC,from to 太小需要使用老年代。第一次GC回收了差不多3m,第二次GC也差不多回收了3m;新生代总共使用了差不多2m,老年代也使用了差不多2m

还是上面的代码,通过该命令运行 java -Xmx20m -Xms20m -Xmn6m -XX:SurvivorRatio=2 -XX:+UseSerialGC -XX:+PrintGCDetails TestDump2 ,增大s0和s1的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[GC [DefNew: 2280K->1146K(4608K), 0.0018020 secs] 2280K->1146K(18944K), 0.0018350 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 3289K->1024K(4608K), 0.0012040 secs] 3289K->1146K(18944K), 0.0012310 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 3094K->1024K(4608K), 0.0003670 secs] 3216K->1146K(18944K), 0.0003850 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 3086K->1024K(4608K), 0.0002840 secs] 3209K->1146K(18944K), 0.0003110 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 4608K, used 3143K [0x00000000f9a00000, 0x00000000fa000000, 0x00000000fa000000)
eden space 3072K, 68% used [0x00000000f9a00000, 0x00000000f9c11c88, 0x00000000f9d00000)
from space 1536K, 66% used [0x00000000f9d00000, 0x00000000f9e00010, 0x00000000f9e80000)
to space 1536K, 0% used [0x00000000f9e80000, 0x00000000f9e80000, 0x00000000fa000000)
tenured generation total 14336K, used 122K [0x00000000fa000000, 0x00000000fae00000, 0x00000000fae00000)
the space 14336K, 0% used [0x00000000fa000000, 0x00000000fa01eb18, 0x00000000fa01ec00, 0x00000000fae00000)
compacting perm gen total 21248K, used 2583K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb085fb8, 0x00000000fb086000, 0x00000000fc2c0000)
No shared spaces configured.

进行了4次GC,并且没有使用老年代的空间

还是上面的代码,通过该命令运行 java -Xmx20m -Xms20m -XX:NewRatio=1 -XX:SurvivorRatio=2 -XX:+UseSerialGC -XX:+PrintGCDetails TestDump2 ,增加新生代的大小

1
2
3
4
5
6
7
8
9
10
11
12
[GC [DefNew: 4317K->1146K(7680K), 0.0020930 secs] 4317K->1146K(17920K), 0.0021240 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 5399K->1146K(7680K), 0.0008120 secs] 5399K->1146K(17920K), 0.0008410 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 7680K, used 3332K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
eden space 5120K, 42% used [0x00000000f9a00000, 0x00000000f9c22760, 0x00000000f9f00000)
from space 2560K, 44% used [0x00000000f9f00000, 0x00000000fa01eb28, 0x00000000fa180000)
to space 2560K, 0% used [0x00000000fa180000, 0x00000000fa180000, 0x00000000fa400000)
tenured generation total 10240K, used 0K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
the space 10240K, 0% used [0x00000000fa400000, 0x00000000fa400000, 0x00000000fa400200, 0x00000000fae00000)
compacting perm gen total 21248K, used 2583K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb085fb8, 0x00000000fb086000, 0x00000000fc2c0000)
No shared spaces configured.

增加新生代的大小为整个堆的1/2,s0+s1总共为5m,eden区总共为5m,老年代总共10m。发生了2次GC,没有使用老年代

还是上面的代码,通过该命令运行 java -Xmx20m -Xms20m -XX:NewRatio=1 -XX:SurvivorRatio=3 -XX:+UseSerialGC -XX:+PrintGCDetails TestDump2 ,减少了s0和s1的大小

1
2
3
4
5
6
7
8
9
10
11
[GC [DefNew: 5390K->1146K(8192K), 0.0018310 secs] 5390K->1146K(18432K), 0.0018630 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
Heap
def new generation total 8192K, used 6577K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
eden space 6144K, 88% used [0x00000000f9a00000, 0x00000000f9f4d910, 0x00000000fa000000)
from space 2048K, 56% used [0x00000000fa200000, 0x00000000fa31eba0, 0x00000000fa400000)
to space 2048K, 0% used [0x00000000fa000000, 0x00000000fa000000, 0x00000000fa200000)
tenured generation total 10240K, used 0K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
the space 10240K, 0% used [0x00000000fa400000, 0x00000000fa400000, 0x00000000fa400200, 0x00000000fae00000)
compacting perm gen total 21248K, used 2583K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb085fb8, 0x00000000fb086000, 0x00000000fc2c0000)
No shared spaces configured.

通过减少s0和s1的大小达了减少GC次数的效果

OOM时导出堆到文件

  • -XX:+HeapDumpOnOutOfMemoryError 内存溢出时导出当前堆到文件
  • -XX:HeapDumpPath 导出OOM的路径

通过下面这段代码进行测试

1
2
3
4
5
6
7
8
9
10
import java.util.*;
public class TestOOM{
public static void main(String args[]){
Vector v=new Vector();
for(int i=0;i<25;i++)
v.add(new byte[1*1024*1024]);
}
}

执行如下命令

1
2
3
4
5
6
[yinqi@study ex]$ java -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/yinqi/apps/ex/a.dump TestOOM
java.lang.OutOfMemoryError: Java heap space
Dumping heap to /home/yinqi/apps/ex/a.dump ...
Heap dump file created [19514274 bytes in 0.140 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at TestOOM.main(TestOOM.java:8)

导出的文件大小和堆的最大值的大小一样大,通过 MemoryAnalyzer 工具分析该dump文件,如下图

MemoryAnalyzer分析dump

  • -XX:OnOutOfMemoryError 在OOM时,执行一个脚本,该脚本可以执行很多事情比如重启应用,发送脚本
1
java -Xmx20m -Xms5m -XX:OnOutOfMemoryError=/home/yinqi/apps/ex/printstack.sh TestOOM

堆的分配参数总结

  • 根据实际情况调整新生代和幸存代的大小
  • 官方推荐新生代占堆的3/8
  • 幸存代占新生代的1/10
  • 在OOM时,记得Dump出堆,确保可以排查现场问题

永久区分配参数

  • -XX:PermSize 设置永久区的初始空间
  • -XX:MaxPermSize 设置永久区的最大空间
  • 他们表示,一个系统可以容纳多少个类型

栈大小分配

  • -Xss

    • 通常只有几百K
    • 决定函数调用的深度
    • 每个线程都有独立的栈空间
    • 局部变量、参数都分配在栈上

    通过如下代码测试栈的分配

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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();
    }
    }
    }

    通过如下命令运行:java -Xss160k TestStackDeep

    1
    2
    deep of calling = 221
    java.lang.StackOverflowError

    通过如下命令运行:java -Xss256k TestStackDeep

    1
    2
    deep of calling = 577
    java.lang.StackOverflowError

    通过上面的代码可以发现,增加栈空间的大小可以增加递归函数的调用次数

文章目录
  1. 1. JVM常用配置参数
    1. 1.1. 运行环境
    2. 1.2. Trace跟踪参数
      1. 1.2.1. 打印GC的简要信息
      2. 1.2.2. 打印GC的详细信息
      3. 1.2.3. 指定GC log的存放位置
      4. 1.2.4. 每次GC后,都打印堆信息
      5. 1.2.5. 监控类的加载
    3. 1.3. 堆的分配参数
      1. 1.3.1. 设置新生代的大小
      2. 1.3.2. OOM时导出堆到文件
      3. 1.3.3. 堆的分配参数总结
    4. 1.4. 永久区分配参数
    5. 1.5. 栈大小分配