上一篇 <<<JVM中對象如何完成空間分配和初始化工作
下一篇 >>>JVM元空間(方法區(qū))和棧內存溢出原因及解決方案
強引用
Object o = new Object(); 被引用關聯(lián)的對象永遠不會被垃圾收集器回收榜跌。
QuoteEntity user1 = new QuoteEntity("jarye");
QuoteEntity user2 = user1;
user1 = null;
System.out.println(user2);
System.gc();
System.out.println(user2);
---------------------------------------------------------------
打印結果:
com.jarye.quote.entity.QuoteEntity@2f410acf
com.jarye.quote.entity.QuoteEntity@2f410acf
軟引用
SoftReference 軟引用關聯(lián)的對象触机,只有當系統(tǒng)內存溢出時,才會回收軟引用的對象坡贺。(用來做緩存)
ArrayList<SoftReference<byte[]>> objects = new ArrayList<>();
for (int i = 0; i < 10; i++) {
SoftReference<byte[]> softReference = new SoftReference<>(new byte[4 * 1024 * 1024]);
System.out.println("======="+softReference.get());
objects.add(softReference);
}
System.out.println("打印結果:");
objects.forEach((t) -> {
System.out.println("-------------"+t.get());
});
參數設置:-Xmx8m -XX:+PrintGCDetails -verbose:gc
響應結果:
=======[B@768debd
=======[B@490d6c15
=======[B@7d4793a8
=======[B@449b2d27
=======[B@5479e3f
=======[B@27082746
=======[B@66133adc
=======[B@7bfcd12c
=======[B@42f30e0a
=======[B@24273305
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------[B@24273305
tips:虛擬機設置了8M小染,由于其他也占用空間翘瓮,所以最后只存了一個
弱引用
WearkReference 只能存在于下一次gc之前:發(fā)生minorgc majorgc就會被回收
QuoteEntity user1 = new QuoteEntity("jarye");
WeakReference<QuoteEntity> weakReference = new WeakReference<QuoteEntity>(user1);
user1 = null;
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());
---------------------------------------------------------------
打印結果:
com.jarye.quote.entity.QuoteEntity@2f410acf
null
虛引用
Object o = new Object();
O=null; 提醒我們的gc來回收這個對象
tips:基本上沒用,必須要PhantomReference修飾裤翩,結果隨時可能為空
QuoteEntity user1 = new QuoteEntity("jarye");
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();
PhantomReference<QuoteEntity> phantomReference = new PhantomReference<QuoteEntity>(user1, referenceQueue);
System.out.println(phantomReference.get());
---------------------------------------------------------------
null
tips:軟弱虛對應引用的指針放入到引用隊列中资盅,實現(xiàn)清理。
相關文章鏈接:
<<<Java基礎-反射機制
<<<Java基礎-字節(jié)碼技術
<<<Java基礎-創(chuàng)建對象的方式匯總
<<<Java基礎-對象布局
<<<Class文件分析一個類為啥最多支持65535個接口
<<<為什么重寫equals還要重寫hashcode方法
<<<如何自定義注解
<<<十大經典排序算法匯總-動畫演示
<<<JDK8十大新特性