Skip to content

Commit 52ad540

Browse files
authored
Merge pull request #2783 from 121132/fix-issue-2782
fix: issue2782
2 parents fcaf92b + 2614dd0 commit 52ad540

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

docs/java/jvm/jvm-garbage-collection.md

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -277,12 +277,16 @@ String strongReference = new String("abc");
277277
如果一个对象只具有软引用,那就类似于**可有可无的生活用品**。软引用代码如下
278278
279279
```java
280-
// 软引用
280+
// --- 示例1 ---
281281
String str = new String("abc");
282-
SoftReference<String> softReference = new SoftReference<String>(str);
282+
SoftReference<String> softReference1 = new SoftReference<>(str);
283+
str = null; // 去掉强引用
284+
285+
// --- 示例2 ---
286+
SoftReference<String> softReference2 = new SoftReference<>(new String("def")); // 匿名对象
283287
```
284288
285-
如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
289+
软引用对象在内存压力较大时可能会被回收,但JVM不保证只在内存不足时才清理。唯一强保证是:在抛出 OutOfMemoryError 之前,所有仅被软引用可达的对象一定会被清理。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
286290
287291
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。
288292
@@ -291,11 +295,16 @@ SoftReference<String> softReference = new SoftReference<String>(str);
291295
如果一个对象只具有弱引用,那就类似于**可有可无的生活用品**。弱引用代码如下:
292296
293297
```java
298+
// --- 示例1 ---
294299
String str = new String("abc");
295-
WeakReference<String> weakReference = new WeakReference<>(str);
296-
str = null; //str变成软引用,可以被收集
300+
WeakReference<String> weakReference1 = new WeakReference<>(str);
301+
str = null; //去除强引用
302+
303+
// --- 示例2 ---
304+
WeakReference<String> weakReference2 = new WeakReference<>(new String("abc")); // 匿名对象
297305
```
298306
307+
299308
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
300309
301310
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。
@@ -305,10 +314,15 @@ str = null; //str变成软引用,可以被收集
305314
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用代码如下:
306315
307316
```java
317+
// --- 示例1 ---
308318
String str = new String("abc");
309319
ReferenceQueue queue = new ReferenceQueue();
310320
// 创建虚引用,要求必须与一个引用队列关联
311-
PhantomReference pr = new PhantomReference(str, queue);
321+
PhantomReference phantomReference1 = new PhantomReference(str, queue);
322+
str = null; // 去除强引用
323+
324+
// --- 示例2 ---
325+
PhantomReference phantomReference2 = new PhantomReference(new String("abc"), queue); // 匿名对象
312326
```
313327
314328
**虚引用主要用来跟踪对象被垃圾回收的活动**

0 commit comments

Comments
 (0)