第一節 垃圾收集機制簡介以及簡單配置

垃圾收集機制(GC)是JVM用於釋放那些不再使用的對象所佔用內存的程序和算法。GC並沒有寫入在java語言定製的標準中,因此並不是所有的JVM都有GC。GC的主要目的就是清除不再使用的對象。

垃圾回收的兩種方法:

1.引用計數

引用計數表示一個對象被引用的所有次數,當引用計數爲0時,則表示該對象沒有被引用,可以將其刪除。

2.對象引用樹

目前比較常用的垃圾收集機制是對象引用樹,即將對像的引用關係構建成一棵樹,從一組根對象開始,對所有對象進行查找,通過遞歸查找若在該樹中找到相應的對象,則將該對象標記爲可達的即該對象仍然被引用,否則標記該對象爲不可達。最後通過簡單的堆棧掃描,刪除標記爲不可達的對象,釋放相應的內存。

PS:如果只是簡單的將標記爲不可達的對象刪除,就會出現多個內存片段,有可能這些內存片段太小都不可用,這樣就會造成內存的浪費。因此,通常是再刪除對象後採用內存壓縮方法將可用對象變得放在一起,空閒內存放在一起,這樣就能夠再次利用。要是進行內存重組,JVM需要停止其他的活動,即所有與應用程序相關的工作停止,只有GC運行,這樣就會產生多次程序中斷。

Sun的JVM中的垃圾收集器:分代收集器


       這種收集器將內存分爲多個區域,用於存放不同壽命的對象。首先新建立的對象放在一個區域,在一段時間以後該對象還存在則將其移動到另一個壽命更長的區域中。JVM有新域(Young Generation)、舊域(Tenured Geneartion)、永久域(Perm Generation),JVM生成的所有新的對象放在新域中,對象經歷幾輪垃圾收集循環以後,便獲得使用期允許進入舊域。永久域中存放的是類和方法對象。通常永久域不認爲是堆的一部分。

1.配置堆區域

堆區域:是新域和舊域之和。

設置堆的初始大小:java  -Xms128m

設置堆的最大大小:java  -Xmx128m

PS: 通常將初始堆大小和最大堆大小設置爲相同的,這樣就避免程序動態增加堆大小。

2.配置新域和舊域

  1)設置新域初始值和最大值爲64m

    Java –Xms256m–Xmx256m–Xmn64m

  2)使用-XX:NewSize|MaxSize設置設置新域的初始值和最大值

    Java –Xms256m –Xmx256m –XX: NewSize64m –XX:MaxNewsize=64m

  3)設置新域和舊域的比例

    Java –Xms128m –Xmx128m–XX:NewRatio=3

    堆大小爲128m,新域比例爲3,即新域與舊域比例爲1:3,新域大小爲128/4n=32m

PS: 設置了新域的大小,將堆的大小減去新域的大小即爲舊域的大小。

3.配置永久域

永久域的大小默認是4M。運行程序時,會動態調整大小以滿足需求,每次調整,JVM會對堆進行一次完全的垃圾收集。

  1)使用-XX:MaxPermSize來增加永久域的大小

    Java –XX:MaxmPerSize=64m

  2)當JVM加載類時,永久域中的對象急劇增加,從而使JVM不斷調整永久域的大小。爲了避免調整,可以使用-XX:PermSize設置初始值。

    Java –Xms512 –Xmx512m–Xmn128m –XX: PermSize=32m -XX: MaxPermSize=64m

4.配置新域子空間

新域有:Eden、from救助空間、to救助空間構成;Eden用於存放新建的對象,當Eden被充滿時,收集器停止執行應用程序,把所有可達到的對象複製到當前的from救助空間中;當from救助空間被從滿時,收集器則把可達到對象複製到to救助空間中。這樣保證活動的對象在救助空間中,知道其獲得進入舊域。

默認情況下,新域使用複製收集器,舊域使用標記—清除—壓縮收集器。

複製收集器:堆分爲兩個區間,JVM新生成的對象放在一個區間,可達到的對象放在另一個區間,從而壓縮堆棧。僅僅適用於短生命週期的對象,否則來回複製效率太低。

  1)使用-XX:SurvivorRatio控制新域子空間大小

    SurvivorRatio規定救助域與Eden空間的比值。

    Java –Xms256m –Xmx256m–Xmn64m –XX:SurvivorRation=2

    新域64m,其中Eden32m,每個救助域16m(SurvivorRatio表示Survivor: Eden=1:2)

  2)使用-XX:TargetSurvivorRatio來控制救助域之間的比例,默認是50是一個百分比。當較大的堆棧使用較低的SurvivorRatio時,應該增加TargetSurvivorRatio爲80~90,以便更好的利用救助空間。用-XX:MaxTenuringThreshold可以控制上限。

例子:爲了防止所有的複製全部發生,希望對象從Eden直接擴展到舊域,將MaxTenuringThreshold=0,設置完成後實際上就不用救助域了,因此將SurvivorRation設置爲最大值以最大化Eden空間

    Java –Xms256m –Xmx256m–XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章