gpt4 book ai didi

java - 架构:填充 Hashmap 时如何解决 GC 开销问题

转载 作者:行者123 更新时间:2023-11-30 07:28:54 24 4
gpt4 key购买 nike

在使用 >100000 个对象填充 HashMap 时,我收到超出 GC 开销限制的错误。

当我的程序启动时,它从 CSV 文件中读取键:值对。然后,它构建一个 HashMap ,其中包含作为键的字符串和每个值的对象哈希集。

保留这个方法很方便,因为最后我根据这些映射打印统计数据。

我看到几个选项:- 减小对象大小。会减少问题,但可能会持续存在更多对象。- 配置默认 map 大小和负载系数。与上面相同。- 增加堆大小。与上面相同。- 按顺序处理对象并丢弃。将解决问题,但会丢失对象的映射。- 将存储卸载到数据库?

非常感谢您的想法。

最佳答案

如果您可以增加堆大小,那将是第一步也是最简单的一步。

<小时/>

我还会尝试最大程度地减少初始填充期间 GC 收集的垃圾量。

尝试将初始大小设置为接近您期望的大小。 HashMap 在重新哈希/调整大小期间会生成大量垃圾,如果可能的话应该避免。由于 HashSetHashMap 支持,因此您应该对 HashSet 执行相同的操作。

(还值得注意的是,HashMap 将大小加倍,这通常不是问题,但如果您有一个非常大的数据集,需要的大小刚好超过调整大小阈值,那么它可能会分配双倍的大小需要内存。)

根据HashMap´s javadoc您应该使用 expectedSize/loadFactor 的初始大小来确保不会发生重新哈希/调整大小。 (如果您使用 0.75 的默认 loadFactor,则会产生比预期大小大 33.33333% 的最佳初始大小)

<小时/>

最后,如果堆大小要求最终对于您的设置来说太大,下一步就是查看内存外解决方案,例如 Ehcache 中的内存缓存。你可以configure to have a backing persistence storage if the cache takes too much memory

或者正如您在问题中所说,数据库。

关于java - 架构:填充 Hashmap 时如何解决 GC 开销问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36432082/

24 4 0
文章推荐: java - 如何将文本设置为禁用的 JTextArea
文章推荐: java - 如何修复我的合并排序?
文章推荐: javascript - 想要 : simple HTML file that does disclosure triangle
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com