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