Java中内存异常*Error与OutOfMemoryError详解
程序员文章站
2024-03-03 18:38:16
java中内存异常*error与outofmemoryerror详解
使用java开发,经常回遇到内存异常的情况,而stackover...
java中内存异常*error与outofmemoryerror详解
使用java开发,经常回遇到内存异常的情况,而*error和outofmemoryerror便是最常遇见的错误。
首先,看看这两种错误的解释:
如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出*error异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出outofmemoryerror异常。
这里把异常分为两种情况,但是存在一些相互重叠的地方:当栈空间无法继续分配时,到底是内存太小,还是已经使用的栈空间太大,本质上是对同一个问题的两种描述而已。
接下来,两个小例子分别展示如何产生这两种异常:
outofmemoryerror异常:
首先设置一下虚拟机启动参数,如下:
代码如下:
import java.util.arraylist; import java.util.list; public class test1 { static class oomobject{ } public static void main(string[] args) { list<oomobject> list = new arraylist<oomobject>(); while(true){ list.add(new oomobject()); } } }
错误信息入下:
exception in thread "main" java.lang.outofmemoryerror: java heap space at java.util.arrays.copyof(unknown source) at java.util.arrays.copyof(unknown source) at java.util.arraylist.grow(unknown source) at java.util.arraylist.ensureexplicitcapacity(unknown source) at java.util.arraylist.ensurecapacityinternal(unknown source) at java.util.arraylist.add(unknown source) at com.ws.test1.main(test1.java:13)
*error异常:
public class test2 { private int stacklength = 1; public void stackleak() { stacklength++; stackleak(); } public static void main(string[] args) { test2 oom = new test2(); try { oom.stackleak(); } catch (throwable e) { system.out.println("stack length:" + oom.stacklength); throw e; } } }
错误信息如下:
stack length:7585 exception in thread "main" java.lang.*error at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) at com.ws.test2.stackleak(test2.java:8) ......
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!