java 對象與垃圾回收


C語言要求程序員顯示的分配內存,釋放內存

java語言不要求程序員分配內存和釋放內存,避免很多潛在的問題。java在創建對象時自動分配內存,並當該對象的引用不存在時釋放這塊內存

回收機制有如下特點:

  • 只負責回收堆內存中的對象,不負責回收物理資源,例如數據庫連接
  • 程序無法控制垃圾回收什么時候進行,它會在合適的時候進行
  • 回收任何對象之前先調用finalize()方法,能夠使對象恢復,讓一個引用變量引用該對象,

對象在內存中的三種狀態:

  • 可達狀態:對象創建之后,有一個或者多個引用變量指向改對象,可以通過這些引用變量調用該對象的實例變量和實例方法
  • 可恢復狀態:程序中某個對象沒有引用變量,為可恢復狀態,在這個狀態下,系統的垃圾回收機制准備回收該對象所占內存,回收之前會調用finalize()方法,如果系統在調用此方法時能夠讓一個引用變量重新引用該對象,則進入可達狀態,否則進入不可達狀態。
  • 不可達狀態:當對象與其他任何引用變量沒有關聯,且已經執行了finalize()方法仍然沒有進入可達狀態,則永久性的失去引用。只有是不可達狀態的對象才能被回收

強制垃圾回收:

程序只能控制一個對象何時不再被任何引用變量引用,但是不能控制何時被回收

強制系統進行垃圾回收——只是通知系統進行垃圾回收

強制垃圾回收有兩種方式:

System.gc()

RunTime.getRunTime().gc()

public class test1 { public static void main(String[] args) { for(int i=0;i<10;i++){ new test1(); } } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub
        System.out.println("調用finalize"); } }

運行上面代碼,沒有任何輸出,系統並沒有調用finalize()

public class test1 { public static void main(String[] args) { for(int i=0;i<10;i++){ new test1(); //System.gc();
 Runtime.getRuntime().gc(); } } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub
        System.out.println("調用finalize"); } }
加上 //System.gc(); Runtime.getRuntime().gc();任何一句會調用finalize(),但是只是建議回收機制回收,可能不會立即回收

finalize()方法:

在垃圾回收機制准備回收某對象所占用內存之前會先清理資源,如果沒有明確指定回收資源的情況下,java會提供默認清理該對象資源的機制,為finalize()方法

任何object類都可以重寫finalize()方法

垃圾回收機制調用該對象的finalize()是透明的,不能明確什么時候會調用,只有在程序認為需要更多額外內存,垃圾回收機制才會進行垃圾回收

finalize()有如下四個特點:

  • 不會主動調用某個對象的finalize()方法,交給回收機制進行調用
  • finalize()是否會被調用,何時調用,是不確定的,不是一個一定會執行的方法
  • 當JVM執行finalize()方法時,可能會使該對象及程序中的其他對象重新回到可達狀態
  • 當JVM執行finalize()方法出現異常時,不會報異常,會繼續執行程序

 

 

 


免責聲明!

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



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