jvm垃圾回收器(《深入理解java虛擬機器》)
阿新 • • 發佈:2018-11-28
---恢復內容開始---
程式計數器、虛擬機器棧、本地方法棧,這三個區域隨著執行緒生,隨著執行緒死。重複入棧出棧,還有基本確定 編譯後 各區域所需要的記憶體大小是確定的。所以這部分回收不需要過多考慮。
主要回收物件為堆、方法區。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