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
的方式進行回收。當進行回收的時候需要全面停止應用
- 對young generation回收動作
- 首先拷貝Eden中存活的到empty的survivor空間,如果object太大,那麼會直接進old generation
- 接下來非empty中存活的對象需要進行判斷,如果不夠old,那麼也拷貝到剛才的empty空間,否則拷貝到old空間。如果剛才empty的survivor空間不夠使用,那麼也是直接進入old generation
- 接下來交換兩個survivor的角色。
-
對old generation的回收動作
old generation是通過
的算法進行回收的。 在mark階段, 回收器判斷哪些是存活的,sweep階段判斷是回收垃圾,compact階段是進行記憶體偏移(應該說是整理,類似磁盤的碎片整理), 允許以後再使用的時候可以配置設定到比較大的記憶體,并且可以使用bump-the-pointer的技術進行配置設定記憶體。mark-sweep-compact