熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java的垃圾回收總結

2022-06-13   來源: Java核心技術 

  內存是稀缺的資源哪怕內存一塊錢一條!如果在編程中使用不當再大的內存也會耗光

  認識Java的自動垃圾回收

  垃圾回收是Java語言的一大特性方便了編程是以消耗性能為代價的而垃圾在這裡只無用的對象而C++是需要程序員自己寫析構函數來釋放內存的麻煩也有可能忘記而導致內存洩露

  Java語言對內存的分配管理是通過JVM內部機制決定的程序員可以不關心其處理

  垃圾回收的原理和意義

  Java虛擬機中有個稱之為垃圾回收器的東西實際上這個東西也許真正不存在或者是已經集成到JVM中了但這無關緊要我們仍然可以稱為為垃圾回收器

  垃圾回收器的作用是查找和回收(清理)無用的對象以便讓JVM更有效的使用內存

  垃圾回收器的運行時間是不確定的由JVM決定在運行時是間歇執行的雖然可以通過Systemgc()來強制回收垃圾但是這個命令下達後無法保證JVM會立即響應執行但經驗表明下達命令後會在短期內執行你的請求JVM通常會感到內存緊缺時候去執行垃圾回收操作

  垃圾回收過於頻繁會導致性能下降過於稀疏會導致內存緊缺這個JVM會將其控制到最好不用程序員擔心但有些程序在短期會吃掉大量內存而這些恐怖的對象很快使用結束了這時候也許有必要強制下達一條垃圾回命令這是很有必要的以便有更多可用的物理內存

  從上面了解到沒有用的對象就是垃圾准確的說當沒有任何線程訪問一個對象時該對象就符合垃圾回收的條件

  對於String存在一個字符串池這個不屬於本文討論的范圍字符串池中的垃圾回收算法和這裡所討論的垃圾回收完全是兩碼事但是不得不說的是字符串的胡亂拼接往往導致性能急劇下降尤其是在龐大的循環語句中拼接字符串就是在讓程序慢性自殺這也是很多Java程序員容易犯的毛病

  字符串既然是池就是為了緩沖為了有更高的命中率因此垃圾回收的頻率也許會比JVM對象垃圾回收器要低很多

  垃圾回收器僅僅能做的是盡可能保證可用內存的使用效率讓可用內存得到高效的管理程序員可以影響垃圾回收的執行但不能控制

  通過編程影響垃圾回收

  雖然程序員無法控制JVM的垃圾回收機制但是可以通過編程的手段來影響影響的方法是讓對象符合垃圾回收條件

  分別說來有一下幾種

  將無用對象賦值為null

  重新為引用變量賦值比如

  
 Person p = new Person(aaa);
 p = new Person(bbb);

  這樣new Person(aaa)這個對象就是垃圾了——符合垃圾回收條件了

  讓相互聯系的對象稱為對象

  
 Person p = new Person(aaa);
 Person p = new Person(bbb);
 Person p = new Person(ccc);
 p=p; p=p; p=p;
 p=null; p=null; p=null;

  在沒有對ppp置null之前它們之間是一種三角戀關系分別置null三角戀關系依然存在但是三個變量不在使用它們了三個Person對象就組成了一個孤島最後死在堆上——被垃圾回收掉

  強制的垃圾回收Systemgc()

  實際上這裡的強制是程序員的意願建議什麼時候執行是JVM的垃圾回收器說了算

  調用垃圾回收也不一定能保證未使用的對象一定能從內存中刪除

  唯一能保證的是當你內存在極少的情況垃圾回收器在程序拋出OutofMemaryException之前運行一次

  很神秘的finalize()方法

  finalize()方法的確很神秘是因為你不了解其原理

  原理finalize()方法是Object中的方法

  finalize()方法會在對象被垃圾回收之前被垃圾回收器調用一次這是Java語言的一種機制

  finalize()方法在任何對象上最多只會被垃圾回收器調用一次

  陷阱垃圾回收器無法保證垃圾對象能被回收因此finalize()方法也無法保證運行建議不要重寫finalize()方法即使重寫也不要在finalize()方法中寫關鍵的代碼

  finalize()方法中可以把自己傳遞個別的對象這樣就不是垃圾了避免了被回收但是當下次這個對象又符合垃圾回收的時候finalize()方法不會被調用第二次了而是直接被清理掉了

  總結

  理解了垃圾回收的前提是理解Java運行時的內存堆棧模型

  理解Java垃圾回收的目的是為了對Java內存管理有個認識在編程時更有效的使用內存

  不建議為了垃圾回收手動編寫大量代碼這是很愚蠢的做法可以通過簡單的方式去影響即可

  本文的討論的垃圾回收排除String對象String的垃圾回收與String池有很很大關系目前還沒有研究但是文中已經提及String使用中容易出現的問題


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26256.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.