【问题标题】:Can Java's HashMap overflow silently?Java的HashMap可以静默溢出吗?
【发布时间】:2014-12-26 19:21:42
【问题描述】:

在 Java 中,java.util.HashMap<Key, Value> 是否可以静默溢出,从而在我没有收到异常或其他通知的情况下删除内容?如果是,我如何让它引人注目?

我的意思是它能否超过物理硬件内存,而不是为HashMap 对象保留的内存。

【问题讨论】:

  • 这没有意义。 HashMaps 的大小动态增长,并且没有限制。每个值都有一个特定的键,除非您自己将其删除,否则它将保留在那里(除非您使用WeakHashMap,如果对该项目的唯一引用是地图,则将从地图中删除内容)

标签: java memory-management hashmap overflow


【解决方案1】:

来自docs

当哈希表中的条目数超过 负载因子和当前容量,哈希表被重新散列 (即重建内部数据结构),使哈希表 大约有两倍的桶数

HashMap 永远不会“溢出”,它只会调整大小。这种情况会反复发生,直到内存不足,这将导致very loud error

【讨论】:

    【解决方案2】:

    不,HashMaps 不会自动驱逐元素。如果桶太满,桶会被扩展,所有元素都会自动重新散列。

    【讨论】:

    • 我的意思是如果它超出了物理硬件内存,而不是为 hashmap-object 保留的内存。
    • @DBRN 然后你会收到一个OutOfMemoryError,你的生活会很糟糕。但是您的 HashMap 仍然不会丢失元素。此外,在达到这一点之前,您的 GC 将持续 100% 运行以尝试释放内存,并且您的程序将非常缓慢......
    • 所以不可能不抛出 OutOfMemoryError 或不可见?
    • 一个OutOfMemoryError 确实会被抛出。理论上,代码可以捕获它,但是捕获任何类型的Errors 都是不好的做法,所以不要这样做。
    【解决方案3】:

    其他答案是正确的,但有一个奇怪的边缘情况。请参阅Theoretical limit for number of keys (objects) that can be stored in a HashMap? 以及有关当Map 中的条目多于Integer.MAX_VALUE 时会发生什么的讨论。

    因此,理论上这是可能的 - 如果你设法打破了这个限制(这几乎是不可能的)并且 JVM 在处理这么多对象时幸存下来(这几乎是不可能的)并且您的程序在该限制中幸存下来(这几乎是不可能的),那么不仅物体似乎会开始从您的Map 中消失,而且您将在Milliways 为自己赢得早餐,其中 如果你今天早上做了六件不可能的事情,为什么不在 Milliways 餐厅享用早餐,宇宙尽头的餐厅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多