GC 是垃圾收集的意思,內存處理是編程人員容易出現問題的地方,忘記或者錯誤
的內存回收會導致程序或系統的不穩定甚至崩潰,Java 提供的 GC 功能可以自動
監測對象是否超過作用域從而達到自動回收內存的目的,Java 語言沒有提供釋放
已分配內存的顯示操作方法。Java 程序員不用擔心內存管理,因為垃圾收集器會
自動進行管理。要請求垃圾收集,可以調用下面的方法之一:System.gc() 或
Runtime.getRuntime().gc() ,但 JVM 可以屏蔽掉顯示的垃圾回收調用。
垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通
常是作為一個單獨的低優先級的線程運行,不可預知的情況下對內存堆中已經死
亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回
收器對某個對象或所有對象進行垃圾回收。在 Java 誕生初期,垃圾回收是 Java
最大的亮點之一,因為服務器端的編程需要有效的防止內存泄露問題,然而時過
境遷,如今 Java 的垃圾回收機制已經成為被詬病的東西。移動智能終端用戶通常
覺得 iOS 的系統比 Android 系統有更好的用戶體驗,其中一個深層次的原因就在
於 Android 系統中垃圾回收的不可預知性。
補充:垃圾回收機制有很多種,包括:分代復制垃圾回收、標記垃圾回收、增量
垃圾回收等方式。標准的 Java 進程既有棧又有堆。棧保存了原始型局部變量,堆
保存了要創建的對象。Java 平台對堆內存回收和再利用的基本算法被稱為標記和
清除,但是 Java 對其進行了改進,采用“分代式垃圾收集”。這種方法會跟 Java
對象的生命周期將堆內存划分為不同的區域,在垃圾收集過程中,可能會將對象
移動到不同區域:
伊甸園(Eden):這是對象最初誕生的區域,並且對大多數對象來說,
這里是它們唯一存在過的區域。
幸存者樂園(Survivor):從伊甸園幸存下來的對象會被挪到這里。
終身頤養園(Tenured):這是足夠老的幸存對象的歸宿。年輕代收集
(Minor-GC)過程是不會觸及這個地方的。當年輕代收集不能把對象放進終身
頤養園時,就會觸發一次完全收集(Major-GC),這里可能還會牽扯到壓縮,
以便為大對象騰出足夠的空間。
與垃圾回收相關的 JVM 參數:
-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年輕代的大小
-XX:-DisableExplicitGC — 讓 System.gc()不產生任何作用
-XX:+PrintGCDetails — 打印 GC 的細節第 244 頁 共 485 頁
-XX:+PrintGCDateStamps — 打印 GC 操作的時間戳
-XX:NewSize / XX:MaxNewSize — 設置新生代大小/新生代最大大小
-XX:NewRatio — 可以設置老生代和新生代的比例
-XX:PrintTenuringDistribution — 設置每次新生代 GC 后輸出幸存者
樂園中對象年齡的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:設置老
年代閥值的初始值和最大值
-XX:TargetSurvivorRatio:設置幸存區的目標使用率