Chapter 6 Java 实现内存管理和并发编程的方式

allocation table - 分配表

stack frame - 栈帧

heap - 堆

reachable object - 可达对象/活性对象

GC Root - 通向可达对象的引用链根部一般称为 GC Root

mark and sweep 标记清除

标记清除,垃圾回收程序需要互斥存取整个堆,因此应用代码一直在运行,会不断创建和修改对象,应用线程会停顿一下(Stop-The-World, STW), 先停止所有应用线程,然后进行垃圾回收

对象的预期生命周期称为

弱代假设 (Weak Generation Hypothesis, WGH), 在这个假设中,对象常常处于少数几个预期生命周期之一

大多数的对象的生命期非常短,不久就会被垃圾回收,这些对象也称为 瞬时对象

筛选回收 Evacuation

将堆内存分成多个独立的内存空间,每次回收垃圾时,只为活性对象分配空间,并将这些对象移动到另一个内存空间。清理整个内存空间,供以后重复使用。

Eden 区 / Nursery 区

使用筛选回收程序的话,每个线程都可以单独分配内存,每个应用线程都有一块连续的内存-线程私有的分配缓冲区,专门供这个线程分配对象。为对象分配内存时,只需把指针指向分配缓冲区。

HotSpot 引入了 Survivor 区,用于保存前一次回收新生对象后存活下来的对象。筛选回收程序会在多个 Survivor 区之间来回复制存活下来的对象,直到超过 保有阈值, 再推给老年代

• 并行回收程序
使用多个线程执行回收操作的垃圾回收程序
• 并发回收程序
可以和应用线程同时运行的垃圾回收程序

HotSpot 堆

堆空间:新生代和老年代;新生代由三个区组成: Eden 区、两个 Survivor 区,老年代只有一个内存空间

多次回收循环后存活下来的对象,最终会推给老年代。

默认情况下,老年代使用的也是并行标记清除回收程序,并且回收程序会整理老年代,清除内存碎片