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 区,老年代只有一个内存空间
多次回收循环后存活下来的对象,最终会推给老年代。
默认情况下,老年代使用的也是并行标记清除回收程序,并且回收程序会整理老年代,清除内存碎片