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<OOMObject> list = new ArrayList<>();
while (true) {
list.add(new OOMObject());
}
}
}
- 结果图(使用memory analyzer 分析溢出结果)
虚拟机栈和本地方法溢出
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);
}
}
}
- 结果图
方法区溢出异常
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);
}
});
}
}
}
- 结果图
本机直接内存溢出
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);
}
}
}
- 结果图