stack 和heap | 新手Java 工程師的學習筆記 - - 點部落

文章推薦指數: 80 %
投票人數:10人

heap. 1.可動態申請之內存空間. 2.java中new XXX() 物件全部會放到heap中 一旦garbage collection system偵測到某對象沒被引用就會銷毀此物件. 大概三四個月前 準備面試時補習班老師給了我這個連結 http://www.importnew.com/27326.html 我試著爬文找答案 雖然沒完成但總之也整理了一些資訊 先從stack跟heap開始... stack:  1.stack在記憶體中用來存放可以預測生命週期的資料  以便作業系統管理,  可以想成一層一層堆起來的盒子裡面會存放數值型別的變數或是引用,  當變數生命週期結束盒子就會被移走   2.如果管理的不好會產生stackoverflow 3.生命週期在scope內{這裡面}也就是說跑到底就結束   heap 1.可動態申請之內存空間 2.java中newXXX()物件全部會放到heap中  一旦garbagecollectionsystem偵測到某對象沒被引用就會銷毀此物件 3.可想成在某個公園擺放得一團亂的盒子  物件參照會放到stack中的某個盒子,相對應的物件實體會放到公園中的某個空盒子  當物件實體生命週期結束,不再被引用,  就會被系統標註沒人使用最後再把它刪除   比較: 1.stack  優勢:存取速度比heap還快  缺點:stack中存的數據大小生命週期 都要固定缺乏靈活性 2.heap  優勢:動態分配內存大小,生命週期不用告訴編譯器  缺點:運行時要動態分配內存所以運行速度較慢 3.stack與heap一樣  在java都是程式自動管理無法自行設定stack或是heap 4.stack存八大基本資料:  int,short,long,byte,float,double,boolean,char  數據還可共享     比如inta=3; intb=3;  此時  系統會先在stack創立reference(參照類型)a然後找有沒有字面值為3的地址  沒有的話  會自己創一個再將a指向它  接著創造referenceb,看到有字面值3的地址就指向它  改b=4也不會刪掉3這個字面值,系統會新增一個4的字面值在stack然後再讓b指向它 5.wrapper會將資料存在heap  但String比較特殊  Stringa="abc";Stringb="abc";  Stringc=newString("abc");Stringd=newString("abc");  這樣的情況下   a==b成立,會在stack共用abc  c==d就不成立,因為兩者都會各新增一個實例再讓reference指向它們 6.Integeri=3底層會轉為Integeri=newInteger(3)  這點跟String不一樣     P.S 資料參考以下連結: http://619lucky.blogspot.tw/2010/09/java-stack-and-heap.html 原作者如果希望刪除這篇文章請告知,謝謝;)      stackheapjava 回首頁



請為這篇文章評分?