怎樣解決棧溢出


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 ,引用必須注明出處!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM