JVM內存模型回收算法

JVM結構原理,GC工作機制

程序計數器(Program Counter (PC) Register):官方解釋是指向當前線程正在執行的字節碼指令的地址、行號。明明說了當前線程正在執行的字節碼,爲什麼還要存儲它的地址行號呢?原因是CPU工作的原理是有任務調度的,有可能該字節碼沒有執行完畢就被掛起啦,這樣解釋可能就容易理解了。

 虛擬機棧(Java Virtual Machine Stacks):棧是一種數據結構,數據結構是存儲數據的,因此虛擬機棧就是當前線程運行方法是所需的數據、指令以及返回地址。虛擬機棧是first in last out,裏面的每執行一個方法就是一個棧幀,遞歸的方法(進過實例測試遞歸多少次就會有多少棧幀)。     

本地方法棧 (Native Method Stacks):本地方法棧與虛擬機棧發揮的功能非常類似,只是虛擬機棧爲虛擬機執行java方法而服務,而本地方法棧爲虛擬機執行native方法而服務。與虛擬機棧一樣,本地方法棧也會拋出 StackOverflowError OutOfMemoryError異常。任何本地方法接口都會使用某種本地方法棧。當虛擬機調用java方法時,虛擬機會創建一個棧幀並且壓入虛擬機棧;當虛擬機調用本地(native)方法時,虛擬機不會創建新的棧幀,虛擬機棧會保持不變,虛擬機只是簡單的動態連接並直接調用相關的本地方法。     

方法區(Method Area):方法區在JVM中也是一個非常重要的區域,它與堆一樣,是被線程共享的區域。在方法區中,存儲了每個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯後的代碼等。在方法區中有一個非常重要的部分就是運行時常量池,它是每一個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM後,對應的運行時常量池就被創建出來。當然並非Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中,比如Stringintern方法。       

(Heap Memory):堆數據區是用來存放對象和數組(特殊的對象)。堆內存由多個線程共享。堆內存隨着JVM啓動而創建。衆所周知,Java中有一個很好的特性就是自動垃圾回收。垃圾回收就操作這個數據區來回收對象進而釋放內存。如果堆內存剩餘的內存不足以滿足於對象創建,JVM會拋出OutOfMemoryError錯誤。

 

 

JVM結構 1.類加載器 2.執行引擎 3.內存區 4.本地方法接口(主要是調用C或C++實現的本地方法及返回結果)

GC的主要任務: 1.分配內存; 2.確保被引用對象的內存不被錯誤的回收; 3.回收不再被引用的對象的內存空間 垃圾回收機制的主要解決問題 1.哪些內存需要回收?

針對問題一,垃圾收集器會對堆進行回收前,確定對象中哪些是“存活”,哪些是”死亡“

1.引用計數算法 2.可達性分析算法

2.什麼時候回收?

即使是被判斷不可達的對象,也要再進行篩選,當對象沒有覆蓋finalize()方法,或者finalize方法已經被虛擬機調用過,則沒有必要執行;
如果有必要執行——放置在F-Queue的隊列中——Finalizer線程執行。

3.如何回收?

垃圾收集算法: 1.標記—清除算法 兩個階段:標記,清除; 不足:效率問題;空間問題(會產生大量不連續的內存碎片)

2.複製算法 將可用內存按容量分爲大小相等的兩塊,每次都只使用其中一塊; 不足:將內存縮小爲了原來的一半 新生代

3.標記—整理算法 標記,清除(讓存活的對象都向一端移動) 老年代

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章