首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 垃圾回收機制詳解與實測示例

     編輯:Java 相關知識

什麼是 Garbage Collection (GC)?

Java 在 JVM 內建自動記憶體管理機制——垃圾回收器 (Garbage Collector)。它會不定期啟動,掃描堆積區,找出不再被任何引用指向的物件,並釋放其佔用的記憶體。這是 Java 與 C/C++ 等需手動管理記憶體語言最大的差異之一。

核心概念

  • 達標物件:從 GC Roots(區域變數、靜態欄位、JNI 參考等)出發,透過引用鏈可到達的物件。
  • 不可達物件:無任何引用鏈可達,視為垃圾,下次 GC 會回收。
  • Runtime.getRuntime():取得唯一的 Runtime 實例,可查詢總/剩餘記憶體、手動觸發 gc()(僅建議,不保證立即執行)。

實測程式碼

public class GCTest {
    public static void main(String[] argv) {
        Runtime rt = Runtime.getRuntime();
        System.out.println("Program start");
        System.out.println("Free/Total memory (bytes): " + rt.freeMemory() + "/" + rt.totalMemory());

        MyObject obj1 = new MyObject(1);
        MyObject obj2 = new MyObject(2);
        MyObject obj3 = new MyObject(3);

        System.out.println("After created three MyObject objects");
        System.out.println("Free/Total memory (bytes): " + rt.freeMemory() + "/" + rt.totalMemory());

        obj1 = null;
        obj2 = null;
        obj3 = null; // 解除引用,變為不可達

        System.out.println("After released three MyObject objects");
        System.out.println("Free/Total memory (bytes): " + rt.freeMemory() + "/" + rt.totalMemory());

        // 建議 JVM 執行 GC(不保證立即執行)
        System.gc();
        System.out.println("After System.gc() suggestion");
        System.out.println("Free/Total memory (bytes): " + rt.freeMemory() + "/" + rt.totalMemory());
    }
}

class MyObject {
    private int id;
    private byte[] data = new byte[1024 * 100]; // 佔用約 100KB
    public MyObject(int id) { this.id = id; }
}

執行結果解讀

  • 建立物件後,freeMemory 下降。
  • 將引用設為 null 後,物件變為不可達,但 freeMemory 不會立即回升(GC 尚未跑)。
  • 呼叫 System.gc() 後,若 GC 執行,freeMemory 會上升。

常見 GC 演算法簡介

演算法特點
標記-清除標記存活物件,清除其餘;產生記憶體碎片。
複製將存活物件複製到另一區域;無碎片,但浪費一半空間。
標記-整理標記後將存活物件向一端移動;無碎片,效率略低。
分代收集新生代用複製,老年代用標記-整理;現代 JVM 主流策略。

開發者注意事項

  • 避免在 finalize() 做複雜邏輯(不可預測、影響效能)。
  • 善用弱引用 (WeakReference)、軟引用 (SoftReference) 實現快取。
  • 大物件直接進老年代,避免頻繁 Minor GC 複製開銷。
  • 監控 GC 日誌 (-Xlog:gc*) 分析效能瓶頸。

結語

GC 讓 Java 開發者免於手動記憶體管理之苦,但理解其運作原理(分代、觸發條件、調優參數)對編寫高效能、低延遲系統至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved