JVM内存分析系列(一)JVM常用参数及溢出分析工具和方法

JDK1.6.45常用基本参数
-server 服务模式启动
-verbose:gc 开启gc日志打印
-Xms值} 最小堆
-Xmx{值} 最大堆
-Xss{值} 栈容量
-Xmn{值} 新生代的内存空间大小,注意:此处的大小是(eden + 2 survivor space)
-Xloggc 日志文件路径,例如-Xloggc:/var/logs/gc.log
-XX:+HeapDumpOnOutOfMemoryError 参数表示当JVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof。
-XX:PermSize={值} 方法区最小内存值
-XX:MaxPermSize={值} 方法区最大内存值
-XX:MaxDirectMemorySize={值}堆外内存
-XX:+DisableExplicitGC 禁用显示GC的System.gc()方法
-XX:+PrintGC
-XX:+PrintGCDetails 打印GC收集详情
-XX:+PrintGCTimeStamps

-XX:+PrintFlagsInitial 显示所有可设置参数及默认值
-XX:+PrintFlagsFinal

经验
新生代与老年代的默认比值是1:2,占用整个堆的大小。持久代则是另一块内存区域,需要单独设置。在新生代中,Eden与1个Survivor的比值是6:1,新生代:Survivor=8:1

测试内存溢出
启动配置(在eclipse中,则配置VM arguments)
其中需要注意,c:/tmp目录必须存在,否则文件名无法生成
-server -verbose:gc -Xms10m -Xmx10m -Xss128k -Xloggc:C:/tmp/gc.log -XX:PermSize=5m -XX:MaxPermSize=5m -XX:MaxDirectMemorySize=10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/tmp

测试代码
package com.chinaso.phl;

import java.util.ArrayList;
import java.util.List;

/**
 * @author piaohailin
 * @date 2013-12-24
 */
public class Server {

	/**
	 * @param args
	 * @author piaohailin
	 * @date 2013-12-24
	 */
	public static void main(String[] args) {
		List<Server> list = new ArrayList<Server>();
		while (true) {
			list.add(new Server());
		}
	}

}


控制台输出
java.lang.OutOfMemoryError: Java heap space
Dumping heap to C:/tmp\java_pid7636.hprof ...
Heap dump file created [17593217 bytes in 0.169 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at com.chinaso.phl.Server.main(Server.java:29)

异常到处文件在C:/tmp/java_pid7248.hprof
使用MemoryAnalyzer-1.3.0打开文件即可进行宕机分析
MemoryAnalyzer下载地址
http://www.eclipse.org/mat/downloads.php
用分析工具打开,如下

打开的首页
JVM内存分析系列(一)JVM常用参数及溢出分析工具和方法_第1张图片

查看Dominator tree 可以看到创建最多的实例数
JVM内存分析系列(一)JVM常用参数及溢出分析工具和方法_第2张图片


查看垃圾收集文件 C:/tmp/gc.log
0.128: [GC [PSYoungGen: 2624K->384K(3008K)] 2624K->1888K(9856K), 0.0067433 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
0.136: [GC [PSYoungGen: 3008K->384K(3008K)] 4512K->3936K(9856K), 0.0063252 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
0.144: [GC [PSYoungGen: 3008K->384K(3008K)] 6560K->6572K(9856K), 0.0081110 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
0.152: [Full GC [PSYoungGen: 384K->0K(3008K)] [PSOldGen: 6188K->5407K(6848K)] 6572K->5407K(9856K) [PSPermGen: 3036K->3036K(4096K)], 0.0237171 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
0.177: [Full GC [PSYoungGen: 2624K->19K(3008K)] [PSOldGen: 5407K->6847K(6848K)] 8031K->6867K(9856K) [PSPermGen: 3036K->3036K(4096K)], 0.0262551 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
0.205: [Full GC [PSYoungGen: 2045K->2045K(3008K)] [PSOldGen: 6847K->6847K(6848K)] 8893K->8893K(9856K) [PSPermGen: 3036K->3036K(4096K)], 0.0273953 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
0.232: [Full GC [PSYoungGen: 2045K->2028K(3008K)] [PSOldGen: 6847K->6847K(6848K)] 8893K->8876K(9856K) [PSPermGen: 3036K->3029K(4096K)], 0.0342056 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
Heap
PSYoungGen      total 3008K, used 2117K [0x00000000ffcb0000, 0x0000000100000000, 0x0000000100000000)
  eden space 2624K, 80% used [0x00000000ffcb0000,0x00000000ffec16b8,0x00000000fff40000)
  from space 384K, 0% used [0x00000000fff40000,0x00000000fff40000,0x00000000fffa0000)
  to   space 384K, 0% used [0x00000000fffa0000,0x00000000fffa0000,0x0000000100000000)
PSOldGen        total 6848K, used 6847K [0x00000000ff600000, 0x00000000ffcb0000, 0x00000000ffcb0000)
  object space 6848K, 99% used [0x00000000ff600000,0x00000000ffcafff8,0x00000000ffcb0000)
PSPermGen       total 4096K, used 3038K [0x00000000ff200000, 0x00000000ff600000, 0x00000000ff600000)
  object space 4096K, 74% used [0x00000000ff200000,0x00000000ff4f7bf8,0x00000000ff600000)


附录
本文只是模拟各种内存溢出的情况,文章追求精简直接,本文不适合初学者,需要有一定的基础,对JVM内存模型有一定的了解。




作者简介
昵称:澳洲鸟
姓名:朴海林
QQ:85977328
MSN:[email protected]

转载请注明出处

你可能感兴趣的:(jvm内存)