Java强软弱虚引用的特点以及应用场景(面试重点)

  • 强:即使OOM也不回收
  • 软:内存溢出前回收
  • 弱:只要垃圾收集就死
  • 虚:对垃圾收集没关系,只有得到通知(插眼,也操作不了对象、只能看到它还活着)
    一、软引用
    代码示例:
public class Softy {//-Xms20M -Xmx20Mpublic static void main(String[] args) {SoftReference<byte[]>sr=new SoftReference<>(new byte[1024*1024*10]);System.out.println(sr.get());System.gc();System.out.println(sr.get());SoftReference<byte[]>sr1=new SoftReference<>(new byte[1024*1024*10]);System.out.println(sr.get());//用作缓存,场景:缓存一张图片进内存,有重要的事情就把它清除,没有就放着}
}

使用场景:用作缓存,例如缓存一张图片进内存,有重要的事情就把它清除,没有就放着。

二、弱引用
使用场景:解决threadlocal的内存溢出问题。
1.Threadlocal怎么实现的?
每个线程有一个threadlocalmap对象,向这个map中添加 key:threadlocal对象、value:自己设置的值。不同的线程存数据时是分别向各自的map中存对象,所以threadlocal具有线程隔离性。
向这个map中放的对象是放entry,这个entry继承了弱引用类。在构造方法中entry对key(threadlocal)是被弱引用指向的。
在这里插入图片描述
2.threadlocal的使用场景?
spring声明式事务管理,f1()调用f2()和f3(),必须保证三个方法使用的connection相同,conection对象存放在threadlocal中,保证拿到的是一个链接,在同一个进程中回滚。
3.面试题:为什么弱引用可以防止threadlocal的内存溢出?
key对threadlocal的引用如果用强引用可能会内存泄露。将key(threadlocal)的引用设置成null,如果threadlocal是强引用就会导致上图中的key还在引用着threadlocal对象,不能进行内存回收。但是如果是弱引用就会立刻回收。
回收key后(变成null),去获取value就获取不到了。如果不做处理,依然会内存溢出。所以要调用remove()将整条entry干掉。

public class ThreadTest {//容器,线程隔离性static ThreadLocal<Person> t=new ThreadLocal<>();public static void main(String[] args) {new Thread(() -> {try {Thread.sleep(10);t.set(new Person("hxq"));} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(() -> {try {Thread.sleep(10);System.out.println(t.get());} catch (InterruptedException e) {e.printStackTrace();}}).start();//把entry设置成nullt.remove();}static class Person{public String name="hxq";public Person(String name){this.name=name;}}
}

三、虚引用
在某些情况下引用指向直接内存或者堆外内存,直接内存垃圾回收时,Java垃圾收集器无法管理,用虚引用将对象回收后,放到引用队列中,起到通知垃圾收集器的作用。
场景:

  • NIO包,追踪垃圾回收。reference引用直接内存,直接内存垃圾回收器无法回收。需要用虚引用,做处理。
  • DirectBuffer对象就是引用直接内存
public class Xuy {private static final ReferenceQueue<Integer> Queue=new ReferenceQueue<>();public static void main(String[] args) {//虚引用回收之后放到引用队列里面,虚引用供垃圾回收器特殊处理PhantomReference<Integer> phantomReference=new PhantomReference<>(new Integer(1), Queue);System.out.println(phantomReference.get());//NIO包,追踪垃圾回收。reference引用直接内存,直接内存垃圾回收器无法回收。需要用虚引用,做处理。//DirectBuffer对象就是引用直接内存}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++开源】GuiLite:超轻量UI框架-入门

开发环境说明 使用visual Studio 2022进行开发 下载源码 从如下的网址进行源码和示例代码的下载: GitHub源码网址为:idea4good/GuiLite示例代码路径为:idea4good/GuiLiteExample使用方法 GuiLite是一个仅有头文件的一个库,使用的时候直接include到自己的UIcode.cpp文件…

Linux处理文件sed

一、什么是sed sed全称&#xff08;stream editor&#xff09;流式编辑器&#xff0c;Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等&#xff0c;工作流程如下sed 是一种在线的、非交互式的编辑器&#xff0c;它一次处理一行内容。处理时&#xff…

十七、(正点原子)Linux LCD驱动

一、Framebuffer设备 在 Linux 中应用程序通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息。 先来看一下裸机 LCD 驱动如下&#xff1a; ①、初始化 I.MX6U 的 eLCDIF 控制器&#xff0c;重点是 LCD 屏幕宽(width)、高(height)、 hspw、 hbp、 hfp、 vspw…

【Python】连接MySQL数据库:详细教程与示例代码

文章目录 1. 安装必要的库2. 建立与MySQL的连接3. 执行SQL查询4. 插入数据5. 更新数据6. 删除数据7. 错误处理8. 小结 在数据驱动的开发中&#xff0c;连接数据库是一个至关重要的技能。Python作为一门强大的编程语言&#xff0c;提供了多种方式连接并操作MySQL数据库。本文将详…

【时时三省】(C语言基础)函数和数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 函数 跟数学里面的函数很相似 数组 一组相同类型的元素的集合 比如把5个整形1-5存起来 int arr&#xff3b;10&#xff3d;&#xff1d;&#xff5b;1&#xff0c;2&#xff0c;3&#x…

转型做产品经理,考NPDP有什么好处?

机会是留给有准备的人的&#xff0c;如果此刻的你想要转岗但又没有方向&#xff0c;建议你可以考虑下产品经理这个岗位&#xff0c;产品经理是一个非技术型的岗位&#xff0c;但是懂一些技术相关的知识会更好的和技术部门沟通&#xff0c;能更好的从技术部门的角度理解需求的可…

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…

验证跨设备挂载文件系统可行性命令

1.安装服务器端nfs-server-kernel 软件 sudo apt-get install nfs-kernel-server 2.配置服务器端软件路径 sudo vim /etc/default/nfs-kernel-server sudo service nfs-kernel-server statussudo service nfs-kernel-server restartsudo service nfs-kernel-server statu…

用Python爬虫能实现什么?

Python 是进行网络爬虫开发的一个非常流行和强大的语言&#xff0c;这主要得益于其丰富的库和框架&#xff0c;比如 requests、BeautifulSoup、Scrapy 等。下面我将简要介绍 Python 爬虫的基础知识和几个关键步骤。 1. 爬虫的基本原理 网络爬虫&#xff08;Web Crawler&#…

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下&#xff0c;需要添加下载功能 import React, { useState } from rea…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

Go语言 Import导入

本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示&#xff0c;首先创建test文件夹。 加法 在test文件夹中创建add文件夹&#xff…

别卷模型,卷应用:从李彦宏的AI观点谈起

2024年7月4日&#xff0c;世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心隆重召开。百度创始人、董事长兼首席执行官李彦宏在产业发展主论坛上的发言&#xff0c;引起了广泛关注。他提出&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这一观点…

《简历宝典》17 - 简历中“技术能力”,如何丰满且有层次,前端篇

这一节开始对技术能力模块做讲解&#xff0c;我们身边的这些互联网IT从业者们&#xff0c;前端开发、Java开发、软件测试又或者是其他职位的开发者们&#xff0c;技术能力这个模块是绕不过去的&#xff0c;从简历上看&#xff0c;这个模块体现了我们之前软件工作生涯中的技术功…

大厂面试-基本功

大厂面试第4季 服务可用性多少个9是什么意思遍历集合add或remove操作bughashcode冲突案例BigdecimalList去重复IDEA Debugger测试框架ThreaLocal父子线程数据同步 InheritableThreadLocal完美解决线程数据同步方案 TransmittableThreadLocal 服务可用性多少个9是什么意思 遍历集…

Tensor列表索引本质

张量列表索引本质 单列表索引 将原张量shape对应位置数字更改为索引列表的形状 data torch.randn((9, 512, 30)) index_list [0, 1, 3] print(data[:, index_list].shape)[[9, 3, 30]] # torch.Size([1, 6, 5]) index2_list torch.IntTensor([[[4, 5, 6, 7, 8],[4, 5, 6,…

【C++高阶】哈希函数底层原理探索:从算法设计到实现优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现 map与set &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀哈希 &#x1f4da;1. unord…

比较 WordPress 、 Baklib 和 BetterDocs

对于希望管理其产品和服务的在线文档或知识库以支持其客户和员工的组织来说&#xff0c;市场上有太多的平台和工具。一些组织使用 WordPress 作为 Web 内容管理&#xff0c;并打算使用可用的插件。如果您是这样的组织之一&#xff0c;正在考虑使用广泛使用的 WordPress 插件之一…

(ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类

文章目录 Robust deep alignment network with remote sensing knowledge graph for zero-shot and generalized zero-shot remote sensing image scene classification相关资料摘要引言遥感知识图谱的表示学习遥感知识图谱的构建实体和关系的语义表示学习创建遥感场景类别的语…

ts踩坑!vue3中ts文件用export导出公共方法的ts类型定义

当我们有一个ts文件&#xff0c;定义并export出该function&#xff0c;其中方法里边有定义的变量&#xff0c;方法、钩子函数等多种&#xff0c;并最终return出该变量、方法。 此时 ts规则校验会让我们返回该函数类型。如下 export default function () {const chart ref();c…