Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解
創(chuàng)新互聯(lián)是專業(yè)的秀嶼網(wǎng)站建設(shè)公司,秀嶼接單;提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行秀嶼網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
使用Java開(kāi)發(fā),經(jīng)?;赜龅絻?nèi)存異常的情況,而StackOverflowError和OutOfMemoryError便是最常遇見(jiàn)的錯(cuò)誤。
首先,看看這兩種錯(cuò)誤的解釋:
如果當(dāng)前線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的最大深度,將拋出StackOverflowError異常。 如果虛擬機(jī)在擴(kuò)展棧時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常。
這里把異常分為兩種情況,但是存在一些相互重疊的地方:當(dāng)??臻g無(wú)法繼續(xù)分配時(shí),到底是內(nèi)存太小,還是已經(jīng)使用的??臻g太大,本質(zhì)上是對(duì)同一個(gè)問(wèn)題的兩種描述而已。
接下來(lái),兩個(gè)小例子分別展示如何產(chǎn)生這兩種異常:
OutOfMemoryError異常:
首先設(shè)置一下虛擬機(jī)啟動(dòng)參數(shù),如下:
代碼如下:
import java.util.ArrayList; import java.util.List; public class TEST1 { static class OOMObject{ } public static void main(String[] args) { Listlist = new ArrayList (); while(true){ list.add(new OOMObject()); } } }
錯(cuò)誤信息入下:
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)
StackOverflowError異常:
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; } } }
錯(cuò)誤信息如下:
stack length:7585 Exception in thread "main" java.lang.StackOverflowError 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) ......
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!