广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java弱引用的理解与使用
  • 510
分享到

java弱引用的理解与使用

java教程java 2020-01-26 20:01:14 510人浏览 绘本
摘要

在Java里, 当一个对象被创建时, 它被放在内存堆里. 当GC运行的时候, 如果发现没有任何引用指向该对象, 该对象就会被回收以腾出内存空间。或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 (

在Java里, 当一个对象被创建时, 它被放在内存堆里. 当GC运行的时候, 如果发现没有任何引用指向该对象, 该对象就会被回收以腾出内存空间。

或者换句话说, 一个对象被回收, 必须满足两个条件:

1)没有任何引用指向它 (推荐学习:java课程)

2)GC被运行。

Java对于简单的情况, 手动置空是不需要程序员来做的, 因为在java中, 对于简单对象, 当调用它的方法执行完毕后, 指向它的引用会被GC回收,

实际中我们写代码,往往是通过把所有指向某个对象的referece置null实现,如:

Person p = new Person("张三",18,"男");//强引用
...
p=null;//不再使用的时候置null

很明显,手动置null对象对于程序员来说, 是一件繁琐且违背自动回收机制的。

Java对于简单的情况, 如方法中的产生的局部对象,是不需要程序员来手动置空, 当调用它的方法执行完毕后, 指向它的引用会被GC回收。

而复杂一点的情况,比如使用cache,因为cache的对象正是程序运行需要的,那么只要程序正在运行, cache中的引用就不会被GC,那么随着cache中的引用越来越多, GC无法回收的对象也越来越多,无法被自动回收,此时就必须有开发者来进行处理回收,显然也违背了java自动回收机制。

对此,java中引入了弱引用(WeakReference)。

当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。

WeakReference的语法:

WeakReference weakReference = new WeakReference(referent);

当要获得weak reference引用的对象时, 首先需要判断它是否已经被回收:

weakReference.get();

如果此方法为空, 那么说明weakReference指向的对象已经被回收了。

下面一个WeakReference的栗子:

Person类:

package com.yx.test.model;
 

public class Person {
    private String name;
    private int age;
    private String sex;
 
    public Person() {
    }
 
    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getSex() {
        return sex;
    }
 
    public void setSex(String sex) {
        this.sex = sex;
    }
}

测试类TestWeakReference:

package com.yx.test.reference;
 
import com.yx.test.model.Person;
 
import java.lang.ref.WeakReference;
 

public class TestWeakReference {
    public static void main(String[] args) {
        Person p = new Person("张三",18,"男");
        WeakReference weakPerson = new WeakReference(p);
        int i=0;
        while(true){
            if(weakPerson.get()!=null){
                i++;
                System.out.println("Object is alive for "+i+" loops - "+weakPerson);
            }else{
                System.out.println("Object has been collected.");
                break;
            }
        }
    }
}

运行结果:

p is alive for 1 loops - java.lang.ref.WeakReference@330bedb4
...
p is alive for 62331 loops - java.lang.ref.WeakReference@330bedb4
p is alive for 62332 loops - java.lang.ref.WeakReference@330bedb4
p has been collected.

可以看到,在while循环执行数万次后,p被回收了。

多次测试运行程序,发现p回收时循环执行的次数是不确定的,这个很容易理解:因为这是由GC运行的不确定性所确定的。

小结:

Java中当一个对象仅被一个弱引用引用时,如果GC运行, 那么这个对象就会被回收。

弱引用的一个特点是它何时被回收是不可确定的;

--结束END--

本文标题: java弱引用的理解与使用

本文链接: https://www.lsjlt.com/news/2677.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java弱引用的理解与使用
    在Java里, 当一个对象被创建时, 它被放在内存堆里. 当GC运行的时候, 如果发现没有任何引用指向该对象, 该对象就会被回收以腾出内存空间。或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 (...
    99+
    2020-01-26
    java教程 java
  • 十分钟理解Java中的弱引用
    本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:)1. What——什...
    99+
    2023-06-02
  • C 语言的弱符号与弱引用你了解吗
    目录C语言中的__attribute__((weak)) 与 attribute ((weakref())弱符号弱符号的作用与示例弱引用测试代码1:测试代码2:总...
    99+
    2022-11-13
  • Python中弱引用的神奇用法与原理详解
    目录背景典型用法工作原理实现细节总结背景 开始讨论弱引用( weakref )之前,我们先来看看什么是弱引用?它到底有什么作用? 假设我们有一个多线程程序,并发处...
    99+
    2022-11-10
  • 智能指针与弱引用详解
    在android 中可以广泛看到的template<typename T> class Sp 句柄类实际上是android 为实现垃圾回收机制的智能指针。智能指针是c++...
    99+
    2022-11-15
    智能指针 弱引用
  • 解析Android开发优化之:软引用与弱引用的应用
    如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用...
    99+
    2022-06-06
    android开发 优化 Android
  • Java中的弱引用有什么用
    这篇文章主要讲解了“Java中的弱引用有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的弱引用有什么用”吧!Java里一个对象obj被创建时,被放在堆里。当GC运行的时候,发...
    99+
    2023-06-15
  • java弱引用怎么结合队列使用
    小编给大家分享一下java弱引用怎么结合队列使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、...
    99+
    2023-06-14
  • java中ThreadLocalMap使用弱引用的原因有哪些
    小编给大家分享一下java中ThreadLocalMap使用弱引用的原因有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端...
    99+
    2023-06-14
  • Java中的强引用,软引用,弱引用,虚引用的作用介绍
    目录1.强引用( Strong Reference )2.软引用( Soft Reference )3.弱引用( Weak Reference )4.虚引用( PhantomRefe...
    99+
    2022-11-13
  • 对ThreadLocal内存泄漏及弱引用的理解
    ThreadLocal内存泄漏及弱引用 1.什么是内存泄漏?Entry的key弱引用与泄漏关系 在TreadLocal中内存泄漏是指TreadLocalMap中的Entry中的ke...
    99+
    2022-11-13
  • 关于C语言中弱符号与弱引用的实际应用问题
    最近在学习《程序员的自我修养——链接、装载与库》时,get到了一个新的知识点:弱符号与弱引用。书中简短的介绍,让我了解到弱符号的含义以及使用方式。了解我的朋友,应该知道我喜欢将知识...
    99+
    2022-11-12
  • Java中弱引用的概念和作用是什么
    本篇内容介绍了“Java中弱引用的概念和作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概览本文会通过对弱引用的定义讲起,然后通过案...
    99+
    2023-06-16
  • iOS中使用对象的弱引用示例代码
    简介 我们都知道使用 UIImage imageNamed 创建的 UIImage 对象会被持有(强引用),如果图片太大会占用内存,损耗 APP 的性能,影响用户体验,如果能改造对...
    99+
    2022-06-05
    ios 对象 弱引用
  • .Net中的弱引用字典WeakDictionary和ConditionalWeakTable怎么使用
    这篇文章主要介绍“.Net中的弱引用字典WeakDictionary和ConditionalWeakTable怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.Net中的弱引用字典WeakDi...
    99+
    2023-07-02
  • 如何理解JVM中Java对象的大小与引用类型
    本篇文章为大家展示了如何理解JVM中Java对象的大小与引用类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。小编总结了JVM概念中的Java对象的大小,以及三种引用类型的定义与区分。基本数据的类型...
    99+
    2023-06-17
  • 全面解析Java中的GC与幽灵引用
    Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中...
    99+
    2022-11-15
    Java GC
  • 详解Java异常处理的使用与思考
    目录概念异常处理自定义异常多重捕获重新抛出异常更好的 NPE清道夫:finally异常的约束try-with-resources异常类型匹配使用指南检查型异常是 shitGo 也没有...
    99+
    2023-05-15
    Java异常处理使用 Java异常处理 Java异常
  • 深入理解Java中包的定义与使用
    目录包是什么?包的作用导入包中的类自定义包包的访问权限控制包是什么? 在开发过程中,会定义很多类,随着类越写越多,难免会出现类重名而发生覆盖的情况,为了在使用它们的时候不让编译器混淆...
    99+
    2022-11-12
  • Java 关键字 volatile 的理解与正确使用
    概述Java语言中关键字 volatile 被称作轻量级的 synchronized,与synchronized相比,volatile编码相对简单且运行的时的开销较少,但能够正确合理的应用好 volatile 并不是那么的容易,因为它比使用...
    99+
    2023-05-31
    java volatile ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作