接 JVM 那条
7.分代回收(垃圾分类)
划分依据:根据对象的年龄(经过GC扫描的轮次)
把堆划分成
新生代:伊甸区+生存区*2
老年代
一个对象的一生:
a)诞生于伊甸区
b)经过- -轮GC,如果存活,就通过复制算法,进入生存区
c)在生存区中经过GC后存活,还是通过复制算法,进入生存区2(每次经过GC扫描后,生存的对象都要被复制到另外-个生存
d)在生存区中活过一定的轮次之后,对象将被放到老年代(认为该对象生存时间会较长,就不再继续频繁扫描了)
e)老年代的对象也是需要进行GC的,扫描轮次没有新生代那么频繁了.
8.垃圾回收器
具体看下垃圾回收算法的集体实现/落地方式
评价垃圾回收器好坏的标准:
1).回收的空间效率.扫- -遍地,能扫出多少垃圾.
2).回收的速度.扫-遍地要花多长时间.
3).垃圾回收和应用线程之间能否并发执行.扫地的时候会不会影响到别人干活. (STW)
4).垃圾回收器是否是多线程的.
5).回收的时间是否是可预测的.承诺10分钟之内-定把地扫完.即使扫的不算非常干净,但是也最大程度上的把-些重要的垃圾清理掉了.
…
垃圾回收器里面都是要做两件事:标记(可达性分析) +回收(标记清除,标记复制,标记整理)
(1)1. Serial收集器.给新生代使用,串行回收.
复制算法.单线程进行标记+回收
单线程进行可达性分析+复制
当咱们进行回收的时候,应用程序线程,就都停止工作了. STW
STW的时间一定是要比应用线程运行时间短很多的.
(2)2. ParNew收集器新生代收集器 多线程并行GC)
此处的标记-回收过程使用多线程来完成.除此之外,和Serial收集器是非常相似的.
这个收集器回收效率就要比Serial版本更高- -些.
(3)Parallel Scavenge收集器(新生代收集器,并行GC)
设计初衷是为了尽量缩短STW时间.
GC停顿时间的缩短是以牺牲吞吐量和新生代空间作为代价的
工作流程同ParNew收集器,
这个收集器提供了一-些参数, 可以控制STW时间以及吞吐率.
相当于,承诺用户,在一定时间内就会完成一-次 GC,哪怕清理的不是特别干净,但是也能够很大程度上的清理到大部分垃圾了.
(4)Serial Old收集器老年代收集器,串行GC)
相当于Serial收集器的老年代版本.基本特点差不多,也是单线程的方式进行标记回收的.
单线程,串行的收集老年代内存.
(5)5. Parallel Old收集器(老年代收集器, 并行GC)
ParNew的老年代版本
(6)6. CMS老年代收集器并行GC [重要]
特点尽可能缩短STW时间.
采用的是多线程标记-清除
a)初始标记
[STW]
只是把和GCRoot直接相关的对象先标记出来.
这个标记过程时间比较短. (GCRo