JVM知识整理(2)

参考 CMS为什么采用标记-清除算法

JVM 中垃圾收集器有哪些

新生代垃圾收集器

  • Serial 收集器:Serial 收集器只能使用一条线程进行垃圾收集工作,并且在进行垃圾收集的时候,所有的工作线程都需要停止工作
  • ParNew 收集器: ParNew 垃圾收集器是Serial收集器的多线程版本。为了利用 CPU 多核多线程的优势,ParNew 收集器可以运行多个收集线程来进行垃圾收集工作。这样可以提高垃圾收集过程的效率。
  • Parallel Scavenge 收集器:Parallel Scavenge 收集器和其他收集器的关注点不同。主要关注点是如何控制系统运行的吞吐量
    (吞吐量 = 代码运行时间 / (代码运行时间 + 垃圾收集时间))

老年代垃圾收集器

  • Serial Old 收集器:Serial Old 收集器是 Serial 收集器的老年代版本
  • Parallel Old 收集器:Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本这个收集器是在 JDK1.6 版本中出现的,所以在 JDK1.6 之前,新生代的 Parallel Scavenge 只能和 Serial Old 这款单线程的老年代收集器配合使用。Parallel Old 垃圾收集器和 Parallel Scavenge 收集器一样,也是一款关注吞吐量的垃圾收集器,和 Parallel Scavenge 收集器一起配合,可以实现对 Java 堆内存的吞吐量优先的垃圾收集策略
  • CMS 收集器: CMS 收集器是目前老年代收集器中比较优秀的垃圾收集器。CMS 是 Concurrent Mark Sweep,从名字可以看出,这是一款使用"标记-清除"算法的并发收集器(虽然不会避免STW,但会减少长时间的STW)
    JVM知识整理(2)

CMS是一个面试细节比较多的收集器
以下内容来自 CMS为什么采用标记-清除算法我觉得写得非常好

CMS采用并发清除的原因

CMS主要关注低延迟,因而采用并发方式,清理垃圾时,应用程序还在运行,如何采用压缩算法,则涉及到要移动应用程序的存活对象,此时不停顿,是很难处理的,一般需要停顿下,移动存活对象,再让应用程序继续运行,但这样停顿时间变长,延迟变大,所以CMS采用清除算法

标记清除算虽然吞吐量高,但是采用标记清除,碎片多,占用额外内存,不能在堆空间满时清理,触发GC:
清理时,应用程序还在运行此时如果预留的空间不够应用程序申请的空间的话,则会触发Concurrent Mode Fail,此时便会启用后备收集器:SerialOld进行GC,产生全局停顿(GC时间反倒会更长!)

这里就要提到并发模式失败(Concurrent Mode Failure)


由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,
CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉。这一部分垃圾就称为“浮动垃圾”

CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。


(1)如果对象提升到年老代的速度太快,而CMS收集器不能保持足够多的可用空间时,就会导致年老代的运行空间不足;
(2)当年老代的碎片化达到某种程度,使得没有足够空间容纳从新生代提升上来的对象时,也会发生并发模式失败。


当发生并发模式失败时,年老代将进行垃圾收集以释放可用空间,同时也会整理压缩以消除碎片,
这个操作需要停止所有的java应用线程,(退化为serial old收集器)并且需要执行相当长时间。

其他收集器

G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色: * G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。 * G1的Stop The World(STW)更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿时间

收集器 使用算法
Serial 收集器 复制算法
ParNew 收集器 复制算法
Parallel Scavenge 收集器 复制算法
Serial Old 收集器 标记整理算法
Parallel Old 收集器 标记整理算法
CMS 收集器 标记-清除
G1 标记整理

G1和CMS的不同之处

  • G1 通过将内存空间分成区域(Region)的方式避免内存碎片问题,CMS 是清除,所以会存在很多的内存碎片 通过将内存空间分成区域(Region)的方式避免内存碎片问题。
  • G1 会在 Young GC 中使用(这句话不准确,因为在G1中已经没有代的概念了!!)、而 CMS 只能在 O 区使用
  • G1 可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象
  • G1 关注的是吞吐量优先,CMS是响应优先
    -CMS 的缺点是对 cpu 的要求比较高。G1 是将内存化成了多块,所有对内段的大小有很大的要求。

class文件是什么

Class 文件是一组以 8 位字节为基础单位的二进制流。各个数据项严格按顺序排列。

Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据。这样的伪结构仅仅有两种数据类型:无符号数和表。

无符号数:是基本数据类型。以 u1、u2、u4、u8 分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数,能够用来描写叙述数字、索引引用、数量值或者依照 UTF-8 编码构成的字符串值。

表:由多个无符号数或者其它表作为数据项构成的复合数据类型。全部表都习惯性地以 _info 结尾。