Java若_【JAVA基础】JAVA四种引用(强软若虚)
java中有四種引用類型,分別是
強引用
強引用也就是我們通常認為的java中的中的引用關系
通過new創建一個對象,然后賦值給一個變量,這個時候這個變量指向堆中地址的引用就是一個強引用
他收到JVM的管理,當JVM發生GC的時候,如果有強引用指向了空的話,那么這個時候GC就會對這類對象進行進行回收
軟引用
-Xmx10m // 配置最大堆內存為10MB
import java.lang.ref.SoftReference;
public class MyReference {
public static void main(String[] args) throws InterruptedException {
// int占用4個字節,創建一個5MB大小的數組
SoftReference softReference = new SoftReference(new int[5 * 1024 * 1024 / 4]);
System.out.println(softReference.get());
System.gc();
Thread.sleep(2000);
System.out.println(softReference.get());
SoftReference softReference1 = new SoftReference(new int[1024 * 1024 / 4]);
System.out.println(softReference.get());
System.out.println(softReference1.get());
}
}
軟引用通過SoftReference來指向
GC是不直接回收弱引用的,只有等堆內存不夠了,才會回收前面分配的這些對象
軟引用用的不多
弱引用
import java.lang.ref.WeakReference;
public class MyReference {
public static void main(String[] args) {
WeakReference weakReference = new WeakReference(new Object());
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());
}
}
弱引用的話會如果發生GC的話會直接斷開
ThreadLocal里面就是用到了弱引用,是這樣用的
ThreadLocal用來保存線程獨有的信息,可以get/set一個值,這個值是一個泛型,可以自己指定
ThreadLocal不是所有線程共享一個變量,里面是一個map,key是Thread,value是值,而是每個線程有自己的ThreadLocalMap,map里面存的是
Thread里面有一個ThreadLocal.ThreadLocalMap變量,之所以這樣是好維護
ThreadLocalMap里面是一個個Entry,Entry的key是ThreadLocal,而且是一個弱引用,在每次GC的時候如果就會GC(如果沒有強引用的時候)
但是依然會有內存泄漏的問題,key對應的ThreadLocal可能GC了,但是Entry不會GC,不過JDK開發人員早考慮到了,在get和set方法的時候會判斷key為null的情況,如果是的話把entry就設置為null,方便下次回收。不過這個存在的問題就是如果不執行的話那么就會一直存在,依賴于用戶
虛引用
public static void main(String[] args) {
ReferenceQueue queue = new ReferenceQueue<>();
PhantomReference phantomReference = new PhantomReference(new Object(),queue);
System.gc();
System.out.println(phantomReference.get());
System.out.println(queue.poll());
}
虛引用的通過get方法是獲取不到的,主要用來在對象回收以后獲得通知的。
虛引用會用在直接內存中使用,直接內存為了減少內存拷貝的問題,不管網絡中的數據還是數據庫或者磁盤中的數據,都要先讀到內存再進入jvm內存,jvm才可以操作。在netty或jdk中DirectByteBuffer都使用到了,但是問題是直接內存不屬于JVM運行時內存,GC算法不會直接處理,其實就是通過DirectByteBuffer虛引用指向了堆外內存,等堆內引用消失以后會通過JNI之類方法回收掉堆外內存
總結
以上是生活随笔為你收集整理的Java若_【JAVA基础】JAVA四种引用(强软若虚)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java钱包_钱包行云java
- 下一篇: 第八代i5和i7的区别有多大(13700