finalize() 和 system.gc() 的區別

11. object = new ReallyBigObject();
12. // more code here
13. object = null;
14.
Which statement should be placed at line 14 to suggest that the virtual
machine expend effort toward recycling the memory used by the
object rbo?
A. System.gc();
B. Runtime.gc();
C. System.freeMemory();
D. Runtime.getRuntime().growHeap();
E. Runtime.getRuntime().freeMemory();
java

Answer: A c++

 

finalize()是由JVM自動調用的,你能夠用System.gc(),但JVM不必定會馬上執行,JVM感受內存空間有限時,纔會開始執行finalize(),至於新的對象建立個數和被收集個數不一樣是由於收集的對象只和JVM的垃圾收集策略有關。 jvm


1.構造函數
要點:
構建器(Constructor)屬於一種較特殊的方法類型,由於它沒有返回值.這與 void返回值存在着明顯的區別。對於void返回值,儘管方法自己不會自動返回什麼,但仍然可讓它返回另外一些東西。構建器則不一樣,它不只什麼也不會自動返回,並且根本不能有任何選擇.若建立一個沒有構件器的類,則編譯器會自動建立一個默認構件器. 函數

2.finalize()和gc() spa

(1)問題:finalize()函數是幹嗎的?Java不是有Garbage Collection(如下簡稱gc)來負責回收內存嗎?
回答:
gc 只能清除在堆上分配的內存(純java語言的全部對象都在堆上使用new分配內存),而不能清除棧上分配的內存(當使用JNI技術時,可能會在棧上分配內存,例如java調用c程序,而該c程序使用malloc分配內存時).所以,若是某些對象被分配了棧上的內存區域,那gc就管不着了,對這樣的對象進行內存回收就要靠finalize().
舉個例子來講,當java 調用非java方法時(這種方法多是c或是c++的),在非java代碼內部也許調用了c的malloc()函數來分配內存,並且除非調用那個了 free() 不然不會釋放內存(由於free()是c的函數),這個時候要進行釋放內存的工做,gc是不起做用的,於是須要在finalize()內部的一個固有方法調用它(free()).
finalize的工做原理應該是這樣的:一旦垃圾收集器準備好釋放對象佔用的存儲空間,它首先調用finalize(),並且只有在下一次垃圾收集過程當中,纔會真正回收對象的內存.因此若是使用finalize(),就能夠在垃圾收集期間進行一些重要的清除或清掃工做. code

(2)問題:finalize()在何時被調用?
回答: 對象

有三種狀況 內存

1.全部對象被Garbage Collection時自動調用,好比運行System.gc()的時候.
2.程序退出時爲每一個對象調用一次finalize方法。
3.顯式的調用finalize方法 get

 

除此之外,正常狀況下,當某個對象被系統收集爲無用信息的時候,finalize()將被自動調用,可是jvm不保證finalize()必定被調用,也就是說,finalize()的調用是不肯定的,這也就是爲何sun不提倡使用finalize()的緣由. 簡單來說finalize()是在對象被GC回收前會調用的方法System.gc()強制GC開始回收工做糾正不是強制是建議具體執行要看GC的意思簡單地說調用了 System.gc() 以後java 在內存回收過程當中就會調用那些要被回收的對象的 finalize() 方法。 編譯器

相關文章
相關標籤/搜索