1. 程式人生 > >jvm垃圾回收器(《深入理解java虛擬機器》)

jvm垃圾回收器(《深入理解java虛擬機器》)

---恢復內容開始---

程式計數器、虛擬機器棧、本地方法棧,這三個區域隨著執行緒生,隨著執行緒死。重複入棧出棧,還有基本確定 編譯後 各區域所需要的記憶體大小是確定的。所以這部分回收不需要過多考慮。

主要回收物件為堆、方法區。java動態原則,大多數物件都是執行期間才會被載入的,所以堆上的容量是動態(分配和回收)變化的。

1.堆上回收記憶體(回收已死物件)

怎麼判斷已死?

每個類都有一個finalize()方法,,jvm判斷一個物件是否死亡,先根搜尋演算法篩一遍,標記出不可達物件,,並放在一個佇列中,由一個執行緒去逐個執行finalize()方法。若某個物件重寫了finalize()方法,並且在此方法中成功講自己連接出去了,,那就抹去標記,暫留狗命。若沒有重寫或沒有成功推出自己,則只有等死。

finalize()方法,在一次次回收中,,只會被系統呼叫一次。(?)

finalize()一般被用在物件快死了,,釋放被其佔用的資源。但是 try finally  好像也可以。

 

2.方法區回收

這部分是有回收的,廢棄的常量和 無用的類。

 

 

3.垃圾回演算法

3.1標記回收

先標記再回收:可能產大量碎片,,沒有可以被分配的連續記憶體,效率也底。

3.2複製演算法

兩塊一樣大的記憶體,,一塊用的差不多的了,,將上面活著的物件複製到另一塊上,,原來的清空。

 

 

3.3標記-整理演算法

讓存活的物件自己想某個區域”靠近“,,然後回收這個區域端邊接意外的記憶體。

3.4分代收集演算法

 

4.垃圾收集器

http://www.cnblogs.com/zuoxiaolong/p/jvm8.html

 

5.記憶體分配與回收策略

https://www.cnblogs.com/xiaoxi/p/6557473.html