栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是WeakHashMap不断增长,还是清除垃圾密钥?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是WeakHashMap不断增长,还是清除垃圾密钥?

是的, 实际收集垃圾 之后 清除了密钥

是的,

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上实时运行。

添加前大小:0

添加4个项目后的大小:4

移除项目3后的尺寸:3

制作项目#2的垃圾后的尺寸:2

在我的情况下,使用Java的10.0.2版本的OpenJDK基础的祖鲁JVM从阿祖尔系统,垃圾收集器似乎在我的请求被激活。如果我将延迟或

System.gc
通话延迟一秒钟,那么报告的最后一个大小将保持不变,
3
而不是预期的大小
2

您甚至可以在IdeOne.com上实时运行此代码时看到此行为。请注意,下面的最后一项是,

3
但是上面的是
2

添加前大小:0

添加4个项目后的大小:4

移除项目3后的尺寸:3

制作项目#2的垃圾后的尺寸:3



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号