Java8内存溢出异常

多的不说最近看了周老师的深入理解Java虚拟机了解一点内存溢出异常知识。

JAVA 堆溢出

package com.dairujie.demo;

import java.util.ArrayList;
import java.util.List;
/**
 * 
 * @ClassName:  堆溢出 
 * @Description:TODO(-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\job)   
 * @author: drj 
 * @date:   2018年10月21日 下午6:41:56   
 *     
 * @Copyright: 2018 
 *
 */
public class HeapOOM {
	static class OOMObject {

	}

	public static void main(String[] args) {
		List list = new ArrayList<>();
		while (true) {
			list.add(new OOMObject());
		}
	}
}
  • 结果图(使用memory analyzer 分析溢出结果)
    Java8内存溢出异常_第1张图片
    Java8内存溢出异常_第2张图片

虚拟机栈和本地方法溢出

package com.dairujie.demo;

/**
 * 
 * @ClassName: JavaVmStackSOF
 * @Description:TODO(虚拟机栈 -Xss128k)
 * @author: drj
 * @date: 2018年10月21日 下午8:57:49
 * 
 * @Copyright: 2018
 *
 */
public class JavaVmStackSOF {
	private int stackCount = 1;

	public void stackLeak() {
		stackCount++;
		stackLeak();
	}

	public static void main(String[] args) {
		JavaVmStackSOF sof = new JavaVmStackSOF();
		try {
			sof.stackLeak();
		} catch (Exception e) {
			
			throw e;
		}finally {
			System.out.println("stackCount is" + sof.stackCount);
		}
	}
}
  • 结果图
    Java8内存溢出异常_第3张图片

方法区溢出异常

package com.dairujie.demo;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;


/**
 * 
 * @ClassName: JavaMethodAreaOOM
 * @Description:TODO(java8  中这样设置 因为取消了永久带-XX:MaxMetaspaceSize=10m)
 * @author: drj
 * @date: 2018年10月21日 下午10:21:29
 * 
 * @Copyright: 2018
 *
 */
public class JavaMethodAreaOOM {
	static class OOMObject{
		
	}
	public static void main(String[] args) {
		while(true) {
			Enhancer enhancer = new Enhancer();
			enhancer.setSuperclass(OOMObject.class);
			enhancer.setUseCache(false);
			enhancer.setCallback(new MethodInterceptor() {
				
				@Override
				public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
					// TODO Auto-generated method stub
					return arg3.invokeSuper(arg0, arg2);
				}
			});
		}
	}
}
  • 结果图
    Java8内存溢出异常_第4张图片Java8内存溢出异常_第5张图片

本机直接内存溢出

package com.dairujie.demo;
import sun.misc.Unsafe;
import java.lang.reflect.Field;


/**
 * 
 * @ClassName: DirectMemory
 * @Description:TODO(本机直接内存溢出 -Xmx20M -XX:MaxDirectMemorySize=10M)
 * @author: drj
 * @date: 2018年10月21日 下午9:49:29
 * 
 * @Copyright: 2018
 *
 */
public class DirectMemory {
	private static final int INT_ONE_MB = 1024 * 1024;

	public static void main(String[] args) throws Exception {
		Field unsafeFiled = Unsafe.class.getDeclaredFields()[0];
		unsafeFiled.setAccessible(true);
		Unsafe unsafe = (Unsafe) unsafeFiled.get(null);
		while(true) {
			unsafe.allocateMemory(INT_ONE_MB);
		}
	}
}
  • 结果图
    Java8内存溢出异常_第6张图片

你可能感兴趣的:(java虚拟机)