一、引言
从事java开发的小伙伴在平时的开发工作中,应该会遇见各式各样的异常和错误,在实际工作中积累的异常或者错误越多,趟过的坑越多,就会使我们编码更加的健壮,就会本能地避开很多严重的坑。以下介绍几个Java虚拟机常见内存溢出错误。以此警示,避免生产血案。
二、模拟Java虚拟机常见内存溢出错误
1、内存溢出之栈溢出错误
package com.jayway.oom;
public class StackOverflowErrorDemo {
public static void main(String[] args) {
stackOverflowError();
}
private static void stackOverflowError() {
stackOverflowError();
}
}
2、内存溢出之堆溢出错误
package com.jayway.oom;
import java.util.Random;
public class JavaHeapSpaceErrorDemo {
public static void main(String[] args) {
String temp = "java";
//不断地在堆中开辟空间,创建对象,撑爆堆内存
while (true) {
temp += temp + new Random().nextInt(111111111) + new Random().nextInt(222222222);
temp.intern();
}
}
}
3、内存溢出之GC超过执行限制错误
package com.jayway.oom;
import java.util.ArrayList;
import java.util.List;
public class GCOverheadErrorDemo {
public static void main(String[] args) {
int i = 0;
List list = new ArrayList<>();
try {
while (true) {
list.add(String.valueOf(++i).intern());
}
} catch (Throwable e) {
System.out.println("*****************i:" + i);
e.printStackTrace();
throw e;
}
}
}
4、内存溢出之直接内存溢出错误
package com.jayway.oom;
import java.nio.ByteBuffer;
public class DirectBufferMemoryErrorDemo {
public static void main(String[] args) {
//默认JVM配置的最大直接内存是总物理内存的四分之一
long maxDirectMemory = sun.misc.VM.maxDirectMemory() / 1024 / 1024;
System.out.println("配置的maxDirectMemory:" + maxDirectMemory + "MB");
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024);
}
}
5、内存溢出之无法创建新的本地线程
package com.jayway.oom;
public class UnableCreateNativeThreadErrorDemo {
public static void main(String[] args) {
for (int i = 0; true; i++) {
System.out.println("***************i:" + i);
//不断得创建新线程,直到超过操作系统允许应用进程创建线程的极限
new Thread(() -> {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
6、内存溢出之元空间溢出错误
package com.jayway.oom;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class metaspaceErrorDemo {
static class OOMTest {
}
public static void main(String[] args) {
int count = 0;
try {
//cglib不断创建类,模拟metaspace空间溢出,我们不断生成类往元空间中灌,超过元空间大小后就会抛出元空间移除的错误
while (true) {
count++;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMTest.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, args);
}
});
enhancer.create();
}
} catch (Throwable e) {
System.out.println("************多少次后发生了异常:" + count);
e.printStackTrace();
}
}
}
以上就是Java虚拟机常见内存溢出错误汇总的详细内容,更多关于Java虚拟机内存溢出的资料请关注考高分网其它相关文章!



