java 强引用,软引用,弱引用,虚引用

Java:强引用、软引用、弱引用与虚引用 1、Java四种引用级别强引用、软引用、弱引用和虚引用。(由高到低)当垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收。引用类型被垃圾回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时终止软引用当内存不足时对象缓存内存不足(OOM)时终止弱引用正常垃圾回收时对象缓存垃圾回收(GC)后终止虚引用任何时候都可能跟踪对象的垃圾回收(因为有通知)https。...... 阅读详情

java 强引用,软引用,弱引用,虚引用

Java从JDK1.2版本开始,把对象的引用分为四种级别

强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)

StrongReference :

使用的大部分引用实际上都是强引用, 当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,也不会靠随意回收具有强引用的对象.
like

String a = new String(“a”);

引用内容“a” 存放于堆中,变量 a 是“a”的强引用,存放于栈中

SoftReference:

如果一个对象只具有软引用,垃圾回收器进行回收时,如果内存空间不足则回收,如果内存空间充足则不回收。可配合ReferenctQueue使用,当对象被回收后“软引用”会被加入到ReferenceQueue中。

WeakReference:

如果一个对象只具有弱引用,垃圾回收器进行回收时,只要发现就回收。不管内存是否充足。可配合ReferenctQueue使用,当对象被回收后“弱引用”会被加入到ReferenceQueue中。

PhantomReference:

虚引用对象随时可能被回收,虚引用必须配合ReferenctQueue使用,当对象被回收前“虚引用”会被加入到ReferenceQueue中。

import java.lang.ref.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * Created by lixiaoqing
 */
public class ReferenceTest {

    public static void main(String[] args) {

        softReferenceTest();

        weakReferenceTest();

        phantomReferenceTest();
    }


    private static void softReferenceTest(){

        System.out.println("SoftReferenceTest : \n");
        String string = new String ("String Object");

        SoftReference<String> stringSoftReference = new SoftReference<String>(string);

        string = null;

        System.out.println(stringSoftReference.get());

        // 缺少内存占满条件,所以...
        System.gc();

        System.out.println(stringSoftReference.get());

        System.out.println("\n------------------------------------------------------");
    }


    private static void weakReferenceTest(){

        System.out.println("WeakReferenceTest : \n");

        String string = new String("String Object");

        ReferenceQueue referenceQueue = new ReferenceQueue();

        WeakReference<String> stringWeakReference = new WeakReference<String>(string, referenceQueue);

        string = null;

        System.out.println("stringWeakReference get : " + stringWeakReference.get());

        System.out.println("referenceQueue poll : " + referenceQueue.poll());

        System.gc();

        System.out.println("stringWeakReference get : " + stringWeakReference.get());

        System.out.println("referenceQueue poll : " + referenceQueue.poll());
        System.out.println("referenceQueue poll : " + referenceQueue.poll());

        System.out.println("\n------------------------------------------------------");

    }

    static ReferenceQueue referenceQueue = new ReferenceQueue();
    static Map<Reference, Integer> phantomMap = new HashMap<>();


    private static void phantomReferenceTest(){

        System.out.println("PhantomReferenceTest : \n");
        Object object = new Object();

        System.out.println(object.hashCode() +" 创建成功");
        PhantomReference<Object> phantomReference = new PhantomReference<Object>(object, referenceQueue);

        phantomMap.put(phantomReference, object.hashCode());

        new Thread(runnable).start();

        object = null;

        System.gc();

    }

    // 独立线程进行监听弱可及对象回收
    static Runnable runnable = new Runnable() {
        @Override
        public void run() {

            Reference reference;
            while((reference = referenceQueue.poll()) == null){

                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

            int objectHashCode = phantomMap.get(reference);

            System.out.print(objectHashCode +" 被回收了");


        }
    };
    private static void waitTime(long time){

        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

控制台
SoftReferenceTest :

String Object
String Object


WeakReferenceTest :

stringWeakReference get : String Object
referenceQueue poll : null
stringWeakReference get : null
referenceQueue poll : java.lang.ref.WeakReference@3cd1a2f1
referenceQueue poll : null


PhantomReferenceTest :

789451787 创建成功
789451787 被回收了

固定翼飞行器建模(二)——MATLAB/Simulink建模、配平及线性化 MATLAB/Simulink固定翼建模、配平及线性化。 阅读详情

相关推荐

【达梦8】多实例监视集群的部署测试

确认监视器具有状态确认和自动接管两个功能。在数据守护系统的故障自动切换模式下,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。DM 提供了两种确认监视器的配置形式,分别为单实例和多实例。但是当单实例确认监视器故障时,无法继续进行集群的故障自动接管和备库故障确认,影响正常使用,故提供了多实例确认监控器来进一步提高集群的高可用性。在多实例确认监视器中,只有一个实例作为确认监视器提供服务,其它实例作为备库存在而不提供服务。

weixin_45335507的博客 1675

Android GreenDao3.2.2版本初试

1:配置 1)proect Gradle file: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcent

SkunkLuck 703

PHP项目实战:易宝支付SDK对接全流程(含回调处理与常见问题排查)

本文详细介绍了PHP项目中易宝支付SDK的对接全流程,包括环境准备、SDK配置、支付请求构建与发起、回调处理实战以及常见问题排查。特别针对回调处理环节的常见问题提供了解决方案,帮助开发者快速完成支付对接并优化性能。

weixin_29007809的博客 388

GreenDao升级

  原有数据库基础上   1创建   MigrationHelper 类   import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.No...

花开了,只是幻影 378

LabVIEW多界面应用开发:从启动器到主界面的切换架构与实现

在图形化编程领域,模块化与界面管理是构建复杂应用程序的核心。其原理在于通过清晰的程序架构,实现不同功能模块间的独立运行与协同工作,从而提升代码的可维护性和可扩展性。这种架构的技术价值在于能够有效管理应用程序的生命周期与资源,避免内存泄漏,并确保流畅的用户体验。在测控系统、自动化测试等工程实践中,常需实现如启动界面选择语言或模式后,无缝切换至主功能界面的场景。本文聚焦于LabVIEW环境,深入探讨如何利用动态调用、状态机等机制,并结合功能全局变量(FGV)与队列消息处理器(QMH)等热词技术,构建健壮的多界面

weixin_30802819的博客 263

【AI编程】用AI开发STM32软件(1):环境配置+AI编写LED闪烁

现在AI编程这么火,不拿来开发嵌软也太可惜了。笔者最近刚好有个2学分的实践课,要自己做项目,这不,机会就来了。笔者特意记录下来其过程,以供大家学习和参考。使用:VSCode+Copilot+EIDE+STM32CubeMX,单片机用最经典的stm32f103c8t6+STLink。

qq_23220445的博客 4573

WeakReference引起的java.lang.NullPointerException

P    [2018-01-15 16:21:41.342+0800]        onTrimMemory: 80 E    [2018-01-15 16:27:56.842+0800]    [com.example.core.exception.crash.CrashHandler]    [2018-01-15 16:27:56.838+0800]--------------Attem...

android开发笔记 2406

【Cadence】 ADS Dynamic Link使用教程

在Cadence617上使用ADS Dynamic Link

乾巽的博客 6081

GreenDao数据库升级,包含了Int类型的哦

  最近呢做了一个半离线半在线的app,之前都是用原生的代码写的数据库,但是我想用新的东西,所以我选择了用GreenDao,然后用用起来还挺不错的。这一篇是讲数据库升级的,等有空再详细写一篇GreenDao的使用把。另外有一个号称全世界最高效的移动数据库:ObjectBox不知道大家有没有在用,我等这段时间忙完手上的项目就去学一下那个数据库。 数据库升级的时候,首先你得去修改你的版本号,这样才会触...

qq_34723470的博客 890

一根网线,让整个公司断网,二层环路真实事故复盘

那天晚上 23:47,监控告警突然爆了。核心交换机 CPU 100%。ARP 表暴涨。广播流量飙升。业务系统集体超时。5 分钟后,全公司断网。运维群里一句话:“是不是黑客攻击?但老网工都知道,这种现象只有一种可能:二层环路。

网络技术联盟站 350

【AI智能体】Codex + Obsidian 打造专业知识库实战详解

Codex + Obsidian 搭建并操作知识库实战详解

congge 3105

JAVA基础 - 强引用、弱引用、软引用、虚引用

强引用:不会被回收; 软应用:内存不足时回收 弱引用:正常垃圾回收 虚引用:跟踪对象的正常垃圾回收 ...

zs1972551648的博客 1万+

基于机器学习的网络安全态势感知模型研究与实现

基于机器学习的网络安全态势感知模型研究与实现 1. 背景介绍 1.1 网络安全态势感知的重要性 在当今互联网时代,网络安全已经成为一个至关重要的话题。随着网络攻击手段的不断升级和演变,传统的被动防御方式已经难以满足日益

AI大模型应用之禅 1583

Java强引用、软引用、弱引用、虚引用有什么区别?

在 Java 语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握 Java 对象生命周期和 JVM 内部相关机制非常有帮助。 在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。 强引用、软引用、弱引用、虚引用有什么区别?具体使用场景是什么? 典型回答 1.强引用 特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用

小朱小朱绝不认输的博客 4196

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java中强引用、软引用、弱引用、虚引用

引用类型被回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时软引用内存不足时对象缓存内存不足时弱引用jvm垃圾回收时对象缓存gc运行后虚引用未知未知未知引用类型软引用和弱引用都可以简单实现缓存功能,在实现缓存功能的基础上又能保证缓存对象可以被及时回收。

pig_boss的博客 1665

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java对象的强引用,软引用,弱引用和虚引用

<br />     众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等方法。<br /> <br />     在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走。一般说来,如果物

lengyuhong的专栏 4万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java强引用,软引用,弱引用,虚引用

用了Java怎么长时间一直不知道原来Java还有四种引用类型,这个引用类型和我们平常说的可不一样。这里的引用类型不是指数据类型的一种,而是指Java中的引用所分的四种类型。强引用: Java中的引用,有点像C++的指针。通过引用,可以对堆中的对象进行操作。在某函数中,当创建了一个对象,该对象被分配在堆中,通过这个对象的引用才能对这个对象进行操作。StringBuffer str=new Strin

漫长学习路 5014

Java中弱引用、软引用、虚引用及强引用的区别

前言从Jdk1.2开始,在java.lang.ref包下就提供了三个类:SoftReference(软引用),PhantomReference(虚引用)和WeakReference(弱引用),它们分别代表了系统对对象的中的三种引用方式:软引用,虚引用以及弱引用。因此java语言对对象的引用有如下四种。可能有些工作经验比较丰富的java程序员都不太明白这几种引用的区别,仅仅只是知道而已。但是知道弱引用

qwli7 3148

Java:强引用,软引用,弱引用和虚引用

点击关注公众号,实用技术文章及时了解在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这就像在商店购买了某样物品后,如果有用就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走。一般说来,如果物品已经被扔到垃圾箱,想再把它捡回来使用就不可能了。但有时候情况并不这么简单,可能会遇到可有可无的...

Java知音 4286

Java强引用、软引用、弱引用、虚引用详解

强引用:如果一个对象具有强引用,GC绝不会回收它;当内存空间不足,JVM宁愿抛出OutOfMemoryError错误; 软引用:如果一个对象具有软引用,当内存空间不足,GC会回收这些对象的内存,使用软引用构建敏感数据的缓存; 弱引用:如果一个对象具有弱引用,在GC线程扫描内存区域的过程中,不管当前内存空间足够与否,都会回收内存,使用弱引用 构建非敏感数据的缓存; 虚引用:如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,虚引用主要用来跟

晓风残月xj 9607

Java中的强引用,软引用,弱引用和虚引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 一、强引用 如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

始则转俗成真,终乃回真向俗! 7073

Java 关于强引用,软引用,弱引用和虚引用的区别与用法

https://blog.youkuaiyun.com/lovoo/article/details/51615423 一、概述: 众所周知,Java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等方法。 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个...

不远远方 4万+

Java强引用、软引用、弱引用、虚引用的区别?

Java强引用、软引用、弱引用、虚引用的区别?

java1234的博客 1012

Java的四种引用(强引用,软引用,弱引用,虚引用)

Java的四种引用(强引用,软引用,弱引用,虚引用)

weixin_72984629的博客 1438

Java 强引用、弱引用、软引用、虚引用

1、强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要...

believe_s的博客 1205

Java 中的强引用、软引用、弱引用和虚引用分别是什么?

强引用是最常见的引用类型,也是默认的引用方式。只要对象被强引用关联,垃圾回收器(GC)就不会回收该对象,即使内存不足导致。

weixin_43521001的博客 1005
上一篇: java string 初始化
下一篇: java 伪Random
RobertLee~~~~~~~~
博客等级 码龄18年 14粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值