<强>,Java中内存异常StackOverflowError与OutOfMemoryError详解强>
使用Java开发,经常回遇到内存异常的情况,而StackOverflowError和OutOfMemoryError便是最常遇见的错误。
首先,看看这两种错误的解释:
<>强如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。强>
这里把异常分为两种情况,但是存在一些相互重叠的地方:当栈空间无法继续分配时,到底是内存太小,还是已经使用的栈空间太大,本质上是对同一个问题的两种描述而已。
接下来,两个小例子分别展示如何产生这两种异常:
OutOfMemoryError异常:
<强>首先设置一下虚拟机启动参数,如下:强>
代码如下:
进口java.util.ArrayList; 进口并不知道; 公开课TEST1 { 静态类OOMObject { } 公共静态void main (String [] args) { List列表=new ArrayList (); 而(真){ 列表。添加(新OOMObject ()); } } } >之前 错误信息入下:
异常的线程“主要”. lang。OutOfMemoryError: Java堆空间 在java.util.Arrays。copyOf(未知来源) 在java.util.Arrays。copyOf(未知来源) 在java.util.ArrayList。成长(未知来源) 在java.util.ArrayList。ensureExplicitCapacity(未知来源) 在java.util.ArrayList。ensureCapacityInternal(未知来源) 在java.util.ArrayList。添加(未知源) 在com.ws.TEST1.main (TEST1.java: 13) >之前StackOverflowError异常:
公开课TEST2 { 私人int stackLength=1; 公共空间stackLeak () { stackLength + +; stackLeak (); } 公共静态void main (String [] args) { TEST2伯父=new TEST2 (); 尝试{ oom.stackLeak (); }捕捉(Throwable e) { system . out。println(“堆栈长度:”+ oom.stackLength); 把e; } } } >之前错误信息如下:
堆栈长度:7585 异常的线程java.lang.StackOverflowError“主要” com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) com.ws.TEST2.stackLeak (TEST2.java: 8) …… >之前感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
Java中内存异常StackOverflowError与OutOfMemoryError详解