天天看點

JVM 記憶體模型和垃圾回收(二): 串行垃圾回收器

JVM 記憶體模型和垃圾回收(二): 串行垃圾回收器

Java HotSpot VM包括三種類型的垃圾回收器,分别有各自不同的特點.

  • 串行回收(Serial GC)

    串行回收是指使用單線程的方式進行垃圾回收。适合于單個cpu線程的機器,但也可以用于多線程cpu的機器應用記憶體最大在100M以下的應用。可以根據作業系統配置自動選擇,或者明确指定

    --XX:+UseSerialGC

  • 并行回收(Parallel GC)

    并行回收(也被稱為throughput collector)在執行minor collections并行回收,并且中間還會涉及到并行聚合。适合中等應用,這個會在接下來具體解釋。

  • 并發回收(Concurrent Mark and Sweep, 簡稱CMS)

    這裡oralce的定義是在并行地進行垃圾回收(比如應用也一直運作),盡可能使暫停的時間很短。這個主要可以用于對反應時間要求很高的應用.這個解析來具體解釋.

串行回收的特點:

With the serial collector, both young and old collections are done serially (using a single CPU), in a stop-theworld

fashion. That is, application execution is halted while collection is taking place

使用串行回收,young和old的記憶體都會串行的

stop-the-world

的方式進行回收。當進行回收的時候需要全面停止應用

  1. 對young generation回收動作
    • 首先拷貝Eden中存活的到empty的survivor空間,如果object太大,那麼會直接進old generation
    • 接下來非empty中存活的對象需要進行判斷,如果不夠old,那麼也拷貝到剛才的empty空間,否則拷貝到old空間。如果剛才empty的survivor空間不夠使用,那麼也是直接進入old generation
    • 接下來交換兩個survivor的角色。
  2. 對old generation的回收動作

    old generation是通過

    mark-sweep-compact

    的算法進行回收的。 在mark階段, 回收器判斷哪些是存活的,sweep階段判斷是回收垃圾,compact階段是進行記憶體偏移(應該說是整理,類似磁盤的碎片整理), 允許以後再使用的時候可以配置設定到比較大的記憶體,并且可以使用bump-the-pointer的技術進行配置設定記憶體。