关于1.7以前、1.7、1.8版本之间方法区、元空间的转变历史
1.7以前:
方法区/永久代:类、类加载器、运行时常量池、字符串常量池
1.7:
堆:字符串常量池
方法区/永久代:类、类加载器、运行时常量池
1.8:
堆:字符串常量池
元空间:类、类加载器、运行时常量池
JVM内存分配与回收
- GC = 内存垃圾回收
- GC分为Minor GC 和 Major GC
a. Minor GC = 新生代GC
b. Major GC = 老年代GC = Full GC - 以下是windows默认的内存分布

- 内存优先在Eden区,如果Eden区满了会触发一次Minor GC,会把Eden区和From区里可以回收的对象都回收掉,并且把剩余活着的对象(可能来自Eden & From区)尝试放到Survivor的To区,如果可以放下就放在To区,如果放不下,则会把放不下的大对象提前转移到老年代OldGen区(大对象直接进入老年代)。
- 长期存活的对象将进入老年代,Survivor区里的from和to会来回切换,每次切换都会把对象的岁数+1,如果超出一定阈值,则会把超出阈值的对象晋升到老年代中(长期存活的对象将进入老年代)
如何判断对象可以被回收
- 引用计数法(不采用)
给对象加一个引用计数器,每当有一个地方引用它,计数器就加1;每当引用失效,计数器就减1。任何时候如果计数器为0的对象就是不可能在被使用的对象。这个方法简单,高效,但是却没有被采用,主要是因为它很难解决对象之间互相循环引用的问题。 - 可达性分析算法(采用)
通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链的话,则证明此对象是不可用的,可以被回收 - finalize()方法最终判定对象是否存活
finalize方法是给对象最后的一次存活的机会,在上面可达性分析算法中不可达的对象,也不是非死不可的。 - 如何判断一个常量是废弃常量:如果当前没有任何String对象引用该字符串常量的话,则此常量是废弃常量
- 如何判断一个类是无用的类
a. 该类所有实例都被回收
b. 加载该类的ClassLoader已被回收
c. 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
垃圾收集算法
- 标记 - 清除算法
内存碎片问题 - 复制算法

- 标记 - 整理算法
标记过程和第一个标记-清除算法一样,但是后续步骤不是直接回收对象,而是把活着的对象向前移动到一起,这样活着的对象就变成连续的了,然后直接清理掉边界以外的内存。

- 分代收集算法
这种算法没有新的思想,只是根据对象存活周期的不同来实行不同的收集算法。
a. 比如新生代每次收集都会有大量对象死去,所以只需要复制少量对象,所以可以用复制算法。
b. 比如老年代的对象存活几率比较高,而且没有额外空间来分配担保,所以可以使用标记-清除或者标记 - 整理进行垃圾回收
垃圾收集器
- Serial收集器(年轻代)
单线程收集,新生代采用复制算法,老年代采用标记-整理算法;
特点:简单高效,但是STW时间太长了

- ParNew收集器(年轻代)
Serial的多线程版本,新生代采用复制算法,老年代采用标记-整理算法;
特点:可以和CMS收集器一起配合工作

- Parallel Scavenge收集器(年轻代)
和ParNew类似,新生代采用复制算法,老年代采用标记-整理算法;
特点:关注吞吐量(用户代码占用CPU时间/CPU总时间),即高效利率CPU。

- Serial Old收集器
也是单线程收集器。 - Parallel Old收集器
Parallel Scavenge收集器的老年代版本,使用多线程 + 标记-整理算法
特点:和Parallel Scanvenge一样 - CMS收集器(老年代)
和用户线程一起并发收集,目标是老年代的。
四个步骤:
a. 初始标记
b. 并发标记
c. 重新标记
d. 并发清除

特点:
a. 关注用户线程的停顿时间
b. 对CPU资源敏感
c. 无法处理浮动垃圾
d. 使用标记-清除算法,会导致大量空间碎片 - G1收集器(年轻代 + 老年代)
可以设置收集时间间隔和吞吐率,比较牛B,老年代和年轻代都能收集
特点:
a. 适用于多核大容量内存
b. 年轻代和老年代只是逻辑上的,物理上不再隔离,他们都是Region的集合(可以不连续)
c. 正常大都是YoungGC和MixedGC,不应该出现Full GC,如果出现Full GC,则说明有优化空间
d. G1整体上看是标记整理算法的实现,局部看是复制算法实现的
e. 可预测的停顿

总结:
- 各种收集器汇总表

- 收集器搭配使用图

176万+

被折叠的 条评论
为什么被折叠?



