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) Java虛擬機的堆大小怎樣設置:命令行 java –Xms128m //JVM占用最小內存 –Xmx512m //JVM占用最大內存 –XX:PermSize=64m //最小堆大小 –XX:MaxPermSize=128m //最大堆大小 本文來自http://blog.csdn.net/luqiang454171826 ,引用必須注明出處! |