WeakHashMap 是否会不断增长,或者是否会清除垃圾键?

2024-03-17

我正在尝试使用WeakHashMap https://docs.oracle.com/javase/10/docs/api/java/util/WeakHashMap.html作为并发Set https://docs.oracle.com/javase/10/docs/api/java/util/Set.html的弱引用。

    this.subscribers =
            Collections.synchronizedSet(
                    Collections.newSetFromMap(
                            new WeakHashMap <>()
                    )
            );

当一个元素进入垃圾回收时,我的集合继续将其报告为集合的一部分。所以看起来地图在不断增长。

文档说:

当钥匙被丢弃时,它的条目实际上会从地图中删除,……

但实际情况似乎并非如此。

是否有一个点WeakHashMap清除碎屑?


是的,钥匙已清除after垃圾确实被收集了

Yes, WeakHashMap确实清除了碎屑。已进入垃圾回收的键不再在大小中报告。但您必须等待垃圾收集真正发生。

看来您对对象进行垃圾收集的看法可能是错误的。也许你的对象变成了候选人用于垃圾收集,但尚未被收集。尝试调用垃圾收集器并等待它完成。但请记住,致电System.gc()只是对 JVM 的建议,可能会被忽略,具体取决于您的 JVM 实现和当前运行时场景。

这是一个完整的示例应用程序。请注意,Set报告减少size是否打电话Set::remove或者让对象超出范围。

package com.basilbourque.example;

import java.util.Collections;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;

public class WeakHashMapExercise {

    public static void main ( String[] args ) {
        WeakHashMapExercise app = new WeakHashMapExercise();
        app.doIt();
    }

    private void doIt ( ) {
        Set < UUID > set =
                Collections.synchronizedSet(
                        Collections.newSetFromMap(
                                new WeakHashMap <>()
                        )
                );

        UUID uuid1 = UUID.fromString( "a8ee1e34-cead-11e8-a8d5-f2801f1b9fd1" );
        UUID uuid2 = UUID.fromString( "39bda2b4-5885-4f56-a900-411a49beebac" );
        UUID uuid3 = UUID.fromString( "0b630385-0452-4b96-9238-20cdce37cf55" );
        UUID uuid4 = UUID.fromString( "98d2bacf-3f7f-4ea0-9c17-c91f6702322c" );

        System.out.println( "Size before adding: " + set.size() );

        set.add( uuid1 );
        set.add( uuid2 );
        set.add( uuid3 );
        set.add( uuid4 );

        System.out.println( "Size after adding 4 items: " + set.size() );  // Expect 4.

        set.remove( uuid3 );

        System.out.println( "Size after removing item # 3: " + set.size() );  // Expect 3.

        uuid2 = null;  // Release that UUID to garbage-collection.

        // That released object may still appear in our `Set` until garbage collection actually executes. 
        System.gc(); // Ask the JVM to run the garbage-collection. Only a suggestion, may be ignored.
        try {
            Thread.sleep( 1_000 );  // Wait a moment, just for the heck of it.
        } catch ( InterruptedException e ) {
            e.printStackTrace();
        }

        System.out.println( "Size after making garbage of item # 2: " + set.size() );  // Expect 2.

        for ( UUID uuid : set ) {
            System.out.println( uuid.toString() );
        }


    }
}

看到这个代码在 IdeOne.com 上实时运行 https://ideone.com/UZmwny.

添加前的大小:0

添加 4 件后的尺寸:4

删除第 3 号商品后的尺寸:3

物品#2制作垃圾后的尺寸:2

就我而言,使用Java 10.0.2 https://en.wikipedia.org/wiki/Java_version_history#Java_SE_10的版本OpenJDK https://en.wikipedia.org/wiki/OpenJDK-based Zulu JVM https://www.azul.com/downloads/zulu/ from 蔚蓝系统公司 https://www.azul.com,垃圾收集器似乎确实根据我的要求激活了。如果我注释掉延迟一秒钟,或者System.gc调用,则保留最后报告的尺寸3而不是预期的2.

您甚至可以在以下情况下看到此行为在 IdeOne.com 上实时运行此代码 https://ideone.com/JAs936。请注意下面最后一项的情况3但上面是2.

添加前的大小:0

添加 4 件后的尺寸:4

删除第 3 号商品后的尺寸:3

物品#2制作垃圾后的尺寸:3

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

WeakHashMap 是否会不断增长,或者是否会清除垃圾键? 的相关文章

随机推荐

  • Python字典查找性能,get vs in

    这并不是过早的优化 我的用例在内部循环的最里面对字典的权利进行了双重检查 一直运行 而且 它在智力上也令人厌烦 见结果 这些方法中哪一种更快 mydict hello yes goodbye no key hello A if key in
  • 对 BigIntegers 列表求和

    我已经查看了所有内容 但无法弄清楚这一点 如何对 BigIntegers 列表求和 Using System Numerics Using System Linq List
  • 具有多个组件的开盖

    我正在尝试将三个单元测试项目 三个不同的 dll 合并到一份 OpenCover 报告中 是否可以 我尝试查看过滤器 但在 OpenCover Wiki 站点中没有看到足够的详细信息 示例 有人可以告诉我可以从哪里开始吗 多谢 对的 这是可
  • 错误:无法初始化客户端 | mongo-connect 快速会话

    我在尝试在 mongodb 上保存会话时遇到错误 这是我的代码 const express require express const session require express session const MongoStore req
  • 与 gfortran 和 gcc 静态链接的混合语言

    我有一些用 C 和 Fortran 编写的代码 我想将其编译成静态链接的可执行文件 如果我动态编译代码 使用 fno underscoringgfortran 的选项 一切正常 但是 我想将其链接到 so文件中 静态链接大部分需要的库 然后
  • 从派生的可变参数模板类调用基模板的虚拟方法

    这本质上是后续之前的一个问题 https stackoverflow com q 26351963 315052 不是我提出的 但我对答案感兴趣 问题是 为什么编译器 链接器无法解析派生类对虚函数的调用 在这种情况下 派生类是具有可变参数的
  • C# 强制执行语句的顺序

    我的问题是关于 C 大概还有 Net 中的执行顺序保证 我给出了我所了解的 Java 示例来进行比较 对于Java 来自 Java并发实践 只要在该线程内无法检测到重新排序 就无法保证一个线程中的操作将按照程序给定的顺序执行 即使重新排序对
  • haskell 优雅的方式从无限的数字列表中过滤(减少)重复序列

    这是一个产生无限随机数列表的函数 import System Random values Int values map fst scanl r gen gt randomR 1 10 gen randomR 1 10 mkStdGen 1
  • 使用 FFmpeg 根据其 元数据旋转视频?为什么 Android 会放置错误的元数据?

    我有一个用户上传视频的网站 对于我的网站 我还有一个 Android 应用程序 该网站为每个上传的视频 从浏览器或 Android 创建一个缩略图 问题是对于普通视频来说一切都好 但是对于android我的视频旋转了90 我认为 Andro
  • 在检查条件时消除代码中嵌套 if 的最佳方法是什么?

    我正在用 Java 开发一个 BlackBerry 应用程序 并且有一个存储所有用户设置的选项类 问题是我需要检查一些条件才能知道如何反应 随着我不断添加更多功能 会向用户显示更多 GUI 选项 Options 类中存储更多设置 并且需要检
  • 用逗号分隔

    嘿 我有这个 following user id row following user id 我得到 44443344330 然后我使用 implode 函数并用逗号分隔 44 44 33 44 33 0 但我不想要最后一个数字的最后一个逗
  • 将字典值映射到列表

    给定以下字典 dct a 3 b 3 c 5 d 3 如何将这些值应用于列表 例如 lst c d a b d 为了得到类似的东西 lstval 5 3 3 3 3 Using a 列表理解 https docs python org 3
  • Google 警告:资源解释为 Font,但使用 MIME 类型 application/octet-stream 传输

    我的字体在 Google 中收到警告 资源解释为字体 但使用 MIME 类型 application octet stream 传输 Content Fonts iconFont ttf 即使我有此警告它也有效 但我更愿意避免此警告 这里是
  • Gmail删除链接标签,如何避免这种情况

    我正在尝试使用函数 mail 发送包含链接的富文本 我正在发送这种代码 Please access a href http www site md contact en Contact a to send all these informa
  • 从 SQL 脚本在 H2 数据库中插入长文本

    我正在尝试使用 H2 的 runscript 运行 sql 脚本 其中一个表包含一个长文本类型 用于存储 xml 文档 来自 SAP 数据库 因此 Insert 语句包含较长的 XML 文本 大约 200 行 XML 这相当难看 但仍然可以
  • 如何让 2 个 div 继承父 div 中具有更高高度的 div 的高度?

    我在匹配父 div 内 2 个 div 的高度时遇到问题 我很难解释我是在 Jsfiddle 上做的 http jsfiddle net DSQpd http jsfiddle net DSQpd 基本上 我想做的是匹配高度 无论哪一个更长
  • 将字符串拆分为单词并与其他数据重新连接

    我有一个使用的方法Regex寻找文本中的模式string 它可以工作 但不足以继续下去 因为它需要文本出现在确切的顺序 而不是将短语视为一组单词 public static string HighlightExceptV1 this str
  • 使用 python 将数据从 xml 文件填充到 sqlite 数据库

    我有一个与解决问题的一些指南相关的问题 我有一个 xml 文件 我必须使用脚本语言将其填充到数据库系统 无论如何 它可能是 sqlite mysql 中 Python 有人知道如何继续吗 我需要进一步阅读哪些技术 我必须安装哪些环境 有关于
  • CFWheels网站根目录的不同重写模式

    我需要关于研究以下问题的建议 车轮网站有set URLRewriting On 配置完毕 除了根页面之外 一切看起来都很好 所有链接均使用linkTo看起来像website tld controller action 但是在 模式下 切换
  • WeakHashMap 是否会不断增长,或者是否会清除垃圾键?

    我正在尝试使用WeakHashMap https docs oracle com javase 10 docs api java util WeakHashMap html作为并发Set https docs oracle com java