强引用、软引用、弱引用、虚引用的区别 -Java_强引用软引用弱引用虚引用的区别-程序员宅基地

技术标签: JVM  jvm  java  

Java中为何要分别定义强引用、软引用、弱引用、虚引用四种引用类型?

我们对于对象的定义不能只局限于“引用”和“未被引用”两种状态,因为我们还存在几种引用类型能描述这样一类对象:当内存空间还足够时,仍保留在内存之中,如果内存空间在进行垃圾收集后仍然非常紧张,那就可以抛弃这些对象(这类对象应用在很多系统的缓存功能上)。

在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(WeakReference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。

定义这四种引用类型的目的:

1.让程序员通过代码的方式决定某些对象的生命周期;
2.有利于JVM进行垃圾回收。

强引用:必不可少的,不会被垃圾回收器进行回收的。

当内存空间不足的时候,程序宁愿抛出java.lang.OutOfMemoryError错误,使程序异常终止,也不回收这种对象。

 public static void main(String[] args) {
    
        Object[] objects=new Object[Integer.MAX_VALUE];  
    }
"C:\Program Files\Java\jdk1.8.0_192\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.3\lib\idea_rt.jar=6744:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.3\bin" ...Day27.TestDemo
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at Day27.TestDemo.main(TestDemo.java:5)

Process finished with exit code 1

如果想要中断强引用和某个对象之间的联系的时候,可以显示的将引用赋值为null,这样,JVM在合适的时间就会回收该对象。

软引用:有用但不是必需的对象。

SoftReference类
只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。只有在内存空间不足的时候,Java虚拟机才会回收该对象,如一些网页缓存,图片缓存就使用的软引用。

public static void main(String[] args) throws InterruptedException {
    
        //创建方式
        Object obj = new Object();
        SoftReference<Object> sf = new SoftReference<Object>(obj);
        //使用方式
        Object obj1 = sf.get();
        //说明没有被回收
        if(obj1 != null) obj1.wait();//使用对象

    }

弱引用:非必需的对象。

WeakReference类
被弱引用关联的对象只能生存到下一次垃圾收集发生为止,等下一次垃圾回收回收的时候,无论JVM内存空间是否充足,都会回收被弱引用关联的对象。

弱引用和软引用的区别:
生存周期不同:弱引用的对象拥有更短暂的生命周期,在垃圾回收器扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存是否足够,都会进行回收它。垃圾回收器是一个优先级很低的线程,因此不一定会发现那些只具有弱引用的对象,所以被软引用关联的对象只有在内存空间不足的时候才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。

虚引用:最弱的一种引用,如同虚设一样

一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。
PhantomReference类

总结:

引用类型 被垃圾回收的时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止运行时终止
软引用 在内存不足时 对象缓存 内存不足时终止
弱引用 在垃圾回收时 对象缓存 GC运行后终止
虚引用 未知 让这个对象被收集器回收时收到一个系统通知 未知

强引用:
不会被回收的对象。
软引用:
如果弱引用对象回收完之后,内存还是报警,继续回收软引用对象
弱引用:
如果虚引用对象回收完之后,内存还是报警,继续回收弱引用对象
虚引用:
虚拟机的内存不够使用,开始报警,这时候垃圾回收机制开始执行System.gc(); 如果没有对象回收了,就回收没虚引用的对象

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46551861/article/details/115260635

智能推荐

error in opening zip file-程序员宅基地

文章浏览阅读1w次。错误情况项目用 maven 打好 war 包后放到 tomcat 下,启动 tomcat,出现以下错误3-Nov-2017 12:21:44.346 严重 [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start compone_error in opening zip file

向线程传递参数的两种基本方法-程序员宅基地

文章浏览阅读531次。在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法。 欲先取之,必先予之。一般在使用线程时..._线程传递参数的方式

Matlab save colormap_如何在matlab保存色标-程序员宅基地

文章浏览阅读546次。Matlab save colormapMatlab save colormap1、保存成eps格式;_如何在matlab保存色标

unity4.6之UGUI之与代码结合及Text讲解_unity两个ui的text相加的代码-程序员宅基地

文章浏览阅读2.4k次。UGUI与以往的NGUI不同之处很多其中一大特点就是UGUI 把精灵图集的功能取消了。首先是我们看看UGUI的UI界面:其中有项是Text...也就是 本节要讲的内容;说到text不得不说的是字体:下图中看字体的属性较之NGUI方便了很多的,line spacing 是行间距辣么字体木有了图集自然会有新东西了在project里直接右击会出现impor_unity两个ui的text相加的代码

【pwnable.kr】collision_pwnable.kr-02 collision-程序员宅基地

文章浏览阅读179次。ssh登录,源码如下:#include <stdio.h>#include <string.h>unsigned long hashcode = 0x21DD09EC;unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i<..._pwnable.kr-02 collision

使用repmgr5.1配置postgresql12的主从复制,读写分离和主从切换(超详细)_repmgr-5.1.0.tar.gz-程序员宅基地

文章浏览阅读1.5k次。使用repmgr5.1配置postgresql12的主从复制,读写分离和主从切换(超详细)postgresql.conf参数设置配置步骤postgresql.conf参数设置wal_level=replicawal_level中有三个主要的参数:minimal, replica, orlogical, minimal --不能通过基础备份和wal日志恢复数据库。replica --该级别支持wal归档和复制。(=9.6版本以前的archive和hot_standby)logic_repmgr-5.1.0.tar.gz

随便推点

divx.exe_pcsvc.exe应用程序错误-程序员宅基地

文章浏览阅读363次。 进程知识库 divx - divx.exe - 进程信息进程文件: divx 或者 divx.exe进程名称: Divx 描述:divx.exe被确认为是MASTAK病毒。这个文件建议终止。 出品者: 未知N/A属于: MASTAK virus系统进程: 否后台程序: 是使用_pcsvc.exe应用程序错误

Mac 安装 OpenCV 及示例程序_mac 安装openvap指定版本-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏2次。Mac 安装 OpenCV 及示例程序安装OpenCV安装 Xcode安装Homebrew安装Python安装OpenCV安装 Xcode直接在APP Store中下载安装即可sudo xcodebuild -licensesudo xcode-select --install安装Homebrew≈Mac上的apt-get参考 Mac API那篇文章,那里已经安装了安装完可以用..._mac 安装openvap指定版本

mac 下QT全面跨平台环境搭建_macos10.13 qt-unified-mac-x64-online-程序员宅基地

文章浏览阅读617次。macOS+linux+windows+ios+android(QtCreator)系统:macos开发工具:Qt creator开发语言:C++ python下载地址:https://www.qt.io/zh-cn/download选择开源版macOS+linux+windows+ios+android(QtCreator)系统:macos开发工具:Qt creator开发语言:C++ python下载地址:https://www.qt.io/zh-..._macos10.13 qt-unified-mac-x64-online

【React】为img标签的src请求添加自定义头部,添加token,实现前端带身份向后端请求图片_前端img src 访问需要认证如何解决-程序员宅基地

文章浏览阅读9.9k次,点赞4次,收藏18次。目录应用场景尝试解决一:尝试解决二:总结:应用场景问题:前端写入指定的img标签和src属性,请求不了后端图片。原因:401,UnauthorizedError,因为前端中的src属于普通的get请求,不带自定义header,而后端有对每个请求都进行身份验证,最终返回{ status: 1, msg: "TOKEN ERROR"}前端请求头中找不到Authorization: Bearer token....那请求的接口都有对axios进行拦截,但是img标签的src不经_前端img src 访问需要认证如何解决

linux(centos)+nginx/apache+mysql+php-fpm环境搭建_linux虚拟机配置apache+mysql+php-程序员宅基地

文章浏览阅读983次。linux+nginx/apache+mysql+php环境搭建参考链接:https://blog.csdn.net/wangliqiang1014/article/details/82906234一、安装centoshttp://mirrors.aliyun.com/centos/7/isos/x86_64/阿里云镜像网站上下载centos 7的iso镜像。https://mp.weixin.qq.com/s/1h8B20bu1y-xCpVbSdoabw在vmware中使用该教程安装cent_linux虚拟机配置apache+mysql+php

Java:Maven下载安装和阿里云中央仓库配置_java maven阿里仓库-程序员宅基地

文章浏览阅读1.1k次。文档:https://developer.aliyun.com/mvn/guide。_java maven阿里仓库