垃圾回收思路-閱讀java編程思想

  • 引用計數:引用計數是一種簡單但是相對而言速度不高的垃圾回收的思路,簡單來說就是垃圾回收器會在對象的引用計數變爲0的時候進行回收,但是這種回收機制可能導致存在“應該回收的對象得不到回收”——也就是當對象之間存在循環引用的時候,可能會出現“對象應該被回收,但是其引用計數不爲0”的情況,這種時候,垃圾回收器定位這種交叉自引用的對象組所需要的工作量很大
    • 這引入了一個交叉自引用對象的問題,這種情況下,通過尋找“活”的對象來追溯其存活在堆棧或靜態存儲區中的引用——大概意思就是追蹤堆棧和靜態存儲區發現的每個引用對應的對象,然後接着追蹤每個對象對應的所有引用,反覆知道找出所有“活”的對象。
  • 停止-複製(stop-copy):這種方式簡單來說就是暫停程序然後將內存中存活對象複製到新的一塊內存,同時將活的對象緊湊排列,另外的都是垃圾,進行回收。這種方式存在的問題就是需要比原空間大一倍的空間來複制搬運,與此同時,很多時候,程序運行穩定之後,產生的垃圾數量可能很少,因此將所有內存從一處複製到另一處有些得不償失。
  • 標記-清掃(mark-and-sweep):首先同樣是尋找所有“活”的對象,然後每次找到一個“活”的對象,就給對象設一個標記,標記過程中不進行清掃,標記完成之後,開始清理,沒有標記的對象被清理,空間被釋放,這樣過後堆的空間很可能會不連續,此後需要重新整理剩下對象,進行緊湊
  • java虛擬機回收方式:Java虛擬機中,內存分配以“塊”爲單位,每個塊都有相應的代數來記錄其是否還存活,回收的時候垃圾回收器可以向廢棄的塊複製對象,垃圾回收器會定期進行完整的清理動作——大型對象仍然不會被複制(只是塊的代數增加),內含小型對象的那些塊則會被複制並且整理。Java虛擬機會進行監視,如果所有對象都很穩定(也就是說垃圾產生量不大),垃圾回收器效率降低的話,就切換到“標記-清掃”的方式,否則,切換到“停止-複製”的方式,這種方式我們將其稱之爲自適應式的垃圾回收方式。(這裏的回收我理解大概意思就是,大的對象直接佔據一個塊,所以通過塊引用來考慮回收問題,而針對部分存儲了多個小對象的塊而言,需要細緻到塊之中採用複製式的方式來整理回收)

 

 

邊學習邊修改

發佈了12 篇原創文章 · 獲贊 0 · 訪問量 1051
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章