Java的强弱引用的知识点和基本的code证明(1)

关于应用分类表格如下:

 代码展示:包含了强,软,弱,虚各部分的代码展示:

具体使用场景:对应的类源码都有介绍哈,可以尝试阅读并且结合自己的理解去写一些demo出来!
* Soft reference objects, which are cleared at the discretion of the garbage
* collector in response to memory demand.  Soft references are most often used
* to implement memory-sensitive caches.

垃圾回收的代码打印 vm option 配置:

-XX:+PrintGCDetails -Xmx10m  -Xms10m


package com.special.leetcode.reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;

/**
 * 模拟ThreadLocal为什么在gc是Entry<ThreadLocal,Object>中的key为何没有别回收呢?
 */
public class ReferenceTest {
    public static void main(String[] args) {
//         统一的进行对应的方法的调用
//        ReferenceTest.weakdemo();
//        ReferenceTest.softdemo1();
        ReferenceTest.phanDemo();

    }

    /**
     * 强引用很简单就像我们最新的这个案例进行就可以
     */
    public static void strongdemo() {
        final byte[] bytes = new byte[1024 * 1024];
    }



    /**
     * 软引用  内存不足的时候会回收
     * 类的原理:
     */
    public static void softdemo() {
        final SoftReference<String> hello_soft_test = new SoftReference<>(new String("hello soft test"));
        System.out.println(" before  gc " + hello_soft_test.get());
        System.gc();
        System.out.println("aftre gc " + hello_soft_test.get());
    }

    /**
     * 软引用2  内存不足的时候会回收
     * 类的原理:
     */
    public static void softdemo1() {
        final SoftReference<Byte[]> hello_soft_test = new SoftReference<>(new Byte[1024 * 1024]);
        System.out.println(" before  gc " + hello_soft_test.get());
        int i = 0;
        ArrayList<Byte[]> softdemo = new ArrayList<>();
        while (true) {
            Byte[] bytes = new Byte[1024 * 1024];
            softdemo.add(bytes);
            System.out.println(++i + "  allow memory -> " + hello_soft_test.get());
        }
    }
    /*
       弱引用 注意threadlocal类用到了这个,但是提示使用的
        */
    public static void weakdemo() {
        TTOO t = new TTOO();
        WeakReference<TTOO> weakReference = new WeakReference<TTOO>(t);
        System.out.println(" t = null before----");
        System.out.println("refenrence 已经被回收了么!" + weakReference.get() == null);
        t = null;
        System.out.println("gc  before ---之前");
        System.gc();

        if (weakReference.get() == null) {
            System.out.println("weakReference已经被GC回收");
        } else {
            System.out.println(weakReference.get());
        }

        while (true) {
        }
    }
    /**
     * 虚引用对象
     * queue gc之后放入到对应的对象中,
     * 都说用来通知,等,那finally是用来干嘛的
     * 有说:Java 团队进行对象回收的的跟踪的
     */
    public static void phanDemo() {
        final ReferenceQueue<Object> queue = new ReferenceQueue<>();
        final PhantomReference<person> liuyucaho = new PhantomReference<>(new person("liuyucaho", 12), queue);
        System.out.println(" reference before " + liuyucaho.get());
        System.out.println(" reference before " + queue.poll());
        System.gc();
        System.out.println(" reference after " + liuyucaho.get());
        // 可以看到回收之后放到了对应的队列中
        System.out.println(" reference after " + queue.poll());
    }
}

class TTOO {

}

class person {
    private String name;
    private int age;

    public person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

参考的B站视频:

强弱应用Java

https://docs.oracle.com/en/java/javase/16/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

specialApe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值