JVM_垃圾收集器与内存分配策略01
垃圾回收器(GC Garbage Collection)。
- 那些內存是需要回收的
- 什么時候進行回收
- 如何回收
有哪些內存需要回收,首先程序計數器、虛擬機棧、本地方法棧這些的生命周期和線程的生命周期是一樣的,棧中棧幀是隨著方法的進入和退出而執行著入棧和出棧,他們在內存分配和回收都是具有確定性的,因為在方法結束或者線程結束時,內存自然就跟著回收了,所以他們不需要過多的考慮回收的問題。
但是Java堆和方法區則不一樣,因為一個接口他會有多個實現類,這樣內存是不一定的,一個方法中多個分支需要的內存也可能不一樣,因為我們只有在程序運行期間才會知道要創建那些對象,這部分內存他是動態的分配和回收也是動態的,垃圾收集器所關注的是這部分內存。
對象是否還存在的問題:
堆中放在幾乎所有的實例對象,垃圾收集器在對堆進行回收前,第一件事就是判斷哪些對象是“活著”,那些對象是“死去”(既不可能再被任何途徑使用的對象)。
引用計數算法:
根搜索算法:
引用:
在jdk1.2之后,Java對引用進行了擴充,分為:強引用(strong reference)、軟引用(soft reference)、弱引用(week reference)、虛引用(phantom reference)四種,這四種引用強度依次逐漸減弱。
如何判斷是否這個對象要被回收:
在根搜索算法不可達的對象,也不是一定要死亡,宣布一個對象死亡,至少要經歷兩次標記的過程:一是是根搜索后的發現沒有與GC Roots相連接的引用鏈,那它將會被第一次標記且進行一次篩選,篩選的條件是此對象是否有必要執行finalize()方法。當對象沒有覆蓋finalize()方法,或者finalize()方法已經被虛擬機調用過,虛擬機將這兩種情況都視為“沒有必要執行”。
假如被判定為有必要執行finalize()方法,那么這個對象將會被放置在一個名為F-Queue的隊列中,并在稍后由一條由虛擬機自動建立的、低優先級的Finalizer線程去執行。
Java提供finalize()方法,垃圾回收器準備釋放內存的時候,會先調用finalize()。
- (1).對象不一定會被回收。
- (2).垃圾回收不是析構函數。
- (3).垃圾回收只與內存有關。
- (4).垃圾回收和finalize()都是靠不住的,只要JVM還沒有快到耗盡內存的地步,它是不會浪費時間進行垃圾回收的。
有時當撤消一個對象時,需要完成一些操作。例如,如果一個對象正在處理的是非Java 資源,如文件句柄或window 字符字體,這時你要確認在一個對象被撤消以前要保證這些資源被釋放。為處理這樣的狀況,Java 提供了被稱為收尾(finalization )的機制。使用該機制你可以定義一些特殊的操作,這些操作在一個對象將要被垃圾回收程序釋放時執行。
要給一個類增加收尾(finalizer ),你只要定義finalize ( ) 方法即可。Java 回收該類的一個對象時,就會調用這個方法。在finalize ( )方法中,你要指定在一個對象被撤消前必須執行的操作。垃圾回收周期性地運行,檢查對象不再被運行狀態引用或間接地通過其他對象引用。就在對象被釋放之前,Java 運行系統調用該對象的finalize( ) 方法。
方法區的回收:
方法區又叫做hotspot虛擬機中的永久代。永久代收集主要回收兩部分:廢棄常量和無用類。
總結
以上是生活随笔為你收集整理的JVM_垃圾收集器与内存分配策略01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我被跨系统的换行符折磨疯了~~~
- 下一篇: spring_整体系统