2. JVM
4、虚引用(PhantomReference)
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。
虚引用与软引用和弱引用的一个区别在于:
虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
特别注意:
在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。
2. JVM
1、CMS垃圾回收器介绍
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注᯿用户体验的应用上使用。
CMS(Concurrent Mark Sweep)收集器是 HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
从名字中的 Mark Sweep 这两个词可以看出,CMS 收集器是一种标记-清除”算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:
(1)初始标记
暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快;
(2)并发标记
同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这
个算法里会跟踪记录这些发生引用更新的地方;
(3)重新标记
᯿新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短;
(4)并发清除
开启用户线程,同时 GC 线程开始对未标记的区域做清扫。
从它的名字就可以看出它是一款优秀的垃圾收集器,
- 对 CPU 资源敏感
- 无法处理浮动垃圾
- 它使用的回收算法-“标记-清除”算法会导致收集结束时会有大ᰁ空间碎片产生
2、如何判断对象死亡
堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。
(1)引用计数法
给对象中添加一个引用计数器
每当有一个地方引用它,计数器就加1 当引用失效,计数器就减1
任何时候计数器为0的对象就是不可能再被使用的。
(2)可达性分析算法
这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。
3、垃圾回收中的三色标记法
(1)首先,我们重新定义黑、白、灰三种颜色的含义
白色代表需要 GC 的对象;
黑色代表确定不需要 GC 的对象;
灰色代表可能不需要 GC 的对象,但是还未完成标记的任务,也可以认为是增ᰁ任务。
(2)在三色标记-清除算法中
准备工作:
一开始所有对象都染成白色初始化完成后,会启动标记程序。在标记的过程中,是可以暂停标记程序执行 Mutation,算法需要维护 3 个集合,白色集合、黑色集合、灰色集合。3 个集合是互斥的,对象只能在一个集合
中。执行之初,所有对象都放入白色集合。
第一次执行:
算法将 Root 集合能直接引用的对象加入灰色集合;
往后执行:
不断从灰色集合中取出元素进行标记;
标记的过程主要分为 3 个步骤:
- 如果对象在白色集合中,那么先将对象放入灰色集合;
- 然后遍历节点的所有的引用对象,并递归所有引用对象;
- 当一个对象的所有引用对象都在灰色集合中,就把这个节点放入为黑色集合。
全站分卷索引 · 152 卷
- 1代码随想录知识星球精华(最强八股文)第五版(面经篇)
- 2后端面经02-美团
- 3Java面经02-阿里ICBU
- 4Java面经-04-CVET
- 5Java面经-06-字节后端
- 6Java面经08-用友
- 7Java面经09-快手
- 83. 计算机网络
- 94. 数据库
- 105. 算法
- 11Java面经11-美团
- 121.3 java的4种引用
- 132. JVM
- 143. 操作系统
- 154. 计算机网络
- 165. 数据库
- 17Java面经13
- 18Java面经14
- 19Java面经16
- 20Java面经17
- 21Java面经18
- 22二面
- 23三面
- 24面经19-Java-字节暑期实习
- 25字节三面
- 26面经21-Java-蚂蚁暑期实习
- 27蚂蚁三面
- 28MySQL
- 29计算机网络
- 30拉链法的工作原理
- 31确定桶下标
- 32扩容 - 基本原理
- 33链表转红黑树
- 34子进程和线程的区别
- 35协程
- 36数据库
- 37哈希索引
- 38计算机网络
- 39TCP和UDP的区别
- 40面经25-Java-百度二面
- 41面经26-Java-京东一面
- 42面经27-Spring
- 43计算机基础面经28
- 44计算机基础面经29
- 45计算机网络
- 46操作系统
- 47任务调度算法
- 48数据库
- 49计算机基础面经31
- 50乐观锁两种实现机制
- 51版本号机制
- 52死锁相关问题
- 53计算机网络
- 54拥塞控制的四种方法
- 55计算机基础面经32
- 56三次握手的流程
- 57计算机基础面经33
- 58计算机基础面经34
- 59异步
- 60C++后端
- 61面经3-C++-地平线
- 62面经6-C++-国电南瑞
- 63面经7-c++后端-字节
- 64二面
- 65面经11-C++-OPPO
- 66面经12-C++-商汤
- 67SelectDB
- 68面经15-C++-中望
- 69面经16-C++-米哈游
- 70面经17-C++-旷世
- 71面经19-C++-蔚来
- 72面经20-C++-第四范式
- 73面经21-C++-TP-Link
- 74面经23-C++-猿辅导
- 75面经25-C++-文远知行
- 76面经26-C++-百度
- 77百度二面
- 78百度三面
- 79面经27-C++-ZEKU
- 80ZEKU哲库HR面
- 81面经28-C++-VIVO
- 82面经29-C++-TPLINK
- 83字节二面
- 84HR面
- 85面经32-C++
- 86TCP的粘包与拆包
- 87引入协程的原因
- 88面经34-C++
- 892. 指针与引用的区别
- 902. Nagle 算法与延迟确认
- 91数据库
- 922. MVCC-多版本并发控制
- 93计算机网络
- 94面经36
- 95面经37
- 96面经38
- 97面经39-C++-拼多多+字节
- 98字节一面【7.27】
- 99shopee测开一面【7.29】
- 100一、表面上开销
- 101面经44-京东二面
- 102Go后端
- 103二面
- 104面经3-Go-字节日常实习
- 105字节二面
- 106字节三面
- 107HR面
- 108面经5-Go-字节暑期实习
- 109字节二面
- 110字节三面
- 111面经02-测开-百度提前批
- 112二面
- 113面经06-测试-海尔智家
- 114面经07-测开-蔚来
- 115面经09-测试-中望
- 116面经10-测开-ZEKU
- 117面经12-测试-科大讯飞
- 118面经15-测开-美团暑期实习
- 119面经16-测开-外企社招
- 120Nvidia四面
- 121面经2-前端-百度日常实习
- 122面经3-前端-得物面经
- 123面经4-前端-腾讯健康
- 124面经5-前端-字节面经
- 125面经6-前端-携程前端
- 126面经7-前端-顺丰
- 127面经9-前端-比特大陆日常实习
- 128面经10-前端-抖音
- 129面经11-前端-蔚来/百度/oppo
- 130百度提前批
- 131面经12-前端-知乎暑期实习
- 132知乎二面
- 133百度二面
- 134面经2-Android客户端-大疆
- 135二面
- 136面经3-客户端-字节暑期实习
- 137字节二面
- 138字节二面(深入项目,1h)
- 139面经5-客户端-字节
- 140面经6-客户端-字节
- 141算法
- 142面经3-NLP-科大讯法
- 143面经4-NLP-科大讯法
- 144面经7-游戏算法-莉莉丝
- 145面经10-算法
- 146面经11-算法-百度pnc暑期实习
- 147百度二面
- 148抖音一面
- 149嵌入式
- 150面经3-嵌入式-芯动科技
- 151面经4-嵌入式-韶音科技
- 152面经6-嵌入式-新华三