File tree Expand file tree Collapse file tree 1 file changed +51
-5
lines changed Expand file tree Collapse file tree 1 file changed +51
-5
lines changed Original file line number Diff line number Diff line change @@ -79,15 +79,61 @@ JVM规范,将内存分为 程序计数器、Java栈,也叫虚拟机栈、本
79
79
- 句柄;稳定,对象移动时,只会改变句柄中的实例数据指针,引用本身不修改
80
80
- 直接指针;快!比如hotspot 就是使用直接指针方式
81
81
82
+ ### 对象存活 ###
82
83
84
+ 如何确认一个对象是否可以回收?
83
85
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);
85
135
86
- - 引用计数算法
87
- 对对象引用进行计数,引用则计数器 +1,引用失效 -1;计数为 0 时候认为不在引用,可以进行回收;不能处理对象循环引用问题
88
136
89
- - 可达性分析算法
90
- 主要采取此方式,采用虚拟机栈、类引用对象、常量对象、本地方法引用对象作为根,判断对象到根是否存在引用关系,不可达则认为不在引用,可以进行回收;
91
137
92
138
### GC回收算法 ###
93
139
You can’t perform that action at this time.
0 commit comments