强、软、弱、虚引用

简介: 强、软、弱、虚引用

强引用


当内存不足时,JVM开始垃圾回收,对于强引用的对象,就算是OOM也不会回收。

95%中都是强引用,如下所示


Object obj=new Object();


软引用


   软引用是一种相对强引用弱化了一些的引用,需要用java.lang.ref.SoftReference类来实现。


   当系统内存充足时,他不会被回收;当系统内存不足时,他会回收。


当内存充足时,他不会被回收


public static void main(String[] args) {
    // 强引用
    Object obj = new String("hello");
    // 软引用
    SoftReference softReference = new SoftReference(obj);
    obj = null;
    System.gc();
    System.out.println(obj); // null
    System.out.println(softReference.get()); // hello
  }


当内存不时,他会被回收


// -Xmx5m -Xms5m
  public static void main(String[] args) {
    // 强引用
    Object obj = new String("hello");
    // 软引用
    SoftReference softReference = new SoftReference(obj);
    obj = null;
    try {
      byte[] data = new byte[5 * 1024 * 1024];
    } catch (Exception e) {
    } finally {
      System.out.println(obj); // null
      System.out.println(softReference.get()); // null
    }
  }


弱引用


对于弱引用的对象来说,只要GC,不管JVM的内存空间是否足够,都会回收该对象占用的内存


public static void main(String[] args) {
    // 强引用
    Object obj = new String("hello");
    // 弱引用
    WeakReference weakReference = new WeakReference(obj);
    obj = null;
    System.gc();
    System.out.println(weakReference.get());
  }


WeakHashMap


public static void main(String[] args) {
    Map map=new WeakHashMap();
    Integer key= new Integer(1);
    String value = "hashMap";
    map.put(key, value);
    key=null;
    System.gc();
    System.out.println(map);//{}
  }


只所以一GC,WeakHashmap中的数据就会清空,因为


WeakHashmap.中的Entry是
Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>


虚引用


虚引用的作用主要跟踪对象垃圾回收的状态。

其中DirectBuffer的释放就是虚引用的使用场景。


ByteBuffer buffer = ByteBuffer.allocateDirect(16);
目录
相关文章
|
2月前
|
存储 JavaScript 前端开发
什么是循环引用现象呢
【10月更文挑战第13天】什么是循环引用现象呢
31 0
|
5月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
140 8
|
6月前
|
存储 Swift
Swift开发——弱占用
Swift的自动引用计数(ARC)管理类实例内存,通过强引用保持实例存活。当出现强引用循环时,可使用`weak`关键字创建弱引用,避免阻止实例释放。弱引用在不再被强引用时导致对象立即释放。示例中,添加`weak`至`author`和`book`变量防止引用循环,使得两者析构器均执行,释放内存。图2展示了弱引用结构,当解除所有强引用后,ARC自动释放实例,调用析构器。
212 1
Swift开发——弱占用
|
6月前
|
Java 程序员
理解强引用:在编程中的作用和风险
理解强引用:在编程中的作用和风险
56 0
|
7月前
|
缓存 Java
Java中四种引用类型(强、软、弱、虚)
Java中四种引用类型(强、软、弱、虚)
|
7月前
|
存储 Java C++
Java内存管理的内存区域分为哪几部分?
Java内存管理的内存区域分为哪几部分?
61 1
|
安全 Java 编译器
【逃逸分析、锁消除、栈上分配】
【逃逸分析、锁消除、栈上分配】
|
Java
强、软、弱、虚,你是哪一种?
强、软、弱、虚,你是哪一种?
66 0
|
缓存 安全 Java
ThreadLocal之强、弱、软、虚引用(上)
ThreadLocal之强、弱、软、虚引用
ThreadLocal之强、弱、软、虚引用(上)
|
存储 监控 安全
ThreadLocal之强、弱、软、虚引用(下)
ThreadLocal之强、弱、软、虚引用
ThreadLocal之强、弱、软、虚引用(下)