怎樣解決棧溢出

來源:互聯網
上載者:User

標籤:style   blog   http   java   使用   資料   

1,什麼是棧溢出?

由於棧一般默覺得1-2m,一旦出現死迴圈或者是大量的遞迴調用,在不斷的壓棧過程中,造成棧容量超過1m而導致溢出。

2,解決方式:

方法一:用棧把遞迴轉換成非遞迴

通常,一個函數在調用還有一個函數之前,要作例如以下的事情:a)將實在參數,返回地址等資訊傳遞給被調用函數儲存; b)為被調用函數的局部變數分配儲存區;c)將控制轉移到被調函數的入口. 從被調用函數返回調用函數之前,也要做三件事情:a)儲存被調函數的計算結果;b)釋放被調函數的資料區;c)按照被調函數儲存的返回地址將控制轉移到調用函數.全部的這些,不論是變數還是地址,本質上來說都是"資料",都是儲存在系統所分配的棧中的. 那麼自己就能夠寫一個棧來儲存必要的資料,以降低系統負擔。

 

方法二:使用static對象替代nonstatic局部對象

在遞迴函式設計中,能夠使用static對象替代nonstatic局部對象(即棧對象),這不僅能夠降低每次遞迴調用和返回時產生和釋放nonstatic對象的開銷,並且static對象還能夠儲存遞迴調用的中間狀態,並且可為各個調用層所訪問。

 

方法三:增大堆棧大小值

當建立一個線程的堆棧時,系統將會保留一個連結程式的/STACK開關指明的地址空間地區。可是,當調用CreateThread或_beginthreadex函數時,能夠重載原先提交的記憶體數量。這兩個函數都有一個參數,能夠用來重載原先提交給堆棧的地址空間的記憶體數量。假設設定這個參數為0,那麼系統將使用/STACK開關指明的已提交的堆棧大小值。後面將假定我們使用預設的堆棧大小值,即1MB的保留地區,每次提交一個頁面的記憶體。

 

Java在建立線程時設定棧大小:thread(threadgroup group, runnable target, string name, long stacksize) 
         分配新的 thread 對象,以便將 target 作為其執行對象,將指定的 name 作為其名稱,作為 group 所引用的線程組的一員,並具有指定的堆棧大小。

Java虛擬機器的堆大小怎樣設定:命令列

 java –Xms128m //JVM佔用最小記憶體

–Xmx512m //JVM佔用最大記憶體

–XX:PermSize=64m //最小堆大小

–XX:MaxPermSize=128m //最大堆大小

本文來自http://blog.csdn.net/luqiang454171826 ,引用必須註明出處!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.