Code-Life icon indicating copy to clipboard operation
Code-Life copied to clipboard

<深入理解Java虚拟机> 摘抄 & 二刷感悟

Open Draymonders opened this issue 4 years ago • 3 comments

2020.08.23 留坑

Draymonders avatar Aug 23 '20 11:08 Draymonders

#运行时数据区 d0Wv60.png

Draymonders avatar Aug 23 '20 12:08 Draymonders

GC

  • 哪些垃圾需要回收
  • 什么时候回收
  • 如何回收

哪些垃圾需要回收

  • 引用计数(无法删除循环引用的情况)
  • 可达性分析
    • d07MrR.png
    • GC Roots d07XLR.png

GC算法

  • 名词d0XQqH.png
  • 标记清除 (两个缺点 1. 堆中存在大量需要回收的对象时,效率低(so 使用并发); 2. gc完后,内存随便话,所以引申出来了后面两种方法 )
  • 标记复制 (两个相同的区域,一边满了以后gc,然后将active的对象放到另一边)
  • 标记整理 (老年代需要回收的对象并不多,所以gc完后,进行内存的整理)

具体的GC算法实现

  • CMS, G1, ZGC TODO

分代垃圾回收

新生代垃圾回收

  • IBM 有专门研究表明,新生代中的对象 98% 都是朝生夕死,所以就不需要按照复制算法中1:1的比例来划分内存空间。

  • 这里鉴于此,新生代采用了如下的划分策略。 现在把新生代再划分为三部分,一块较大的 Eden 和两块较小的 Survivor 区域。 当执行垃圾回收时,将 EdenSurvivor 中还存活着的对象一次性地拷贝到另外一块 Survivor 空间上,最后清理掉 Eden 和刚才用过的 Survivor 的空间。HotSpot 虚拟机默认 Eden 和 Survivor 的大小比例是8∶1,也就是每次新生代中可用内存空间为整个新生代容量的90%80%+10%),只有10%的内存是会被 “浪费” 的。

  • 这样清理完成后,原来的 Survivor 就空了,并一直保持为空,直到下次 Minor GC 时,它再作为存活对象的盛放地。两个 Survivor 就这样轮流当做 GC 过程中新生代存活对象的中转站。

Draymonders avatar Aug 23 '20 12:08 Draymonders

类加载机制

todo

Draymonders avatar Aug 27 '20 08:08 Draymonders