Java 四大引用类型

这篇具有很好参考价值的文章主要介绍了Java 四大引用类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GC 回收的优先级上: 强引用 -> 软引用 -> 弱引用 -> 虚引用

1.强引用

当内存不足,JVM开始进行 gc 时,对于强引用的对象不会进行回收,即使出现了OOM也不会回收。因此,强引用是造成内存泄露的主要原因。

class MyObject {
    @Override
    protected void finalize() throws Throwable{
        //finalize 通常目的是在某个对象内存被gc之前执行的操作
        System.out.println("------------invoke finalize method~~~");
    }
}
public class ReferenceDemo{
    public static void main(String[] args) throws InterruptedException{
        // 1. 强引用 --- 一定不会被 GC直至抛出OOM
        MyObject myObject = new MyObject();
        System.out.println("-----gc before\t" + myObject);
        System.gc();
        System.out.println("-----gc after\t " + myObject);
    }
}
// -----gc before	ThreadLocal.MyObject@6aaa5eb0
// -----gc after    ThreadLocal.MyObject@6aaa5eb0

2.软引用

当进行GC时,如果内存还足够,则不进行回收该对象,若内存不够,则回收该软引用对象内存空间

class MyObject {
    @Override
    protected void finalize() throws Throwable{
        //finalize 通常目的是在某个对象内存被gc之前执行的操作
        System.out.println("------------invoke finalize method~~~");
    }
}

public class ReferenceDemo{

    public static void main(String[] args) throws InterruptedException {
        //2. 软引用 --- 内存够用: 不会被GC  ||  内存不够用: 会被GC
        SoftReference<MyObject> reference = new SoftReference<>(new MyObject());
        // 通过 get() 方法返回真实对象
        System.out.println("-----gc before: "+reference .get());
        System.gc();
        Thread.sleep(100);
        System.out.println("-----gc after: " + reference .get());
    }
}
//-----gc before: ThreadLocal.MyObject@6aaa5eb0
//-----gc after: ThreadLocal.MyObject@6aaa5eb0

3. 弱引用

JVM 开始 gc 时,无论内存是否还足够,对于弱引用对象的内存空间都要进行回收

class MyObject {
    @Override
    protected void finalize() throws Throwable{
        //finalize 通常目的是在某个对象内存被gc之前执行的操作
        System.out.println("------------invoke finalize method~~~");
    }
}
public class ReferenceDemo{
    public static void main(String[] args) throws InterruptedException{
        //3. 弱引用 --- 只要JVM 一开始GC, 不管内存是否足够, 该内存区域都会被回收
        WeakReference<MyObject> weakReference = new WeakReference<>(new MyObject());
        System.out.println("内存够用,before gc: "+weakReference.get());
        System.gc();
        System.out.println("内存够用,after gc: "+weakReference.get());
    }
}
// 内存够用,before gc: ThreadLocal.MyObject@3498ed
// ------------invoke finalize method~~~
// 内存够用,after gc: null

4.虚引用

虚引用必须与 ReferenceQueue 一起使用,当 gc 准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的 ReferenceQueue文章来源地址https://www.toymoban.com/news/detail-506081.html

class MyObject {
    @Override
    protected void finalize() throws Throwable{
        //finalize 通常目的是在某个对象内存被gc之前执行的操作
        System.out.println("------------invoke finalize method~~~");
    }
}
public class ReferenceDemo{
    public static void main(String[] args) throws InterruptedException{
        // 4. 虚引用: 必须要和引用队列一起使用, get()方法永远返回null
        PhantomReference<MyObject> reference = new PhantomReference<>(new                 MyObject(),new ReferenceQueue<>());
        //  无法返回引用对象
        System.out.println(reference .get());
        // 当被回收后, 该对象会进入引用队列 ReferenceQueue
        System.gc();
        Thread.sleep(200);
        if(reference .enqueue()){
            System.out.println("----------有虚对象被回收");
        }
    }
}
// null
// ------------invoke finalize method~~~
// ----------有虚对象被回收

到了这里,关于Java 四大引用类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【堆的认识及其优先级队列】java代码实现,保姆级教程学习堆和优先级队列

    前言: 大家好,我是 良辰 丫💞💞⛽,我们又见面了,前面我们讲了用链表实现的二叉树,今天我们来接触 堆 的概念,堆是一种特殊的二叉树,只不过咱们的对底层原理是数组,堆也是我们在做题中经常见到的,那么,接下来我们就慢慢的去接触堆, 认识堆,理解堆,掌

    2024年02月02日
    浏览(39)
  • Java 运算符优先级

    在 Java 中,每个运算符都有一个优先级,优先级高的运算符会先执行,而优先级低的运算符会后执行。如果有多个运算符在同一个表达式中出现,那么需要按照运算符优先级的规则确定它们的执行顺序。 Java 运算符的优先级如下所示(从高到低): 后缀运算符:++、– 一元运

    2024年02月07日
    浏览(39)
  • 【Java】PriorityQueue--优先级队列

    目录  一、优先级队列  (1)概念 二、优先级队列的模拟实现 (1)堆的概念  (2)堆的存储方式   (3)堆的创建 堆向下调整 (4)堆的插入与删除 堆的插入  堆的删除 三、常用接口介绍 1、PriorityQueue的特性 2、PriorityQueue常用接口介绍   (1)优先级队列的构造 (2)插入

    2024年02月11日
    浏览(34)
  • java 堆(优先级队列)详解

    如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki = K2i+1 且 Ki= K2i+2 (Ki = K2i+1 且 Ki = K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小

    2024年02月08日
    浏览(34)
  • Java语言中运算符号优先级

    算术运算符:+,-,*,/,%,++,-- 赋值运算符:= 扩展后的赋值运算符:+=,-=,*=,/=,%=,=,|=,^=,=,=,= 关系比较运算符:,=,,=,== 逻辑运算符:,,||,|,!,^ 位运算符:,|,~,^,,, 其他运算符(三目运算符):? : (1)+(加法) int a = 3; int b = 2; in sum =

    2024年02月04日
    浏览(33)
  • Java 中的优先级队列详细介绍

    当应该根据优先级处理对象时,将使用 PriorityQueu 。 众所周知 Queue 是 遵循先进先出算法 的,但是有时候需要 按照优先级来处理队列中的元素 ,这时候 PriorityQueue 就派上用场了。 PriorityQueue 基于 优先级堆 。 优先级队列的元素 根据自然顺序排序 ,或者由 队列构造时提供的

    2024年02月14日
    浏览(39)
  • Java 数据结构篇-用数组、堆实现优先级队列

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍    文章目录         1.0 优先级队列说明         2.0 用数组实现优先级队列         3.0 无序数组实现优先级队列         3.1 无序数组实现优先级队列 - 入队列 offer(E value)         3.2 无序数组实现优先

    2024年02月04日
    浏览(37)
  • Java【优先级队列】详细图解 / 模拟实现 + 【PriorityQueue】常用方法介绍

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月07日
    浏览(37)
  • 华为OD机试 - 支持优先级的队列(Java & JS & Python)

    题目描述 实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。 如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。 队列存储的数据内容是一个整数。 输入描述 一组待存入队列的数据 (包含内容和优先级) 输出描述 队列的数据内容(优先级

    2024年02月13日
    浏览(38)
  • 【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义 (二)如何进行整型提升呢? 二、算数转换 三、操作符的属性 (一)操作符优先级汇

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包