Java中常见的几种的溢出
2021-05-29 23:06
标签:memory 内存溢出 field 空间 value java ret 没有 实例 在开发过程中,因为编程经验不足,经常会导致各种各样的溢出,今天本文就举例说明几种常见的溢出 堆溢出是最常见的一种溢出。 解决办法:调大堆空间大小 导致原因:方法调用太深,每执行一个方法,就有一次进栈操作,方法执行完就会出栈,无边界递归调用就会导致此问题 此方法一旦被调用就会产生栈溢出 导致原因:常量池空间有限,无法储存更多的常量了 方法区用来储存类定义信息 通过Unsafe在直接内存分配空间 Java中常见的几种的溢出 标签:memory 内存溢出 field 空间 value java ret 没有 实例 原文地址:https://www.cnblogs.com/yanchuanbin/p/14762634.html引言
堆溢出
导致原因:堆中没有足够的空间储存新生成的实例对象public static void main(String[] args) {
List
-Xmx2048M
栈溢出
public void plus() {
i++;
plus();
}
常量池溢出
public static void main(String[] args) throws Exception {
try {
List
方法区溢出
导致原因:大量的动态类生成,导致方法区空间不足 public static void main(String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TestCase.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
return arg3.invokeSuper(arg0, arg2);
}
});
enhancer.create();
}
}
直接内存溢出
导致原因:直接内存不足 public static void main(String[] args) {
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
while (true) {
unsafe.allocateMemory(ONE_MB);
count++;
}
} catch (Exception e) {
System.out.println("Exception:instance created " + count);
e.printStackTrace();
} catch (Error e) {
System.out.println("Error:instance created " + count);
e.printStackTrace();
}
}