1. 程式人生 > >強引用,軟引用,弱引用,幻想引用有什麽區別

強引用,軟引用,弱引用,幻想引用有什麽區別

finally tails each cep 子類 pda remove 底層 update

一:分析引用主要是對垃圾回收,對象可達

二:強引用是判斷對象是否存活,軟引用是內存不足時,就回收,可以作為緩存。弱引用可以構建一種沒有強制約束關系的,也可以作為緩存。幻想引用就是對象被finalize之後做一些清理工作

三:技術分享圖片

四:所有的引用都是java.lang.ref.Refrence的子類,有get()方法。說明軟引用,弱引用都可以獲得對象,變成強引用。幻想引用的get都是null.

五:弱引用可能指向了強引用,垃圾回收不了,造成內存泄漏

六:Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>();
PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null;
System.gc();
try {
// Remove 是一個阻塞方法,可以指定 timeout,或者選擇一直阻塞
Reference<Object> ref = refQueue.remove(1000L);
if (ref != null) {
// do something
}
} catch (InterruptedException e) {
// Handle it
}
引用隊列的使用。

七:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC
打印引用數量
0.403: [GC (Allocation Failure) 0.871: [SoftReference, 0 refs, 0.0000393 secs]0.871: [WeakReference, 8 refs, 0.0000138 secs]0.871: [FinalReference, 4 refs, 0.0000094 secs]0.871: [PhantomReference, 0 refs, 0 refs, 0.0000085 secs]0.871: [JNI Weak Reference, 0.0000071 secs][PSYoungGen: 76272K->10720K(141824K)] 128286K->128422K(316928K), 0.4683919 secs] [Times: user=1.17 sys=0.03, real=0.47 secs]

八:通過底層api,達到強引用

class Resource {
private static ExternalResource[] externalResourceArray = ...
int myIndex; Resource(...) {
myIndex = ...
externalResourceArray[myIndex] = ...;
...
}
protected void finalize() {
externalResourceArray[myIndex] = null;
...
}
public void action() {
try {
// 需要被保護的代碼
int i = myIndex;
Resource.update(externalResourceArray[i]);
} finally {
// 調用 reachbilityFence,明確保障對象 strongly reachable
Reference.reachabilityFence(this);
}
}
private static void update(ExternalResource ext) {
ext.status = ...;
}
}

new Resource().action()

這裏resource 沒有被強引用,所以可以finalize,

static void reachabilityFence(Object ref)

強引用,軟引用,弱引用,幻想引用有什麽區別