垃圾回收機制和算法

1.引用計數法
2.標記清除法
3.複製算法:用於新生代 s0,s1
4.分代算法:新生代,老年代
垃圾回收機制、內存溢出、內存泄露區別
什麼是垃圾回收機制?不定時的向堆內存清理不可達(不經常使用)對象,這些對象不可能百分百被垃圾回收機制進行回收的。
c++,C人工處理垃圾回收。

System.gc() 手動回收垃圾。
要想儘可能促使垃圾回收。可以設置一個新的對象置爲空。
如何知道執行了該方法:
重寫finalize()方法,該方法是gc()方法前會執行的方法。在該方法中可以打印一條語句,作爲標記

內存溢出與內存泄露的區別:
內存溢出:需要4g內存,只支持3g內存溢出
內存泄露:定義了很多靜態變量,垃圾沒有被回收,對象沒有被應用,報錯內存泄露

引用計數法:
在堆內存當中創建了一個User對象,
如果使用該方法的話,就會給這對象做標記,
如果說該標記標誌爲0的時候,就會被回收
而假設他會有15次機會,經過一段時間,發現該對象沒有被應用,那麼就會減1變爲14次,如果發現該對象被引用的時候,就會增加一次,變爲15次

總結
每個對象都會有一個標記,默認爲15次,gc回收時,對象現在不可達,減1,可達就加1

但是無法檢測到循環引用:如父類對象中有一個對子類對象的引用,子對象反過來引用父對象。這樣,他們的引用計數永遠不可能爲0,而每一次的加減非常的浪費內存。

複製算法:用於新生代中。(s0和s1大小相等)
原理:當s0區存在不可達對象的時候,就會把s0的可達對象複製到s1區中去,s0剩下的不可達對象就會被全部清除掉

優點:連續性,不會產生碎片化

標記清除與標記壓縮算法:0可達,1不可達
例如創建了一個user對象 被標記爲0
user2 被標記爲0
user3 0

當user變成不可達時,標記就會標記爲1 就會被回收掉
缺點:不是連續的

標記壓縮算法:一般用於老年代中
把不可達的對象放到前面,把可達對象放到後面,然後會把這些不可達對象進行壓縮,被一塊回收。就解決了標記算法的不可連續性,而實現了回收的連續性,沒有碎片

分代收集算法:
分爲新生代和老年代,不同的代進行不同的回收算法
垃圾回收如果頻繁回收,會降低程序的效率。因爲當進行垃圾回收時,其他線程都會被暫停。

垃圾收集器:
串行收集器:單線程收集垃圾,效率低
並行收集器:多線程,效率高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章