gpt4 book ai didi

java - 如何估计 JVM 是否有足够的空闲内存用于特定的数据结构?

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:59 26 4
gpt4 key购买 nike

我有以下情况:有几台机器组成一个集群。客户端可以加载数据集,我们需要选择要加载数据集的节点,如果没有一台机器适合该数据集,则拒绝加载/避免 OOM 错误。

我们目前所做的:我们现在是数据集中的条目计数,并将要使用的内存估计为条目计数*经验因子 (手动确定)。然后检查这是否低于可用内存(通过 Runtime.freeMemory() 获得),如果是,则加载它(否则在其他节点上重做该过程/报告没有可用容量)。

这种方法的问题是:

  • 需要手动重新访问和更新经验因素
  • freeMemory 有时可能会因为一些未清理的垃圾而报告不足(这可以通过在每次此类调用之前运行 System.gc 来避免,但是这会减慢速度服务器,也可能导致过早晋升)
  • 另一种方法是“只尝试加载数据集”(如果抛出 OOM,则退出)但是一旦抛出 OOM,您可能会破坏在同一 JVM 中运行的其他线程,并且没有优雅的方式从中恢复过来。

这个问题有更好的解决方案吗?

最佳答案

经验因素 可以计算为构建步骤并放置在属性文件中。

虽然 freeMemory() 几乎总是小于 GC 后可用的数量,但您可以检查它是否可用并调用 System.gc() 如果 maxMemory() 指示可能有足够的内存。

注意:在生产中使用 System.gc() 只会生成 very rare situations通常,它经常被错误使用,导致性能下降并掩盖了真正的问题。

我会避免触发 OOME,除非您运行的是 JVM,您可以根据需要重新启动。

关于java - 如何估计 JVM 是否有足够的空闲内存用于特定的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36623608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com