目前所有垃圾收集器都是基于分代收集理论实现垃圾对象的清理,根据对象存活周期将不同的对象分配到同一个内存块中
标记复制算法 带有整理的标记算法,将可用内存对半分一半作为使用,一半作为复制时备用,对内存的利用率比较低
标记清除算法 没有整理,清除后对象内存碎片化 容易产生浮动碎片垃圾
标记整理算法 第一步和清除算法一样,第二步进行整理将对象对齐,减少碎片垃圾
Java堆中主要有年轻代和老年代 GC垃圾收集器的执行通过JVM的minor GC和full GC执行 GC垃圾收集器也分为老年代垃圾收集器和年轻代垃圾收集器
所有垃圾收集器都有STOP ZHE WORLD的机制(下文称之为STW):在GC垃圾收集器执行垃圾收集的时候,暂停所有应用线程的执行直到垃圾收集器执行完成,对用户来说可能在某一个操作出现卡顿,执行慢的现象,对电商项目来说这是非常关注的一个点,JVM调优的其中一个重点就是降低STW的时间增加用户使用友好度
常见的垃圾收集器
Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)
俗称串行(单线程)垃圾收集器 能够兼顾年轻代和老年代的垃圾收集,由于没有多线程下的并行收集所以在单线程下有高效快速的优点
老年代:标记整理算法 年轻代:标记复制算法
应用程序线程 - > GC收集线程,应用程序线程(暂停) - > 应用程序线程
Parallel收集器(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代))
为Java默认使用的垃圾收集器,在Serial收集器的基础上加入了并行垃圾收集,是Serial收集器的多线程版本,吞吐量高,但是STW时间较长,对用户使用不太友好
应用程序线程 - > GC收集线程(多线程并发执行) ,应用程序线程(暂停)- > 应用程序线程
ParNew收集器(-XX:+UseParNewGC)
parallel收集器的进阶版本,垃圾收集流程很类似,目的是为了能和CMS收集器一起使用
网友评论