1. 程式人生 > >(轉)JVM各種內存溢出是否產生dump

(轉)JVM各種內存溢出是否產生dump

space cati dump final list height pac unknown 永久

對於java的內存溢出,如果配置-XX:+HeapDumpOnOutOfMemoryError,很明確的知道堆內存溢出時會生成dump文件。但永久代內存溢出不明確是否會生成,今天來做一個實驗:

永久代內存溢出,有dump文件。JVM的參數是-XX:PermSize=10m -XX:MaxPermSize=10m -XX:+HeapDumpOnOutOfMemoryError

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class PermPoolOOM{
  4. public static void main(String[] args){
  5. List list = new ArrayList();
  6. int i = 0;
  7. while(true){
  8. list.add(String.valueOf(i++).intern());
  9. }
  10. }
  11. }
java.lang.OutOfMemoryError: PermGen space
Dumping heap to java_pid8900.hprof ...
Heap dump file created [17009938 bytes in 0.336 secs]
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
at PermPoolOOM.main(PermPoolOOM.java:8)

方法區溢出,有dump文件。需要下載cglib-full-2.0.1.jar,JVM參數設置:-XX:PermSize=10m -XX:MaxPermSize=10m -XX:+HeapDumpOnOutOfMemoryError

  1. import java.lang.reflect.Method;
  2. import net.sf.cglib.proxy.Enhancer;
  3. import net.sf.cglib.proxy.MethodInterceptor;
  4. import net.sf.cglib.proxy.MethodProxy;
  5. public class JavaMethodAreaOOM {
  6. public static void main(String[] args) {
  7. while (true) {
  8. Enhancer enhancer = new Enhancer();
  9. enhancer.setSuperclass(OOMObject.class);
  10. enhancer.setUseCache(false);
  11. enhancer.setCallback(new MethodInterceptor() {
  12. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  13. return proxy.invokeSuper(obj, args);
  14. }
  15. });
  16. enhancer.create();
  17. }
  18. }
  19. static class OOMObject {
  20. }
  21. }
java.lang.OutOfMemoryError: PermGen space
Dumping heap to java_pid11000.hprof ...
Heap dump file created [6752989 bytes in 0.075 secs]
Exception in thread "main" net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:208)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:406)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:318)
at JavaMethodAreaOOM.main(JavaMethodAreaOOM.java:21)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:411)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:195)
... 3 more
Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
... 8 more

直接內存溢出,沒有dump文件。JVM參數配置:-XX:PermSize=10m -XX:MaxPermSize=10m -XX:+HeapDumpOnOutOfMemoryError -XX:MaxDirectMemorySize=10M

  1. import java.lang.reflect.Field;
  2. import sun.misc.Unsafe;
  3. public class DirectMemoryOOM{
  4. private static final int _1MB = 1024* 1024 * 1024;
  5. public static void main(String[] args) throws Exception{
  6. Field unsafeField = Unsafe.class.getDeclaredFields()[0];
  7. unsafeField.setAccessible(true);
  8. Unsafe unsafe = (Unsafe) unsafeField.get(null);
  9. while(true){
  10. //unsafe直接想操作系統申請內存
  11. unsafe.allocateMemory(_1MB);
  12. }
  13. }
  14. }
Exception in thread "main" java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at com.comtop.DirectMemoryOOM.main(DirectMemoryOOM.java:15)

棧內存溢出,沒有dump文件。JVM參數設置:-Xss128k

  1. public class JavaVMStackOF{
  2. int stackLength = 1;
  3. public void stackLeak(){
  4. stackLength++;
  5. stackLeak();
  6. }
  7. public static void main(String[] args){
  8. JavaVMStackOF oom = new JavaVMStackOF();
  9. oom.stackLeak();
  10. }
  11. }

Exception in thread "main" java.lang.StackOverflowError
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:6)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)
at JavaVMStackOF.stackLeak(JavaVMStackOF.java:7)

(轉)JVM各種內存溢出是否產生dump