虚拟内存
进程在运行时,所操作的内存就是虚拟内存,每个进程之间的虚拟内存互相独立,通过 MMU 内存管理技术再映射到物理内存中,同时,虚拟内存空间块分为:
栈内存
栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配...同时引用了对方,就会造成: a变量删除后,由于存在b引用,引用计数>0,导致a变量无法回收,b变量同理,此时a,b变量都无法正常回收
出现 引用计数 循环引用 问题
引用计数可以很快的将变量进行回收,...,将灰色节点改为黑色,将灰色节点引用的节点改为灰色
4:重复步骤3,直到没有灰色节点
5:此时只剩黑色和白色节点,白色表示不可达对象,可以直接回收
三色标记法问题
以上gc步骤,都是建立在程序暂停时候执行的...,重新标记 黑白,再进行回收栈对象
删除屏障
在GC开始后,所有需要删除的 白色/灰色 对象都标记为灰色
通过插入屏障和删除屏障,解决了上面的引用删除问题
但是,删除屏障的回收精度低,只要是GC开始后...barrier)机制
混合写屏障规则:
1、GC 开始将栈上的可达对象全部扫描并标记为黑色 (之后不再进行第二次重复扫描,无需 STW)
2、GC 期间,任何在栈上创建的新对象,均为黑色。