WeakHashMap 和强引用值

2024-06-20

Javadocs 说“当一个密钥被丢弃时,它的条目是有效地从地图上删除”。

但除非有另一个线程偶尔删除这样的Map.Entry条目,值对象不会被映射强引用吗?但由于没有这样的线程运行,只有get方法调用可以删除此类条目 - 一次一个。

我几乎总是使用WeakHashMap<K, WeakReference<V>>是因为。为什么他们不将其作为默认行为 - 值也作为弱引用?


引用队列用于自动删除条目。

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/ReferenceQueue.html http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/ReferenceQueue.html

引用队列,在检测到适当的可达性更改后,垃圾收集器将已注册的引用对象附加到该队列。

基本上,弱引用是垃圾收集器的核心部分,因此当发生 GC 扫描时,会找到未使用的引用并将其放入队列中,然后可以根据这些队列的内容采取操作。

一个线程可以坐在队列中remove http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/ReferenceQueue.html#remove()需要进行清理时发出警报的方法或poll队列。

《Java 理论与实践:用弱引用堵住内存泄漏》 http://www.ibm.com/developerworks/java/library/j-jtp11225/解释:

实施WeakHashMap说明了弱引用的常见用法——某些内部对象扩展WeakReference.

...

WeakHashMap使用弱引用来保存映射键,这允许键对象在应用程序不再使用时被垃圾收集,并且get()实现可以通过是否区分活动映射和死映射WeakReference.get()回报null。但这只是在应用程序的整个生命周期中防止 Map 内存消耗增加所需的一半;在收集关键对象后,还必须采取一些措施从 Map 中删除死条目。否则,映射将简单地填充与死键对应的条目。虽然这对应用程序来说是不可见的,但它仍然可能导致应用程序内存不足,因为即使键被收集,Map.Entry 和值对象也不会被收集。

...

引用队列是垃圾收集器向应用程序反馈有关对象生命周期的信息的主要方式。弱引用有两个构造函数:一个仅将引用对象作为参数,另一个也采用引用队列。当创建了具有关联引用队列的弱引用并且引用对象成为 GC 的候选者时,引用对象(而不是引用对象)在引用被清除后将排队到引用队列中。然后,应用程序可以从引用队列中检索引用,并获悉引用对象已被收集,以便它可以执行关联的清理活动,例如删除已从弱集合中删除的对象的条目。 (引用队列提供与 BlockingQueue 相同的出队模式——轮询、定时阻塞和不定时阻塞。)

EDIT:

即使有队列,弱映射仍然可能泄漏。蜉蝣 http://en.wikipedia.org/wiki/Ephemeron是尝试解决弱密钥引用引用该密钥的强保留值的情况。它们无法在 java 中实现。

蜉蝣解决了尝试使用注册表将属性“附加”到对象时常见的问题。当某个属性应该附加到一个对象时,该属性(就 GC 行为而言)通常应该具有该对象的实例变量所具有的生命周期。然而,由于对象及其属性之间存在外部关联,这会变得复杂,例如:

property --------- registry --------- association --------- object

在这里,注册表(第三方)将保留关联本身,这需要从注册表中手动删除(而不是自动垃圾收集)。虽然这个问题总是可以在任何给定的具体情况下通过使用各种弱关联类型之一来解决,但选择“正确”的关联类型取决于多种因素,其中一些因素可以动态变化。

星历通过定义星历的“内容”(值)将被严格保留,直到已知密钥被垃圾收集为止,从而解决了这个问题。从此以后,星历的内容将被弱化。因此,当且仅当键是可垃圾收集的时,星历的内容才可以进行垃圾收集,这正是我们在对象的实例变量中观察到的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WeakHashMap 和强引用值 的相关文章

  • JNA - EnumProcessModules() 未返回所有 DLL?

    我试图从游戏中读取坐标 当我在通过 OpenProcess 接收的 HANDLE 上使用 ReadProcessMemory 以及我在 CheatEngine 中找到的内存时 效果非常好 例如 如果我知道正在运行的进程中的浮点值是0x5AB
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • jpa2 CriteriaBuilder order by “ORDER BY 表达式必须出现在选择列表中”

    我正在写一个查询标准生成器 但无法添加order by子句 因为它随消息一起抛出错误ORDER BY 表达式必须出现在选择列表中这是我的实体 public class A Integer aId ManyToOne JoinColumn n
  • Glassfish:在部署期间修改 EAR 的部署描述符

    经过几天的搜索 尝试和摇头 我将这个问题发布到 SO 尽管它seems已经得到答复 这是场景 我有一个 EAR 应用程序 目前 包含一个 WAR 和一个 EJB 模块 EJB 模块使用 JPA persistence xml 并且一些无状态
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • spring mvc 跟踪引用页面

    在基于注释的弹簧控制器中 如果用户正在url com first page并点击一个链接或提交一份表格指出url com second page 如何制作second page知道url of first page所以这样second pa
  • 如何在Java中打印保留2位小数的浮点数?

    我可以用System out print 您可以使用printf http java sun com j2se 1 5 0 docs api java io PrintStream html printf 28java lang Strin
  • 两条腿的 OAuth 和 Gmail Atom feed

    我们正在尝试让 2 legged OAuth 与 Gmail Atom feed 一起使用 我们使用 John Kristian Praveen Alavilli 和 Dirk Ba lfanz 贡献的 Java 库 http oauth
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • 春季MVC。方法参数字段的默认值

    我有一个带有方法测试的简单控制器 RequestMapping produces application json ResponseBody public HttpEntity
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • 如何使 JScrollPane 与嵌套 JPanel 一起正常工作?

    我正在使用 NetBeans 在 Java 中构建 Swing 应用程序 但我遇到布局问题 我的主框架包含一个JScrollPane其中包含一个JPanel called contentPanel其中又包含一个JPanel called l
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近

随机推荐

  • 从 readFile 返回未定义[重复]

    这个问题在这里已经有答案了 我正在尝试让以下代码工作 use strict var fs require fs var fileName readme txt var str fs readFile fileName utf8 functi
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 使用 ANTLR4 识别单行中的多行注释

    我想用 ANTLR4 解析 PostScript 代码 我完成了语法 但是一种特定的语言扩展 由其他人引入 很难被识别 一个简短的例子 1 This is a line comment 2 The next line just pushes
  • b'从 ANSI 1252 重新编码为 UTF-8 失败,并出现错误:“参数无效”。'巨熊猫 蟒蛇

    我正在尝试将 shapefile 读入 GeoDataFrame 通常我只是这样做并且它有效 import pandas as pd import geopandas as gpd from shapely geometry import
  • 使用 Google Storage Transfer API 将数据从外部 GCS 传输到我的 GCS

    我正在开发一个由 ReactJs 前端和 Java SpringBoot 后端组成的 Web 应用程序 该应用程序要求用户将数据从他们自己的 Google Cloud 存储上传到我的 Google Cloud 存储 申请流程如下 前端请求用
  • Chrome 打包应用收到通知时显示橙色 Windows 任务栏图标橙色

    我正在开发一个发送通知的 Chrome 打包应用程序 现在已全部连接 但是 当用户不在应用程序中时 应用程序位于后台且其上有其他窗口 通知会弹出一段时间然后消失 我想将任务栏图标更改为橙色 与环聊打包应用程序相同 以便用户知道稍后有通知可以
  • 无法在docker容器中安装npm?

    我正在数字海洋服务器的 Docker 平台上部署一个简单的 Node js 应用程序 包 json name docker centos hello private true version 0 0 1 description Node j
  • 为绘图制作 2D 图例 - 双变量分区统计图

    我一直在玩双变量 choropleth 地图 并且一直在如何创建类似于 2d 图例的问题上陷入困境约书亚 史蒂文斯 http www joshuastevens net cartography make a bivariate chorop
  • .NET 中严格浮点数学的库

    我有 Java 算法 计算及其单元测试 单元测试期望结果具有一定的精度 增量 现在我将算法移植到 NET 中 并希望使用相同的单元测试 我使用双数据类型 问题在于 Java 使用 strictfp 64 位 来执行 Math 类中的某些操作
  • 从 numpy 数组中删除连续的 RGB 值

    我最初根据灰度图像的初始数组创建了一个子数组 从 numpy 数组中删除连续数字 https stackoverflow com questions 50743769 deleting consecutive numbers from a
  • Prototype 和 jQuery 一起?

    我注意到我使用的某个脚本依赖于原型 Lightbox 2 它会与 jQuery 在同一页面上一起工作吗 有没有办法确保它们不发生冲突 你可以 但你需要采取特殊步骤 http docs jquery com Using jQuery with
  • 重命名表?

    我有一个名为的 DynamoDB 表Transactions我正在其中记录我的应用程序中活动的审计跟踪 午夜过后 我想将表重命名为类似的名称Transactions 2015 10 01并创建一个名为的新表Transactions 我将在我
  • 如何解决【Vue warn】:使用数组语法时 props 必须是字符串?

    我的看法是这样的 div class col md 8 div
  • 有关 Swift 编译器选项的文档

    您好 我想开始在 Apple Swift 语言上运行一些微基准测试 然而 我觉得很难找到有关编译器优化的不同选项的适当文档 我读过很多关于其他人的语言微基准的问题和文章 但是如果能有一些关于该主题的可靠文档那就太好了 在最新的测试版中 使用
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • 根据 main.ts 中的 URL 引导多个或单个模块

    我正在使用一个 NET Framework MVC Web项目 该项目无法完全转移到完整的角度项目 因此我无法使用角度的路由来延迟加载 但我也不想加载使用角度组件的所有内容 这是一个企业解决方案 要说 嘿 让我们充分利用 Angular 并
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 硒中 ExpectedConditions.elementToBeSelected 和 elementSelectionStateToBe 之间的区别

    硒中 ExpectedConditions elementToBeSelected 和 elementSelectionStateToBe 有什么区别 如何使用它 你能举个例子吗 待选元素 public static ExpectedCon
  • WeakHashMap 和强引用值

    Javadocs 说 当一个密钥被丢弃时 它的条目是有效地从地图上删除 但除非有另一个线程偶尔删除这样的Map Entry条目 值对象不会被映射强引用吗 但由于没有这样的线程运行 只有get方法调用可以删除此类条目 一次一个 我几乎总是使用