1. 程式人生 > >什麼是GC對於GC垃圾回收機制的理解

什麼是GC對於GC垃圾回收機制的理解



       什麼是GC,GC就是垃圾回收機制:在系統執行過程中,會產生一些無用的物件,這些物件佔據著一定的記憶體,如果不對這些物件清理回收無用物件的記憶體,可能會導致記憶體的耗盡,所以垃圾回收機制回收的是記憶體。同時GC回收的是堆區和方法區的記憶體。

      JVM回收特點:(stop-the-world)當要進行垃圾回收時候,不管何種GC演算法,除了垃圾回收的執行緒之外其他任何執行緒都將停止執行。被中斷的任務將會在垃圾回收完成後恢復進行。GC不同演算法或是GC調優就是減少stop-the-world的時間。à(為何非要stop-the-world),就像是一個同學的聚會,地上有很多垃圾,你去打掃,邊打掃邊丟垃圾怎麼都不可能打掃乾淨的哈。當在垃圾回收時候不暫停所有的程式,在垃圾回收時候有new一個新的物件B,此時物件A是可達B的,但是沒有來及標記就把B當成無用的物件給清理掉了,這就會導致程式的執行會出現錯誤。

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的細節
  • -XX:+PrintGCDateStamps — 列印GC操作的時間戳
  • -XX:NewSize / XX:MaxNewSize — 設定新生代大小/新生代最大大小
  • -XX:NewRatio — 可以設定老生代和新生代的比例
  • -XX:PrintTenuringDistribution — 設定每次新生代GC後輸出倖存者樂園中物件年齡的分佈
  • -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:設定老年代閥值的初始值和最大值
  • -XX:TargetSurvivorRatio:設定倖存區的目標使用率