-
堆
中內(nèi)存劃分Java堆是和Java應用程序關系最密切的內(nèi)存空間慕趴,幾乎所有的對象都放在其中,并且Java堆完全是自動化管理,通過垃圾收集機制冕房,垃圾對象會自動清理躏啰,不需自己去釋放。
根據(jù)垃圾回收機制的不同耙册,Java堆有可能擁有不同的結構给僵,最為常見的就是將整個Java堆分為新生代和老年代。其中新生代存放新生的對象或者年齡不大的對象详拙,老年代則存放老年對象帝际。
新生代分為edn區(qū),s0區(qū)饶辙,s1區(qū)蹲诀,s0和s1也被稱為from和to區(qū)域,他們是兩塊大小相等弃揽,并且可以互相轉換的空間脯爪。
絕大多數(shù)情況下,對象首先分配在edn區(qū)蹋宦,在新生代回收后披粟,如果對象還存活,則進入s0或s1區(qū)冷冗,之后每經(jīng)過一次新生代回收守屉,如果對象存活則他的年齡就加1,對象達到一定的年齡后蒿辙,則進入老年代拇泛。
舉例:A a=new A();首先把對象存放到堆內(nèi)存當中思灌,發(fā)現(xiàn)這個A只用了一次俺叭,首先會進入新生代里邊去,存放到edn區(qū)域里面泰偿,因為Java堆自動化管理熄守,垃圾收集機制,發(fā)現(xiàn)這個a只用了一次耗跛,如果a又被一段代碼引用裕照,垃圾回收機制有算法,每引用一次記錄一次调塌,就會馬上進入到s0或者是s1區(qū)域晋南,一旦a這個對象引用次數(shù)非常多了,就會存放到老年代里去羔砾。
- 總結:想一下负间,垃圾回收機制是回收新生代多一些還是老年代多一些偶妖,其實是回收新生代多一些,因為老年代已經(jīng)穩(wěn)定下來了政溃,程序已經(jīng)知道了趾访,引用的比較多了 。
-
Java玩祟、
棧
- Java棧是一塊線程私有的空間腹缩,一個棧,一般由3部分組成:局部變量表空扎,操作數(shù)據(jù)棧,和幀數(shù)據(jù)區(qū)润讥。
- 局部變量表:用于報錯函數(shù)的參數(shù)及局部變量
- ** 操作數(shù)據(jù)棧**:主要保存計算過程的中間結果转锈,同時作為計算過程中的變量臨時的存儲空間。
-
幀數(shù)據(jù)區(qū): 除了局部變量表和操作數(shù)據(jù)棧以外楚殿,棧還需要一些數(shù)據(jù)來支持常量池的解析撮慨,這里幀數(shù)據(jù)區(qū)保存著訪問常量池的指針,方便程序訪問常量池脆粥,另外當函數(shù)返回或出現(xiàn)異常時砌溺,虛擬機必須有一個異常處理表,方便發(fā)送異常的時候找到異常的代碼变隔,因此異常處理表也是幀數(shù)據(jù)區(qū)的一部分规伐。
-
Java、
方法區(qū)
- Java方法區(qū)和堆一樣匣缘,方法區(qū)是一塊所有線程共享的內(nèi)存區(qū)域猖闪,他保存系統(tǒng)的類信息,比如類的字段肌厨,方法培慌,常量池等,方法區(qū)的大小決定系統(tǒng)可以保存多少個類柑爸,如果系統(tǒng)定義太多個類吵护,導致方法區(qū)溢出,虛擬機同樣會拋出內(nèi)存溢出的錯誤表鳍,方法區(qū)可以理解為永久區(qū)馅而。
- 舉例: static int a=10;因為從來不會修改进胯,也稱之為永久區(qū)的一個概念用爪。
- Good Luck!