4. 垃圾回收- 4.3垃圾收集器
下面一張圖是HotSpot虛擬機包含的所有收集器,圖是借用過來滴:
- Serial收集器(復制算法)
新生代單線程收集器,標記和清理都是單線程,優點是簡單高效。是client級別默認的GC方式,可以通過-XX:+UseSerialGC來強制指定。 - Serial Old收集器(標記-整理算法)
老年代單線程收集器,Serial收集器的老年代版本。 - ParNew收集器(停止-復制算法)
新生代收集器,可以認為是Serial收集器的多線程版本,在多核CPU環境下有著比Serial更好的表現。 - Parallel Scavenge收集器(停止-復制算法)
并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般為99%, 吞吐量= 用戶線程時間/(用戶線程時間+GC線程時間)。適合后臺應用等對交互相應要求不高的場景。是server級別默認采用的GC方式,可用-XX:+UseParallelGC來強制指定,用-XX:ParallelGCThreads=4來指定線程數。- Parallel Old收集器(停止-復制算法)
Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量優先。 - CMS(Concurrent Mark Sweep)收集器(標記-清理算法)
高并發、低停頓,追求最短GC回收停頓時間,cpu占用比較高,響應時間快,停頓時間短,多核cpu 追求高響應時間的選擇。 - CMS 和G1的垃圾回收器的原理,阿里的面試官也問過,我專門做了專題:
- Parallel Old收集器(停止-復制算法)
圖解-CMS垃圾回收機制原理 --阿里面試題
CMS收集器和G1收集器優缺點
G1垃圾收集器入門
GC是什么時候觸發的(面試最常見的問題之一)
??由于對象進行了分代處理,因此垃圾回收區域、時間也不一樣。GC有兩種類型:Scavenge GC和Full GC。
Scavenge GC
??一般情況下,當新對象生成,并且在Eden申請空間失敗時,就會觸發Scavenge GC,對Eden區域進行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區。然后整理Survivor的兩個區。這種方式的GC是對年輕代的Eden區進行,不會影響到年老代。因為大部分對象都是從Eden區開始的,同時Eden區不會分配的很大,所以Eden區的GC會頻繁進行。因而,一般在這里需要使用速度快、效率高的算法,使Eden去能盡快空閑出來。
Full GC
對整個堆進行整理,包括Young、Tenured和Perm。Full GC因為需要對整個堆進行回收,所以比Scavenge GC要慢,因此應該盡可能減少Full GC的次數。在對JVM調優的過程中,很大一部分工作就是對于Full GC的調節。有如下原因可能導致Full GC:
a) 年老代(Tenured)被寫滿;
b) 持久代(Perm)被寫滿;
c) System.gc()被顯示調用;
d) 上一次GC之后Heap的各域分配策略動態變化;
?
下一篇:內存分配
?
原文鏈接:https://www.cnblogs.com/aspirant/p/8662690.html
轉載于:https://www.cnblogs.com/wangfajun/p/9916339.html
總結
以上是生活随笔為你收集整理的4. 垃圾回收- 4.3垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#开启线程的四种方式
- 下一篇: Python学习 Day 042 - c