垃圾回收“GC是在什么時候,對什么東西,做了什么事情?”


什么時候觸發的GC機制

  ①在程序空閑的時候。這個回答無力吐槽

  ②程序不可預知的時候/手動調用system.gc()。關於手動調用不推薦

  ③Java堆內存不足時,GC會被調用。當應用線程在運行,並在運行過程中創建新對象,若這時內存空間不足,JVM就會強制地調用GC線程,以便回收內存用於新的分配。若GC一次之后仍不能滿足內存分配的要求,JVM會再進行兩次GC作進一步的嘗試,若仍無法滿足要求,則 JVM將報“out of memory”的錯誤,Java應用將停止。就是

  這時候如果你們講出新生代和老年代的話或許會更細的了解一下Minor GC、Full GC、OOM什么時候觸發!

  創建對象是新生代的Eden空間調用Minor GC;當升到老年代的對象大於老年代剩余空間Full GC;GC與非GC時間耗時超過了GCTimeRatio的限制引發OOM。

什么東西

被GC回收的對象都有哪些特征

  ①超出作用域的對象/引用計數為空的對象。

  引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器就加1;當引用失效時,計數器值就減1;任何時刻計數器都為0的對象就是不可能再被使用的。

  ②從GC Root開始搜索,且搜索不到的對象

  跟搜索算法:以一系列名為 GC Root的對象作為起點,從這些節點開始往下搜索,搜索走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈的時候,則就證明此對象是不可用的。

  這里會提出一個思考,什么樣的對象能成為GC Root : 虛擬機中的引用的對象、方法區中的類靜態屬性引用的對象、方法區中常量引用的對象、本地方法棧中jni的引用對象。

  ③從root搜索不到,而且經過第一次標記、清理后,仍然沒有復活的對象。

GC對對象做了什么

  不同年代、不同種類的收集器很多,不過總體的作用是刪除不使用的對象,騰出內存空間。補充一些諸如停止其他線程執行、運行finalize等的說明。

ok  現在來回答一下我們最上面的問題,上面時候容易發生內存泄露

  ①靜態集合類像HashMap、Vector等

  ②各種連接,數據庫連接,網絡連接,IO連接等沒有顯示調用close關閉,不被GC回收導致內存泄露。

③監聽器的使用,在釋放對象的同時沒有相應刪除監聽器的時候也可能導致內存泄露。


免責聲明!

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



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