GC 是什么?為什么要有 GC?


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:設置幸存區的目標使用率


免責聲明!

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



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