JVM:堆、棧、方法區
阿新 • • 發佈:2019-02-06
堆
中記憶體劃分Java堆是和Java應用程式關係最密切的記憶體空間,幾乎所有的物件都放在其中,並且Java堆完全是自動化管理,通過垃圾收集機制,垃圾物件會自動清理,不需自己去釋放。
根據垃圾回收機制的不同,Java堆有可能擁有不同的結構,最為常見的就是將整個Java堆分為新生代和老年代。其中新生代存放新生的物件或者年齡不大的物件,老年代則存放老年物件。
新生代分為edn區,s0區,s1區,s0和s1也被稱為from和to區域,他們是兩塊大小相等,並且可以互相轉換的空間。
絕大多數情況下,物件首先分配在edn區,在新生代回收後,如果物件還存活,則進入s0或s1區,之後每經過一次新生代回收,如果物件存活則他的年齡就加1,物件達到一定的年齡後,則進入老年代。
- 舉例:A a=new A();首先把物件存放到堆記憶體當中,發現這個A只用了一次,首先會進入新生代裡邊去,存放到edn區域裡面,因為Java堆自動化管理,垃圾收集機制,發現這個a只用了一次,如果a又被一段程式碼引用,垃圾回收機制有演算法,每引用一次記錄一次,就會馬上進入到s0或者是s1區域,一旦a這個物件引用次數非常多了,就會存放到老年代裡去。
總結:想一下,垃圾回收機制是回收新生代多一些還是老年代多一些,其實是回收新生代多一些,因為老年代已經穩定下來了,程式已經知道了,引用的比較多了 。
Java、
棧
Java棧是一塊執行緒私有的空間,一個棧,一般由3部分組成:區域性變量表,操作資料棧,和幀資料區
區域性變量表:用於報錯函式的引數及區域性變數
- * 操作資料棧*:主要儲存計算過程的中間結果,同時作為計算過程中的變數臨時的儲存空間。
- 幀資料區: 除了區域性變量表和操作資料棧以外,棧還需要一些資料來支援常量池的解析,這裡幀資料區儲存著訪問常量池的指標,方便程式訪問常量池,另外當函式返回或出現異常時,虛擬機器必須有一個異常處理表,方便傳送異常的時候找到異常的程式碼,因此異常處理表也是幀資料區的一部分。
Java、
方法區
Java方法區和堆一樣,方法區是一塊所有執行緒共享的記憶體區域,他儲存系統的類資訊,比如類的欄位,方法,常量池等,方法區的大小決定系統可以儲存多少個類,如果系統定義太多個類,導致方法區溢位,虛擬機器同樣會丟擲記憶體溢位的錯誤,方法區可以理解為永久區
舉例: static int a=10;因為從來不會修改,也稱之為永久區的一個概念。
Good Luck!