java引用 弱引用_了解Java弱引用

java引用 弱引用

我最近没来得及关注这个博客,最重要的是,我没有为与技术界的所有人保持联系而致歉。 最近,我偶然发现了自Java 1.2起可用的java.lang.ref软件包,但具有讽刺意味的是,几天前我才知道它。 在浏览了几篇有关各种引用类型和java doc的文章时,我非常着迷,并渴望通过使用一些与引用相关的代码来弄脏我的手。

我不是要谈的java.lang.ref包中可用的每个引用类,因为它已经是很好的解释在这里 。 让我们看一下我编写的以下代码片段,以了解WeakReference的基本操作。

import java.lang.ref.WeakReference;  
import java.util.HashMap;  
import java.util.Map;  public class ReferencesTest {  private WeakReference<Map<Integer, String>> myMap;  public static void main(String[] args) {  new ReferencesTest().doFunction();  }  private void doFunction() {  Map<Integer, String> map = new HashMap<Integer, String>();  myMap = new WeakReference<Map<Integer, String>>(map);  map = null;  int i = 0;  while (true) {  if (myMap != null && myMap.get() != null) {  myMap.get().put(i++, "test" + i);  System.out.println("im still working!!!!");  } else {  System.out  .println("*******im free*******");  }  }  }  
}

首先,我定义了一个弱引用实例变量,向其分配在doFunction()方法中初始化的HashMap实例。 然后,数据通过弱引用实例而不是直接通过我们创建的哈希图的具体实例输入到地图。 由于WeakReferences的工作方式,我们检查地图是否为空。

在程序执行期间,如果没有软引用或强引用绑定到弱引用,则将首先对其进行垃圾收集。 因此,如果内存非常低,或者垃圾收集器认为适当的时间和时间,则弱引用是垃圾收集,这就是为什么我在代码中包含else语句以显示这种情况的原因。 通过设置最小值–Xms–Xmx来运行此命令,以了解其工作原理,因为否则必须等待更长的时间才能获得内存不足异常。 然后将WeakReference实现更改为SoftReference实现,并查看程序在几次迭代后实际上崩溃了。 这是由于以下事实:SoftReferences仅保证在发生OutOfMemory错误之前清理内存。 但是,有了WeakReference,该程序就可以继续运行而不会停止,因为它几乎总是可以进行垃圾回收,并且我们可以重新初始化缓存并继续填充缓存。

关于弱引用的好处是,我认为这是实现内存中高速缓存的最佳方法之一,当我们需要保持数据不发生持续变化但经常在内存中访问且成本高昂时,通常会自行实现对于像JBoss缓存或EHCache这样的成熟的缓存实现而言,这实在太多了。 通常,我已经实现了缓存解决方案,还看到了类似于以下代码段的生产代码。

import java.util.HashMap;  
import java.util.Map;  public class CacheTest {  private Map<String, Object> myAwesomeCache = new HashMap<String, Object>(100);  public Object getData(String id){  Object objToReturn = null;  if(myAwesomeCache.containsKey(id)){  objToReturn = myAwesomeCache.get(id);  }else{  // retrieve from the database and populate the in memory cache map  }  return objToReturn;  }  
}

这只是一个非常基本的级别的实现,它可以使我们有时会使用Maps来构建内存缓存实现。 我们需要注意的事实是,尽管此实现没有本质上的错误,但是在您的应用程序内存不足的情况下,如果垃圾回收器可以将其从内存中删除以释放一些内存,这将是一个理想的选择。其他需要它的过程。 但是,由于此映射是一个强大的参考,因此垃圾回收器无法将此参考标记为符合收集条件。 更好的解决方案是将缓存实现从HashMap更改为WeakHashMap 。

Javadoc指定了有关WeakHashMap的以下内容;

“基于哈希表的具有弱键的Map实现。 如果WeakHashMap中的条目不再是普通使用的键,则该条目将被自动删除。 更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,即被终结化,终结和回收。 当一个键被丢弃时,它的条目将被有效地从映射中删除,因此此类的行为与其他Map实现有所不同。”

因此,回想起来,我相信只要您需要内存中的缓存实现,并且内存对您而言至关重要,那么使用WeakHashMap将会是有益的。

总结了我对参考资料包的发现,并邀请大家分享您在这方面的经验,对此深表感谢。

干杯

参考:在“ 我的旅程” IT博客中,从我们的JCG合作伙伴 Dinuka Arseculeratne 了解Java弱引用


翻译自: https://www.javacodegeeks.com/2012/01/understanding-java-weak-references.html

java引用 弱引用

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

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

相关文章

【TypeScript系列教程04】编译参数

目录 编辑单个 .ts 文件 编辑多个 .ts 文件 tsc 常用编译参数 编辑单个 .ts 文件 通常我们使用 .ts 作为 TypeScript 代码文件的扩展名。 然后执行以下命令将 TypeScript 转换为 JavaScript 代码: tsc sunjiaoshou.js 编辑多个 .ts 文件 我们可以同时编译多个 ts 文件: …

传递数组到 Shader

https://chengkehan.github.io/UniformArray.html 转载于:https://www.cnblogs.com/jim-game-dev/p/5658023.html

k均值例子 数据挖掘_数据挖掘的技术有很多种,常用的数据挖掘技术就这13种...

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的数据中&#xff0c;提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。数据挖掘的任务是从数据集中发现模式&#xff0c;可以发现的模式有很多种&#xff0c;按功能可以分为两大类&#xff1a;预…

【TypeScript系列教程05】保留关键字

目录 TypeScript 保留关键字 TypeScript 保留关键字 TypeScript 保留关键字如下表所示&#xff1a;

Lucene组件概述

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1&#xff0c;m2&#xff0c;m3&#xff0c;...&#xff0c;mk是两两互素的正整数&#xff0c;即gcd(mi,mj)1&#xff0c;i!j&#xff0c;i,j1,2,3,...,k. 则同余方程组&#xff1a; x a1 (mod n1) x a2 (mod n2) ... x ak (mod nk) 模[n1,n2,...nk]有…

aix 的c库为什么都是静态库_卢卡库:若梅罗、莱万都在努力突破极限,为什么我不能做到呢...

直播吧12月8日讯 北京时间周四凌晨的欧冠小组赛末轮比赛&#xff0c;国米将在主场迎战顿涅茨克矿工。目前&#xff0c;蓝黑军团依然保留着些许出线希望。在这场比赛之前&#xff0c;国米射手卢卡库接受了《法国足球》的采访&#xff0c;他谈论了和孔蒂的关系、和劳塔罗的搭档以…

【TypeScript系列教程06】基础类型

目录 TypeScript 基础类型 任意类型 (any) 变量的值会动态改变时 改写现有代码时 定义存储各种类型数据的数组时 数字类型 (number)

便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑?

大家好&#xff0c;我是圣联达不锈钢管材管件孙立成。今天有伙伴们问我&#xff0c;自己使用的304不锈钢管表面怎么发黑了。带着这个问题&#xff0c;今天我特意去梳理了有关304发黑的缘故及其解决方法。304不锈钢管实际上按照正常生产流程&#xff0c;好的304不锈钢管加工制做…

jrockit_Java堆空间– JRockit和IBM VM

jrockit本文将为您提供JRockit Java堆空间与HotSpot VM的概述。 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识。 Oracle JRockit VM Java堆&#xff1a;2个不同的内存空间 -Java堆&#xff08;YoungGen和OldGen&#xff09; -本机内存空间&#xff08;…

【TypeScript系列教程07】变量声明

目录 TypeScript 变量声明 实例 类型断言(Type Assertion) TypeScript 是怎么确定单个断言是否足够 类型推断 变量作用域 TypeScript 变量声明

【TypeScript系列教程08】运算符

目录 TypeScript 运算符 算术运算符 实例 关系运算符 逻辑运算符 短路运算符 (&& 与 ||) 位运算符

EAI的Spring集成教程

课程大纲 Spring Integration是用于企业应用程序集成的开源框架。 这是一个轻量级的框架&#xff0c;建立在核心Spring框架之上。 它旨在支持开发事件驱动的体系结构和以消息为中心的体系结构典型的集成解决方案。 Spring Integration扩展了Spring编程模型&#xff0c;以支持著…

检验例题_高考必考|化学工艺流程之物质的分离提纯及检验鉴别,轻松拿分

嗨&#xff0c;小器来喽&#xff01;今天给大家带来的资料依旧是化学的工艺流程的相关知识&#xff0c;因为小器知道在这部分内容中大家是很容易丢分的&#xff0c;都是基础知识不扎实的原因&#xff0c;所以给大家的资料都是从易到难的安排还有专属高考相关例题&#xff0c;简…

tar命令核心应用案列及多重参数和find组合应用

tar zcvf 压缩包 文件 打包&#xff1a;尽量切换到打包目录的上级目录&#xff0c;然后用相对路径打包 tar zcvf [随意路径] /框 [相对路径] 一堆苹果 tar tf 查看内容 -z --gzip --ungzip filter the archive through gzip||调用gzip来压缩归档文件 -c --create create a ne…

三态门三个状态vhdl_温故知新,高阻态和三态门

欢迎FPGA工程师加入官方微信技术群高阻态高阻态这是一个数字电路里常见的术语&#xff0c;指的是电路的一种输出状态&#xff0c;既不是高电平也不是低电平&#xff0c;如果高阻态再输入下一级电路的话&#xff0c;对下级电路无任何影响&#xff0c;和没接一样&#xff0c;如果…

【TypeScript系列教程09】条件语句的使用

目录 TypeScript 条件语句 条件语句 if 语句 语法 实例 if…else 语句 语法 实例 if…else if….else 语句

学习数据库的三大范式

学习数据库的三大范式 第一范式:确保每列的原子性 如果每列(或者每个属性)都是不可再分的最小的数据单元(也称最小的原子单元)&#xff0c;则满足第一范式。 第二范式:在第一范式的基础上&#xff0c;确保每列都和主键相关 如果一个关系满足第一范式&#xff0c;并且除了主键以…

【TypeScript系列教程10】循环语句的使用

目录 TypeScript 循环 for 循环 语法 实例 for…in 循环 语法 实例 for…of 、forEach、every 和 some 循环

口译员设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …