hashmap大小

最近,我偶然发现了一个错误,该错误是由于多个线程对java.util.HashMap的使用不当引起的。 该错误是泄漏抽象的一个很好的例子。 只有了解数据结构的实现级别详细信息,才能帮助我解决当前的问题。 因此,我希望与他人分享我所遇到的问题,以鼓励一些读者熟悉基本数据结构的实现方式。

在一天中,通常仅需几分钟即可完成的某些分析过程已经运行了数小时,因此,我所面对的症状每天都变得丑陋。 作为我们技术的真正信奉者,我们通过自己的监控软件及时得到通知,并开始调查原因。

我还从处理线程中获得了几个线程转储。 他们指出,该代码只是在堆转储中发现的哈希图中处理条目,看似处于未终止的循环中。 因此,似乎正在分析的数据以某种方式损坏了,其中包含循环引用。

令我惊讶的是,确实如此。 分析的堆内容中的HashMap条目相互引用。 在设计堆分析算法时,我们从来没有想到这是可能的。 显然我们错了。

由于已知HashMap实现不是线程安全的,因此我现在怀疑它与HashMap使用的并发性问题有关。 实际上,在java.util.HashMap的设计中隐藏着一个问题。 如您所知, HashMap由存储区数组组成,每个存储区都引用一个链接的条目列表。 条目依次引用列表中的下一个条目,直到最后一个条目引用null:

我们的分析仪遇到的问题是,两个条目相互引用形成一个封闭的循环。

在Google的帮助下,我发现了最终如何创建这样的循环引用是多线程环境中的一个问题。 再次提醒您, HashMap在运行时会根据映射中的条目数动态调整大小。 默认情况下, HashMaps使用75%的负载率。 这意味着只要地图中的条目数超过可用容量的75%,地图大小就会增加,以避免在地图元素条目上发生太多冲突。

所以我在这里。 显然,有多个线程试图同时调整地图的大小,从而在某些存储桶中创建了一个循环。 罪魁祸首最终隐藏在Java HashMap源代码的以下几行中:

void transfer(Entry[] newTable, boolean rehash) {... skipped for brevity ...Entry next = e.next;if (rehash) {e.hash = null == e.key ? 0 : hash(e.key);}... skipped for brevity ...
}

现在,我们的分析端点解决方案非常简单。 我们只需要保留关于已处理条目的分类帐,而无需对所有条目进行两次处理即可。

我确实相信这可以作为失败抽象的一个很好的例子。 Java中的HashMaps构建良好,即使您不了解实现细节,也可以很好地为您服务。 直到他们不这样做。 在这种情况下,对数据结构实现细节的深入了解将为您带来一切不同。

翻译自: https://www.javacodegeeks.com/2016/08/resizing-hashmap-dangers-ahead.html

hashmap大小

hashmap大小_调整HashMap的大小:未来的危险相关推荐

  1. Win11如何调整任务栏大小 Win11调整任务栏大小的方法

    现在已经有很多小伙伴都已经安装Win11系统进行体验了,但有一些小伙伴在体验的时候想要更改任务栏大小却不知道如何操作,那么碰到这种问题应该怎么办呢?下面就和小编一起来看看有什么解决方法吧. Win11 ...

  2. 计算机桌面 文字大小,怎样调整电脑字体大小_怎样调整字体大小

    2017-01-08 11:04:56 桌面空白处击右键---属性---外观 然后会看到有一项:字体大小,选项有三,正常,大字体,特大字体.根据自己需要可以调整,显示框会出现预选效果.决定后,点击确定 ...

  3. linux分区设置大小,Linux调整磁盘分区大小

    Resize the disk (Linux调整磁盘分区大小) Resize the partition. Run parted: $ parted Show the partition list: ...

  4. MATLAB图形调整边框大小subplot调整空白区域大小

    来源 处理实验数据,由于很多个小类别,全部用个subplot绘制出来,发现两边的空白太多,想把两边空白删除.直接上图处理签和处理后的结果, 实验结果被我用hold off 取消掉了,不影响此处说明. ...

  5. cad连筋字体怎么安装_cad怎么调整标注文字大小-AutoCAD调整标注字体大小的方法...

    AutoCAD是一款十分好用的计算机辅助软件,该软件界面直观大方,给用户提供的暗黑色调界面更加利于工作,底部整体优化后的状态栏也更加实用便捷,功能十分强大,使用起来也很方便.我们在使用这款软件绘制CA ...

  6. 计算机怎么扩大某个盘的大小,怎么调整电脑磁盘大小

    想要调整电脑磁盘大小,但要怎么办呢,那么怎么调整电脑磁盘大小的呢?下面是学习啦小编收集整理的怎么调整电脑磁盘大小,希望对大家有帮助~~ 调整电脑磁盘大小的方法 工具/原料 已经备份的U盘 电脑 制作U ...

  7. linux lvm 调整分区大小,linux调整lvm分区大小(/home分区过大,/root分区过小)

    安装centos6.3使用自动推荐分区,发现一个问题/home 分区过大,超过了1.1T. [root@localhost ~]# df -h 文件系统              容量  已用  可用 ...

  8. 数组超过预设的最大数组大小_工作表数组大小的扩展及意义

    朋友们好,今日给大家继续讲解VBA数组与字典解决方案的第17讲,数组大小的扩充问题.这一讲的内容相对比较简单,在之前的章节中讲了数组与数组的计算规律,也是利用了数组的扩展原理. 其实,两个数组计算时, ...

  9. css让image不改变大小_如何改变图片大小

    我们进行网页设计的时候图片有时候可以会不符合大小,那我们怎么样才能在代码中实现图片大小的改变呢?本篇文章就来给大家介绍关于如何改变图片的大小? 我们改变图片的大小有两种方法:一种是在HTML标签内更改 ...

最新文章

  1. MapReduce实战--倒排索引
  2. 栈和队列的算法题总结
  3. boost::type_erasure::equality_comparable相关的测试程序
  4. webService学习4:客户端调用服务端的代码
  5. (Z)使用SignalTAP II为了避免某些节点被弄丢, 必须要关闭的编译选项
  6. 程序员幽默:39个奇葩代码注释,看完笑哭了
  7. 拓展欧几里得 [Noi2002]Savage
  8. vim 配置_模块化你的vim配置文件
  9. 有了这个王座,写代码的速度都加快了
  10. (cljs/run-at (JSVM. :all) 细说函数) 1
  11. 酒店结婚播放PPT模板
  12. 实现简单的中英互译的安卓App
  13. 阿里云服务器可以搭建游戏吗?
  14. 鲍斯科机器人_芜湖鲍斯柯机器人有限公司、上海富治机械科技有限公司服务合同纠纷二审民事判决书...
  15. Django:发送邮件
  16. 【Cactus仙人掌图】仙人掌DP学习笔记
  17. c语言 __at定位编译报错,david
  18. 这么优秀的Excel工具类,你难道不用?
  19. .Net读取post传递参数(body)小计
  20. ❤️数据可视化❤️:基于Echarts + GeoJson实现的地图视觉映射散点(气泡)组件【4】 - 广东省

热门文章

  1. P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)
  2. CF827F-Dirty Arkady‘s Kitchen【堆】
  3. Ch5501-环路运输【环形处理dp】
  4. 北方大学 ACM 多校训练赛 第十五场 买花
  5. 14、使用play搭建一个web应用用例
  6. SpringCloud Zuul(七)之POST Filter
  7. 紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人
  8. Java经典面试题一
  9. Java 线程池框架核心代码分析
  10. 多久没有给家里打过电话了?