淺談Java中的System.gc()的工作原理


很多人把Java的“效率低下”歸咎於不能自由管理內存,但我們也知道將內存管理封裝起來的好處,這里就不贅述。

Java中的內存分配是隨着new一個新的對象來實現的,這個很簡單,而且也還是有一些可以“改進”內存回收的機制的,其中最顯眼的就是這個System.gc()函數。

乍一看這個函數似乎是可以進行垃圾回收的,可事實並不是那么簡單。
其實這個gc()函數的作用只是提醒虛擬機:程序員希望進行一次垃圾回收。但是它不能保證垃圾回收一定會進行,而且具體什么時候進行是取決於具體的虛擬機的,不同的虛擬機有不同的對策。

那么下一個問題就是:gc()進行回收的准則是什么?也就是說什么樣的對象可以被回收?
簡單來說就是:沒有被任何可達變量指向的對象。這里的可達是我發明的……意思就是能夠找到的,那什么樣的是不可達的呢?
比如說:
a.v = b;
b.v = c;
/*
 *Watch out !
 */
a.v = d;
看一下這段代碼:
第一行:對象a的變量v指向了對象b
第二行:對象b的變量v指向了對象c
第六行:對象a的變量v指向了變量d。
這個時候,雖然變量c指向的對象有c以及b.v指向它,但是它們都已經不可達了,為什么?因為唯一可以找到它們的是a.v,但是現在a.v指向了d,所以他們就是不可達的了。

理由也很直觀:沒有任何可達變量指向你,你還有活下去的理由嗎?你就算活下去誰能找得到你呢?

所以說,C++中將釋放了的指針置為null的習慣要保留到Java中,因為這有可能是你釋放內存的唯一途徑。

最后的箴言:不要頻繁使用gc函數。
我的建議是:保持代碼健壯(記得將不用的變量置為null),讓虛擬機去管理內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM