Java中的引用
java中的強引用
略就是普通的new物件
java中的軟引用
使用SoftReference建立一個軟引用物件,
當java的記憶體不足時,垃圾回收器會幹掉軟引用
軟引用非常適合快取使用
/**
* @version: JavaEE
* @description: java中的軟引用
* @author: Mr.xzx
* @create: 2020-11-03 18:16
* @version:1.0
**/
public class SoftReferenceTest {
public static void main(String[] args) {
SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);
System.out.println(m.get());
System.gc();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(m.get());
//再分配一個陣列,heap將裝不下,這時候系統會回收垃圾,先回收一次,如果不夠,會把軟引用幹掉
byte[] b = new byte[1024 * 1024 * 15];
System.out.println(m.get());
}
}
java中的弱引用
垃圾回收器看到弱引用就會幹掉弱引用
/**
* @version: JavaEE
* @description: java中的弱引用
* @author: Mr.xzx
* @create: 2020-11-03 18:43
* @version:1.0
**/
public class WeakReferenceTest {
public static void main(String[] args) {
WeakReference<M> m = new WeakReference<>(new M());
System.out.println(m.get());
System.gc();
System.out.println(m.get());
}
}
java中的虛引用
無論什麼時候都get()不到該物件的引用
一個虛引用物件,要被回收時,垃圾回收器,會將它扔進一個佇列(引用佇列)中,如果引用佇列中有該物件了,那麼直接將這個虛引用物件直接回收
虛引用最大的作用是管理直接記憶體(堆外記憶體),實現零拷貝
public class PhantomReferenceTest {
private static final List<Object> list = new LinkedList<>();
private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();
public static void main(String[] args) {
PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);
System.out.println(phantomReference.get());
}
}
java中軟引用的體現
ThreadLocal的講解
public class ThreadLocalTest {
static ThreadLocal<M> tl = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new M());
//tl.remove();如果tl不使用了,要呼叫remove方法,不然會存在記憶體洩漏(oom:記憶體溢位)
}).start();
}
}
threadLocal建立一個執行緒容器, 1號執行緒等待2秒,2號執行緒1秒就向容器中新增了一個M物件,但是1號執行緒2秒後依然無法get()到為null
所謂向ThreadLocal中set值,就是向當前執行緒Thread中的(父類成員變數)threadlocals的map中設定鍵值對,鍵是ThreadLocal本身,值是物件M();形成一個鍵值對Entry
這個鍵值對entry是繼承了WeakReference弱引用
面試會問:執行緒池慎用ThreadLocal, 當我拿出一個執行緒,在他的map中新增了一些ThreadLocal的鍵值對,使用結束後也沒有進行remove方法,那麼我下次在拿到這個執行緒時,當中還會存在之前遺留的老的值,會出現值錯亂等
相關文章
- java中的引用物件Java物件
- Java中的弱引用Java
- Java 中的方法引用Java
- Java/Android中的強引用、軟引用、弱引用、虛引用JavaAndroid
- Java中的四種引用方式(強引用、軟引用、弱引用、虛引用)Java
- 理解Java中的弱引用Java
- Java常見知識點彙總(⑲)——Java中的強引用、弱引用、軟引用、虛引用Java
- Java中的引用與ThreadLocalJavathread
- Java中的弱引用詳解Java
- Java中的方法引用詳解Java
- java中的引用與c中的指標Java指標
- 讀書筆記-----Java中的引用筆記Java
- Java中的四種引用型別Java型別
- Java的強引用、軟引用、弱引用、虛引用Java
- Java中的四大引用筆記Java筆記
- JAVA中的指標,引用及物件的cloneJava指標物件
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- java的強引用、軟引用、弱引用、幻象引用,引用佇列總結Java佇列
- 十分鐘理解Java中的弱引用Java
- Java中的引用型別和使用場景Java型別
- Java中的值傳遞和引用傳遞Java
- 如何有效的避免OOM,溫故Java中的引用OOMJava
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- Java四種引用包括強引用,軟引用,弱引用,虛引用。Java
- Java的四種引用Java
- Java四大引用詳解:強引用、軟引用、弱引用、虛引用Java
- java陣列元素的引用Java陣列
- JDK解構 - Java中的引用和動態代理的實現JDKJava
- java中多型的理解——父類引用指向子類物件Java多型物件
- java的引用:用C++/C的引用和指標去理解JavaC++指標
- Java 四種引用的解讀Java
- Java中的基本資料型別與引用資料型別Java資料型別
- java方法中只有值傳遞,沒有引用傳遞Java
- Java中容器Vectort用add新增物件是物件引用的問題Java物件
- 美團一面:說一說Java中的四種引用型別?Java型別
- Java8——方法引用Java
- java正則反向引用Java
- Java弱引用與WeakHashMapJavaHashMap