本地获取dump文件:
1、JDK8之前
-XX:PermSize=3m -XX:MaxPermSize=3m -XX:+HeapDumpOnOutOfMemoryError
2、JDK8以及之后(没有永久代了,改成元空间Metaspace了)
-XX:MetaspaceSize=3M -XX:MaxMetaspaceSize=3M -XX:+HeapDumpOnOutOfMemoryError
执行代码:
public static void main(String[] args) {
List list = new ArrayList();
int i = 0;
while(true){
list.add(String.valueOf(i++).intern());
}
}
结果:
objc[54083]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/java (0x1067664c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1087f54e0). One of the two will be used. Which one is undefined.
java.lang.OutOfMemoryError: Metaspace
Dumping heap to java_pid54083.hprof ...
Heap dump file created [1107098 bytes in 0.006 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Metaspace
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:304)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
线上如何获取dump文件:
使用jmap -dump:live,format=b,file=xxx [pid],例如:
jmap -dump:live,format=b,file=heap201712.hropf 72947
使用Jprofile分析dump文件
需要先将文件后缀修改为hprof,用Jprofile可以一目了然的看出是大量对象
由于我们设置为3M,很容易内存溢出
注意:直接内存溢出、栈内存溢出没有dump文件生成