JVM虛擬機(二):堆、棧、方法區概念區別


Java 堆

Java堆是和Java應用程序關系最密切的內存空間,幾乎所有的對象都放在其中,並且Java堆完全是自動化管理,通過垃圾收集機制,垃圾對象會自動清理,不需自己去釋放。

根據垃圾回收機制的不同,Java堆有可能擁有不同的結構,最為常見的就是將整個Java堆分為新生代(Young Gen)和老年代(Tenured Gen)。其中新生代存放新生的對象或者年齡不大的對象,老年代則存放老年對象。

新生代分為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棧是一塊線程私有的空間,一個棧,一般由三部分組成:局部變量表、操作數據棧和幀數據區

局部變量表:用於報錯函數的參數及局部變量

操作數棧:主要保存計算過程的中間結果,同時作為計算過程中的變量臨時的存儲空間。

幀數據區:除了局部變量表和操作數據棧以外,棧還需要一些數據來支持常量池的解析,這里幀數據區保存着訪問常量池的指針,方便計程序訪問常量池,另外當函數返回或出現異常時賣虛擬機子必須有一個異常處理表,方便發送異常的時候找到異常的代碼,因此異常處理表也是幀數據區的一部分。

    

 

Java方法區

Java方法區和堆一樣,方法區是一塊所有線程共享的內存區域,他保存系統的類信息。

比如類的字段、方法、常量池等。方法區的大小決定系統可以保存多少個類。如果系統定義太多的類,導致方法區溢出。虛擬機同樣會拋出內存溢出的錯誤。方法區可以理解為永久區,也就是和上面新生代、老年代對應的持久代(Perm Gen)。

 

上一張完成的圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM