java中finalizer终结方法学习心得
最近在看java的中finalizer終結方法,也就是用來釋放內存的,但這絕對和C++中的析構函數不相同
C++中的析構函數是用來回收對象所占用的資源的方法,而在java中,當一個對象不可到達時(也就是重堆棧和靜態存儲區開始,由引用開始,尋找實體對象),垃圾回收器會釋放該對象所相關聯的存儲空間,并不需要程序員的編碼
對于finalizer方法的使用,就只有一條建議--------------盡量不要使用
effective? java中有這幾個結論
1?? 不應該依賴終結方法來更新重要的持久狀態
如用finalizer方法釋放數據庫上的永久鎖,而且finalizer方法是不一定會被調用的,只有到了內存滿了系統才會調用垃圾回收
2??? 使用終結方法有非常嚴重的性能損失
而且性能損失還有點大
?但有兩種情況下可以使用
1.當對象所有者忘記調用顯示的終結方法(如connection,inputstream,outputstream的close方法和Timer中的cancel方法,這只是一種保險的方法
? 完全可以由程序員的細心避免的,所以使用這些類的時候千萬要記住調用顯示的終結方法
2本地對象? 也就是其他語言編寫的對象托管給java管理,當垃圾回收器回收java對象時,那些本地對象占用的資源是不會回收的,所以這里就需要調用對象的finalizer方法
在說說垃圾回收器
垃圾回收器是用來回收java中無用的對象,也就是不可到達對象,他有很多種機制
1 引用計數器
每一個對象都會用一小塊存儲空間來存放引用計數器,當對象被引用時,計數器加1,當對象失去引用或對象引用被置為null時減1,當垃圾回收器檢測到對象的引用計數器為0時
垃圾回收器釋放資源,大家也許會想到資源釋放后那空間是不連續的,所以垃圾回收器還有整理空間的功能,讓空間連續
ps:這里會有一個缺陷,當幾個對象引用形成一個循環時,這些對象本來應該被釋放的,但由于他的引用計數器不為0,所以垃圾回收器不會釋放對象的內存資源
2停止-復制
垃圾回收器回重堆棧和靜態存儲區開始檢查所有引用,當對象是可到達時,就會把可到達的所有對象復制到另外一塊存儲空間上,而不可到達的便成為垃圾,這種機制的效率是非常低的,因為他會先停止程序,然后執行復制操作,復制的同時還必修改所有引用.完成復制后,空間是連續的,所以就不需要整理。當垃圾(不可到達對象)很少時,這種機制是非常不劃算的,所以有了下面的方法
3標記-清掃
速度想當面慢,但垃圾很少時相對于停止-復制是相當快的
從堆棧和靜態存儲區開始,遍歷所有引用,找出存活(可到達)對象并標記,當標記完后開始清理任務,清理后空間是不連續的,所以垃圾回收器還必須整理
如果只用一種機制,是不靈活的
所以有了第4種機制
4自適應
對象很穩定時用標記-清掃
垃圾回收器跟蹤標記清掃,當碎片很多的時候用停止-復制
如過你發現我有說的不對的地方,歡迎說出來大家一起分享
轉載于:https://www.cnblogs.com/evanlee/archive/2011/05/16/2048034.html
總結
以上是生活随笔為你收集整理的java中finalizer终结方法学习心得的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: HTML DOM content 属性
 - 下一篇: Python:安装pip