首先,从一道简单的面试题开始说起,对于jvm内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
其最小内存值和Survior区总大小分别是多少?
其实答案很简单只需要了解上面的各个参数的意义就可以了。
- -Xmx :堆的最大值
- -Xms :堆的最小值
- -Xmn :堆年轻代大小
- -XXSurvivorRatio:Eden区和Survior区的占用比例
下面正式介绍几个常见的JVM参数。
1. Trace跟踪参数
- 打印GC的简要信息
-verbose:gc
-XX:+printGC
[GC 4790K->374K(15872K), 0.0001606 secs]
GC之前用了4M左右的内存,GC之后为375K,将进释放了4M内存,总共内存大小为16M左右
- 打印GC的详细信息
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
-XX:+TraceClassLoading 监控类的加载
-XX:+PrintClassHistogram 按下Ctrl+Break后,打印类的信息
[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]
新生代GC,GC之前新生代使用4M内存,GC之后使用0M内存。
GC之前Java 堆内存使用4M内存,GC之后Java 堆内存使用374K
- 指定GC log的位置
-Xloggc:log/gc.log
2. 堆的分配参数
- -Xmx 指定最大堆
- -Xms 指定最小堆
- -Xmn 设置新生代大小
- -XX:NewRatio 新生代(eden+2*s)和老年代(不包含永久区)的比值
例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5 - -XX:SurvivorRatio(幸存代)设置两个Survivor区和eden的比值
例如:8,表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10 - -XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件
- -XX:+HeapDumpPath 导出OOM的路径
- -XX:PermSize 设置永生代大小
- -XX:MaxPermSize 设置永生带最大值
-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是当前进程的pid
//系统的最大空间
System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");
//系统的空闲空间
System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");
//当前可用的总空间
System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");
3. 栈的分配参数
- Xss
-Xss128K
网友评论