Java四种引用方式
当内存不足时,JVM开始垃圾回收,对于强引用对象,就是出现了OOM也不会对该对象进行回收
Object obj1 = new Object(); // 这样定义的默认就是强引用
Object obj2 = obj1; // obj2引用赋值
System.out.println(obj2); // 正常输出
软引用是一种相对强引用弱化了一些的引用,需要调用 java.lang.ref.SoftReference类来实现,可以让 对象豁免一些垃圾收集
对于只有软引用的对象来说: 当系统内存充足时它不会被回收,当系统内存不足时它会被回收。
public class SoftReferenceDemo {
public static void softRef_Memory_Enough(){
SoftReference<Object> softReference = new SoftReference<>(o1);
System.out.println(softReference.get());
System.out.println(softReference.get());
-Xms5m -Xmx5m -XX:+PrintGCDetails
public static void softRef_Memory_NotEnough(){
SoftReference<Object> softReference = new SoftReference<>(o1);
System.out.println(softReference.get());
byte[] bytes = new byte[30*1024*1024];
System.out.println(softReference.get());
public static void main(String[] args) {
弱引用需要用 java.lang.ref.WeakReference 类来实现,它比软引用的生存周期更短,对于只有弱引用的 对象来说,只要垃圾回收机制一运行,不管 JVM 的内容空间是否足够,都会回收该对象占用的内存;
public static void main(String[] args) {
WeakReference<Object> weakReference = new WeakReference<>(o1);
System.out.println(weakReference.get());
System.out.println(weakReference.get());
虚引用需要使用 java.lang.PhantomReference 类来实现。
顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它 不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。
public static void main(String[] args) throws InterruptedException {
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>
System.out.println(o1); // java.lang.Object@1b6d3586
System.out.println(phantomReference.get()); // null
System.out.println(referenceQueue.poll()); // null
System.out.println("===================");
System.out.println(o1); // null
System.out.println(phantomReference.get()); // null
System.out.println(referenceQueue.poll()); // java.lang.Object@1b6d3586