一、java中的finalize()方法html
Java中假定finalize的工做原理爲:一旦垃圾回收器準備回收內存而釋放對象所佔內存的時候,會先調用該對象的finalize方法,而後在下一次再須要垃圾回收的時候才真正的回收對象。finalize()的做用:finalize用於在GC發生前事先調用去回收JNI調用中申請的特殊內存,下次GC發生時候保證GC後全部該對象的內存都釋放了。java
那麼就會出現一個疑問。java中自己就存在垃圾回收機制。那爲何還須要finalize()方法呢。緣由在於。java的垃圾回收機制只針對堆中的垃圾對象進行回收。也就是說,jvm只負責咱們new出來的內存堆塊。而對於那些不是new出來的,而是經過jni方法去調用非java實現的方法(通常爲c/c++)而調用的非堆內存時。jvm沒法去作垃圾回收的處理。所以這部份內存消耗就無法進行回收。所以java引入了finalize()方法。c++
所以咱們如今就可以很明顯的知道。finalize()方法是爲了處理jvm管理不到的內存消耗而誕生的。通常用於釋放特殊內存(jvm沒法處理的內存)。所以,若是某個類中定義了native方法。產生了一些非堆的內存消耗。此時才考慮finalize()方法去釋放非堆內存。jvm
finalize() 與 析構函數的不一樣函數
-Java由於有GC機制,因此沒有析構函數的概念!htm
-finalize不是C++中的析構函數:析構函數確定是會銷燬該對象的,可是finalize由於gc機制不會常常發生,因此其被執行的是不肯定的。若是gc不發生,那麼finalize()方法就不會調用。就算gc發生了,若是該類不是垃圾對象,那麼finalize()方法也不會調用。對象
gc回收機制blog
-Java的垃圾回收器只會釋放由咱們new出來的內存堆塊,那些不是由new出來的「特殊內存」,垃圾回收器是不會管理的。
-所謂的特殊內存指經過JNI用C/C++向系統申請的內存,這些內存若是不手動去清除就會一直佔據在內存中。
-並且,垃圾回收自己就有開銷,因此虛擬機不會常常GC,只有當內存快要耗盡的時候JVM纔會觸發GC。
二、類路徑內存