java垃圾回收主要是靠一個低優先級的進程負責回收注意不是後台的進程他的優點是邊回收邊調整堆使其緊湊
主要有以下幾種算法
引用計數該算法在java虛擬機沒被使用過主要是循環引用問題因為計數並不記錄誰指向他無法發現這些交互自引用對象
怎麼計數?
當引用連接到對象時對象計數加
當引用離開作用域或被置為null時減
怎麼回收?
遍歷對象列表計數為就釋放有什麼問題?
循環引用問題
標記算法標記算法的思想是從堆棧和靜態存儲區的對象開始遍歷所有引用標記活得對象
對於標記後有兩種處理方式
()停止復制
所謂停止就是停止在運行的程序進行垃圾回收所謂復制就是將活得對象復制到另外一個堆上以使內存更緊湊優點在於當大塊內存釋放時有利於整個內存的重分配有什麼問題?
一停止干擾程序的正常運行二復制明顯耗費大量時間三如果程序比較穩定垃圾比較少那麼每次重新復制量是非常大的非常不合算什麼時候啟動停止復制?
內存數量較低時具體多低我也不知道
()清除
也稱標記清除算法
也就是將標記為非活得對象釋放也必須暫停程序運行優點就是在程序比較穩定垃圾比較少的時候速度比較快有什麼問題?
很顯然停止程序運行是一個問題只清除也會造成很對內存碎片
為什麼這個算法都要暫停程序運行?
這是因為如果不暫停剛才的標記會被運行的程序弄亂
()分代收集
分代收集是利用程序有大量臨時對象的特點對象每被引用一次代數就增加代數小的小型對象會被回收整理大對象只會代數增加不會被整理
優點在於對於處理大量臨時的變量很有幫助
()自適應
jvm會監測垃圾回收的效率在()()算法之間切換
增量收集增量回收的主要算法還是分代(Young Objects 回收)與Train算法(Mature Object回收)所謂增量回收的關鍵問題是如何實現有序的增量回收而不會導致混亂(引用及其的增加與減少)分代可以逐代回收Train算法可以逐個車廂回收這樣每次一代或每次一廂可以實現短停頓回收
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25846.html