您好,登錄后才能下訂單哦!
java中怎么實現垃圾收集器,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1.1 引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器為0的對象就是不可能再被使用的。 缺點:對象之間相互循環引用
1.2 可達性分析算法:通過一系列的稱為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連(用圖論的話來說,就是從GC Roots到這個對象不可達)時,則證明此對象是不可用的 GC Roots的對象包括下面幾種:
1. 虛擬機棧(棧幀中的本地變量表)中引用的對象 2. 方法區中類靜態屬性引用的對象 3. 方法區中常量引用的對象 4. 本地方法棧中JNI(即一般說的Native方法)引用的對象
強引用:程序代碼之中普遍存在的,類似“Object obj = new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象,直到拋出OutOfMemeryError異常。
軟引用:用來描述一些還有用但并非必需的對象。對于軟引用關聯著的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收范圍之中進行第二次回收。如果這次回收還沒有足夠的內存,才會拋出內存溢出異常。
弱引用:用來描述非必需對象的,但是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。
虛引用:也稱為幽靈引用或者幻影引用,它是最弱的一種引用關系。一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。為一個對象設置虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。
包含一下:
- 新生代:Serial、ParNew、Parallel Scavenge - 老年代:Serial Old、Parallel Old、CMS、G1
Serial收集器:Serial收集器是最基本、發展歷史最悠久的收集器,簡單而高效。因為是單線程收集,在工作期間會“Stop The World!”。Serial收集器對于運行在Client模式下的虛擬機來說是一個很好的選擇。
ParNew收集器:ParNew收集器其實就是Serial收集器的多線程版本。Serial收集器對于運行在Server模式下的虛擬機來說是一個很好的選擇。
Parallel Scavenge:Parallel Scavenge收集器是一個新生代收集器,也是使用復制算法的收集器,又是并行的多線程收集器。Parallel Scavenge收集器的目標則是達到一個可控制的吞吐量(Throughput)。所謂吞吐量就是CPU用于運行用戶代碼的時間與CPU總消耗時間的比值,即吞吐量 = 運行用戶代碼時間/(運行用戶代碼時間 +垃圾收集時間),虛擬機總共運行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%。 停頓時間越短就越適合需要與用戶交互的程序,良好的響應速度能提升用戶體驗,而高吞吐量則可以高效率地利用CPU時間,盡快完成程序的運算任務,主要適合在后臺運算而不需要太多交互的任務。 無法與CMS收集器配合工作。
Serial Old收集器:是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用“標記-整理”算法。主要是給Client模式下的虛擬機使用。
Parallel Old收集器:Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。
CMS收集器:CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器,基于“標記—清除”算法實現。 實現過程:
1. 初始標記(CMS initial mark) 2. 并發標記(CMS concurrent mark) 3. 重新標記(CMS remark) 4. 并發清除(CMS concurrent sweep)
初始標記、重新標記這兩個步驟仍然需要“Stop The World”。 初始標記只是標記一下GC Roots能直接關聯到的對象,速度很快。 并發標記階段就是進行GC Roots Tracing的過程。 重新標記階段則是為了修正并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比并發標記的時間短。
三個缺點:
CMS收集器對CPU資源非常敏感
無法處理浮動垃圾(Floating Garbage),可能出現“Concurrent Mode Failure”失敗而導致另一次Full GC的產生
空間碎片過多時,將會給大對象分配帶來很大麻煩,往往會出現老年代還有很大空間剩余,但是無法找到足夠大的連續空間來分配當前對象,不得不提前觸發一次Full GC
G1收集器:它是一款面向服務端應用的垃圾收集器。 具備以下特點:
并行與并發
分代收集
空間整合
可預測的停頓
G1收集器的運作大致可劃分為以下幾個步驟:
初始標記(Initial Marking)
并發標記(Concurrent Marking)
最終標記(Final Marking)
篩選回收(Live Data Counting and Evacuation)
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。