最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java.lang.StackOverflowError出現(xiàn)的原因及解決

 更新時(shí)間:2022年07月01日 08:51:34   作者:psh1234  
這篇文章主要介紹了java.lang.StackOverflowError出現(xiàn)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java.lang.StackOverflowError出現(xiàn)的原因

嚴(yán)重: Exception initializing page context
java.lang.StackOverflowError
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)

StackOverflow  這個(gè)問題一般是程序里可能是有死循環(huán)或遞歸調(diào)用所產(chǎn)生的;可以查看一下程序,也可以增大JVM的內(nèi)存

在Eclipse中JDK的配置中加上 -XX:MaxDirectMemorySize=128  就行了,默認(rèn)是64M,增大一倍,還不行的話,就用256吧,

還不行的話,估計(jì)就是程序里頭有死循環(huán),或遞歸調(diào)用沒寫好了。

深入理解java.lang.StackOverflowError

StackOverflowError:棧溢出錯(cuò)誤,如果一個(gè)線程所需用到棧的大小>配置允許最大的棧大小,那么jvm就會(huì)拋出StackOverflow。

棧的特點(diǎn)

1、棧,也叫棧內(nèi)存,是jvm的內(nèi)存模型之一,每當(dāng)啟動(dòng)一個(gè)新線程的時(shí)候,jvm都會(huì)為它分配一個(gè)java棧。jvm只會(huì)直接對(duì)java棧執(zhí)行兩種操作,以幀為單位的壓棧和出棧。

2、棧存儲(chǔ)的內(nèi)容:方法內(nèi)的局部變量表、操作數(shù)、動(dòng)態(tài)鏈接、方法出口信息、其他等信息。

  • 1)局部變量表:保存函數(shù)的參數(shù)以及局部變量用的,局部變量表中的變量只在當(dāng)前函數(shù)調(diào)用中有效,當(dāng)函數(shù)調(diào)用結(jié)束后,隨著函數(shù)棧幀的銷毀,局部變量表也會(huì)隨之銷毀。
  • 2)操作數(shù):主要用于保存計(jì)算過程的中間結(jié)果,同時(shí)作為計(jì)算過程中變量臨時(shí)的存儲(chǔ)空間。在概念模型中,兩個(gè)棧幀是相互獨(dú)立的,但是大多數(shù)虛擬機(jī)的實(shí)現(xiàn)都會(huì)進(jìn)行優(yōu)化,令兩個(gè)棧幀出現(xiàn)一部分重疊,令下面部分的操作數(shù)棧與上面部分的局部變量表重疊在一塊,這樣在方法調(diào)用的時(shí)候可以共用一部分?jǐn)?shù)據(jù),無需進(jìn)行額外的參數(shù)復(fù)制傳遞。

  • 3)動(dòng)態(tài)鏈接:每個(gè)棧幀都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用,持有這個(gè)引用是為了支持方法調(diào)用過程中的動(dòng)態(tài)連接。在Class文件的常量池中存有大量的 符號(hào)引用,字節(jié)碼中的方法調(diào)用指令就以常量池中指向方法的符號(hào)引用為參數(shù)。這些符號(hào)引用一部分會(huì)在類加載階段或第一次使用的時(shí)候轉(zhuǎn)化為直接引用,這種轉(zhuǎn)化 稱為靜態(tài)解析。另外一部分將在每一次的運(yùn)行期期間轉(zhuǎn)化為直接引用,這部分稱為動(dòng)態(tài)連接。
  • 4)方法出口信息:在方法退出之前,都需要返回到方法被調(diào)用的位置,程序才能繼續(xù)執(zhí)行,方法返回時(shí)可能需要在棧幀中保存一些信息,用來恢復(fù)它的上層方法的執(zhí)行狀態(tài),方法出口信息獲取分為正常退出和異常退出。正常退出通過pc計(jì)數(shù)器的值獲取,異常退出通過異常處理器表確定返回地址。
  • 5)附加信息:虛擬機(jī)規(guī)范中允許具體的虛擬機(jī)實(shí)現(xiàn)增加一些規(guī)范中沒有描述的信息到棧幀中,這部分信息取決于虛擬機(jī)的實(shí)現(xiàn)。

3、棧的生命周期:隨著線程的創(chuàng)建而創(chuàng)建,線程的結(jié)束而消亡,釋放內(nèi)存,所以棧內(nèi)存是私有的。

4、棧的存儲(chǔ)方式:棧內(nèi)存以棧幀(Stack Frame)為單位存儲(chǔ),棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)有關(guān)方法和運(yùn)行期數(shù)據(jù)的數(shù)據(jù)集。當(dāng)一個(gè)方法M1被調(diào)用的時(shí)候,就會(huì)產(chǎn)生一個(gè)棧幀S1,并被壓入到棧中,M1方法又調(diào)用了M2方法,這個(gè)時(shí)候又產(chǎn)生棧幀S2也被壓入棧,M2方法執(zhí)行完畢后,S2棧幀先出棧,S1棧幀再出棧,遵循“先進(jìn)后出”原則。

出現(xiàn)StackOverflowError的原因分析

一般出現(xiàn)這個(gè)問題是因?yàn)槌绦蚶镉兴姥h(huán)或遞歸調(diào)用所產(chǎn)生的。

如:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //死循環(huán)
        int i=0;
        while (true){
            i++;
            Log.i("ruxing","i="+i);
        }
    }
    //遞歸
    private void add(int i){
        i++;
        Log.i("ruxing","i="+i);
        add(i);
    }
}

以遞歸為例,詳解程序:

1)啟動(dòng)MainActivity,會(huì)創(chuàng)建一個(gè)線程,同時(shí)創(chuàng)建一個(gè)棧內(nèi)存。

2)調(diào)用add()方法的時(shí)候,會(huì)對(duì)add()方法進(jìn)行壓棧操作,將add()運(yùn)行期數(shù)據(jù)的數(shù)據(jù)集保存到棧幀中。

3)add()遞歸調(diào)用時(shí),都會(huì)產(chǎn)生一個(gè)新的棧幀區(qū)塊,這是就會(huì)連續(xù)的產(chǎn)生新的棧幀區(qū)塊。

4)當(dāng)棧內(nèi)存超過系統(tǒng)配置的棧內(nèi)存,就會(huì)出現(xiàn)java.lang.StackOverflowError異常。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于MyBatis各種SQL操作詳解

    關(guān)于MyBatis各種SQL操作詳解

    這篇文章主要介紹了關(guān)于MyBatis各種SQL操作詳解,MyBatis 是一款優(yōu)秀的半自動(dòng)的ORM持久層框架,它支持自定義 SQL、存儲(chǔ)過程以及高級(jí)映射,需要的朋友可以參考下
    2023-05-05
  • Java關(guān)鍵字synchronized基本使用詳解

    Java關(guān)鍵字synchronized基本使用詳解

    這篇文章主要給大家介紹了關(guān)于Java關(guān)鍵字synchronized基本使用的相關(guān)資料,synchronized可以用來同步靜態(tài)和非靜態(tài)方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)數(shù)據(jù)脫敏(Desensitization)的操作指南

    Java實(shí)現(xiàn)數(shù)據(jù)脫敏(Desensitization)的操作指南

    數(shù)據(jù)脫敏是指通過對(duì)敏感數(shù)據(jù)進(jìn)行部分或完全隱藏處理,保護(hù)敏感信息在存儲(chǔ)和使用過程中的安全性,常見的應(yīng)用場(chǎng)景包括日志記錄、接口返回、報(bào)表展示、數(shù)據(jù)分析等,本文給大家介紹了Java實(shí)現(xiàn)數(shù)據(jù)脫敏(Desensitization)的操作指南,需要的朋友可以參考下
    2025-02-02
  • spring boot 添加admin監(jiān)控的方法

    spring boot 添加admin監(jiān)控的方法

    這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 詳解關(guān)于Windows10 Java環(huán)境變量配置問題的解決辦法

    詳解關(guān)于Windows10 Java環(huán)境變量配置問題的解決辦法

    這篇文章主要介紹了關(guān)于Windows10 Java環(huán)境變量配置問題的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java內(nèi)部類的繼承(全)

    Java內(nèi)部類的繼承(全)

    這篇文章主要介紹了Java內(nèi)部類的繼承,大家都知道JAVA內(nèi)部類的構(gòu)造器必須連接指向其外圍類對(duì)象的引用,所以在繼承內(nèi)部類的時(shí)候,需要在導(dǎo)出類的構(gòu)造器中手動(dòng)加入對(duì)基類構(gòu)造器的調(diào)用,需要的朋友可以參考下
    2015-07-07
  • SpringBoot整合screw實(shí)現(xiàn)數(shù)據(jù)庫文檔自動(dòng)生成的示例代碼

    SpringBoot整合screw實(shí)現(xiàn)數(shù)據(jù)庫文檔自動(dòng)生成的示例代碼

    這篇文章主要介紹了SpringBoot整合screw實(shí)現(xiàn)數(shù)據(jù)庫文檔自動(dòng)生成的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 在SpringBoot中如何利用Redis實(shí)現(xiàn)互斥鎖

    在SpringBoot中如何利用Redis實(shí)現(xiàn)互斥鎖

    當(dāng)我們利用Redis存儲(chǔ)熱點(diǎn)數(shù)據(jù)時(shí),突然就過期失效或者被刪除了,導(dǎo)致大量請(qǐng)求同時(shí)訪問數(shù)據(jù)庫,增加了數(shù)據(jù)庫的負(fù)載,為減輕數(shù)據(jù)庫的負(fù)載我們利用互斥鎖,本文重點(diǎn)介紹在SpringBoot中如何利用Redis實(shí)現(xiàn)互斥鎖,感興趣的朋友一起看看吧
    2023-09-09
  • SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題

    SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題

    這篇文章主要介紹了SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中操作Word修訂功能的示例詳解

    Java中操作Word修訂功能的示例詳解

    Word的修訂功能是一種在文檔中進(jìn)行編輯和審閱的功能,它允許多個(gè)用戶對(duì)同一文檔進(jìn)行修改并跟蹤這些修改,以便進(jìn)行審查和接受或拒絕修改,下面我們就來學(xué)習(xí)一下Java中操作Word修訂功能的方法,需要的可以參考下
    2023-12-12

最新評(píng)論

灵璧县| 定西市| 神池县| 安丘市| 阳原县| 垣曲县| 墨玉县| 大悟县| 万荣县| 镇远县| 临沂市| 任丘市| 阜宁县| 元谋县| 沭阳县| 元朗区| 泉州市| 花垣县| 孙吴县| 惠安县| 酉阳| 彝良县| 兴文县| 霍林郭勒市| 射洪县| 土默特左旗| 广汉市| 利辛县| 万年县| 平陆县| 海晏县| 汶上县| 三江| 松江区| 华蓥市| 屏山县| 武定县| 梨树县| 宜兰县| 崇义县| 比如县|