Skip to content

Commit 4035375

Browse files
committed
强软弱虚引用
1 parent 01c4030 commit 4035375

File tree

1 file changed

+51
-5
lines changed

1 file changed

+51
-5
lines changed

README-Jvm.md

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,61 @@ JVM规范,将内存分为 程序计数器、Java栈,也叫虚拟机栈、本
7979
- 句柄;稳定,对象移动时,只会改变句柄中的实例数据指针,引用本身不修改
8080
- 直接指针;快!比如hotspot 就是使用直接指针方式
8181

82+
### 对象存活 ###
8283

84+
如何确认一个对象是否可以回收?
8385

84-
### 对象存活 ###
86+
#### 引用计数算法 ####
87+
88+
- 基本思想
89+
90+
给对象设置一个引用计数器;每一个引用,计数器加一,失效时候,计数器减一;计数器等于零时候,表示可以回收
91+
92+
- 优点
93+
94+
实现简单;效率高
95+
96+
- 缺点
97+
98+
不能处理对象循环引用问题
99+
100+
#### 可达性分析算法 ####
101+
102+
- 基本思想
103+
104+
采用虚拟机栈、类引用对象、常量对象、本地方法引用对象作为根,从根节点向下搜索,判断跟节点到当前对象节点是否存在引用关系,不可达则认为不在引用,可以进行回收
105+
106+
- 优点
107+
108+
可以解决对象循环引用问题
109+
110+
- 缺点
111+
112+
实现难度较大些,效率低些
113+
114+
#### 对象引用方式 ####
115+
116+
引用强度依次为:强引用 > 软引用 > 弱引用 > 虚引用
117+
118+
jdk1.2之后,才开始出现了 软、弱、虚引用;
119+
120+
- 强引用
121+
122+
普遍存在,最常见的引用;只要引用还在,jvm就不会回收;比如 Person p = new Person();
123+
124+
- 软引用
125+
126+
描述非必须的对象引用关系,在内存溢出之前被回收;比如 SoftReference<Object> obj = new SoftReference<>(someObj);
127+
128+
- 弱引用
129+
130+
描述非必须的对象引用关系,在下一次垃圾回收时被回收;比如 WeakReference<Object> obj = new WeakReference<>(someObj);
131+
132+
- 虚引用
133+
134+
最弱的对象引用关系,在对象被垃圾回收时时收到一个通知;虚引用必须和引用队列 (ReferenceQueue)联合使用,当对象被垃圾回收器准备回收时,则会把这个虚引用加入到与之关联的引用队列中;比如 PhantomReference<Object> obj3 = new PhantomReference<>(someObj,someQueue);
85135

86-
- 引用计数算法
87-
对对象引用进行计数,引用则计数器 +1,引用失效 -1;计数为 0 时候认为不在引用,可以进行回收;不能处理对象循环引用问题
88136

89-
- 可达性分析算法
90-
主要采取此方式,采用虚拟机栈、类引用对象、常量对象、本地方法引用对象作为根,判断对象到根是否存在引用关系,不可达则认为不在引用,可以进行回收;
91137

92138
### GC回收算法 ###
93139

0 commit comments

Comments
 (0)