欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

java.lang.StackOverflowError出現(xià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  這個問題一般是程序里可能是有死循環(huán)或遞歸調(diào)用所產(chǎn)生的;可以查看一下程序,也可以增大JVM的內(nèi)存

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

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

深入理解java.lang.StackOverflowError

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

棧的特點

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

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

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

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

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

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

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

一般出現(xiàn)這個問題是因為程序里有死循環(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)啟動MainActivity,會創(chuàng)建一個線程,同時創(chuàng)建一個棧內(nèi)存。

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

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

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

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

相關(guān)文章

  • 解決mybatis-plus3.4.1分頁插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過時失效問題

    解決mybatis-plus3.4.1分頁插件PaginationInterceptor和防止全表更新與刪除插件SqlE

    這篇文章給大家介紹了在Spring.xml文件中配置mybatis-plus3.4.1分頁插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過時失效問題解決方案,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-12-12
  • Java狀態(tài)機的一種優(yōu)雅寫法分享

    Java狀態(tài)機的一種優(yōu)雅寫法分享

    狀態(tài)機是一種數(shù)學(xué)模型,對于我們業(yè)務(wù)實現(xiàn)有很大的幫助。我們可以用非常多的方法實現(xiàn)狀態(tài)機,這篇文章就來介紹一個狀態(tài)機優(yōu)雅的實現(xiàn)方法,希望對大家有所幫助
    2023-04-04
  • Java使用BouncyCastle加密

    Java使用BouncyCastle加密

    本文主要介紹了Java使用BouncyCastle加密,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式

    springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式

    這篇文章主要介紹了springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot中的@ControllerAdvice使用方法詳細解析

    SpringBoot中的@ControllerAdvice使用方法詳細解析

    這篇文章主要介紹了SpringBoot中的@ControllerAdvice使用方法詳細解析, 加了@ControllerAdvice的類為那些聲明了@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的 方法的類而提供的專業(yè)化的@Component,以供多個 Controller類所共享,需要的朋友可以參考下
    2024-01-01
  • SpringBoot2使用JTA組件實現(xiàn)基于JdbcTemplate多數(shù)據(jù)源事務(wù)管理(親測好用)

    SpringBoot2使用JTA組件實現(xiàn)基于JdbcTemplate多數(shù)據(jù)源事務(wù)管理(親測好用)

    這篇文章主要介紹了SpringBoot2使用JTA組件實現(xiàn)基于JdbcTemplate多數(shù)據(jù)源事務(wù)管理(親測好用),在Spring?Boot?2.x中,整合了這兩個JTA的實現(xiàn)分別是Atomikos和Bitronix,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • java使用servlet實現(xiàn)驗證碼

    java使用servlet實現(xiàn)驗證碼

    這篇文章主要介紹了java使用servlet實現(xiàn)驗證碼,簡單實用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • java的Map集合中按value值進行排序輸出的實例代碼

    java的Map集合中按value值進行排序輸出的實例代碼

    下面小編就為大家?guī)硪黄猨ava的Map集合中按value值進行排序輸出的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • spring security在分布式項目下的配置方法(案例詳解)

    spring security在分布式項目下的配置方法(案例詳解)

    這篇文章主要介紹了spring security在分布式項目下的配置方法,本文通過一個項目案例給大家詳細介紹,通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 解決spring-boot 打成jar包后 啟動時指定參數(shù)無效的問題

    解決spring-boot 打成jar包后 啟動時指定參數(shù)無效的問題

    這篇文章主要介紹了解決spring-boot 打成jar包后 啟動時指定參數(shù)無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論