如何估计JVM是否有足够的可用内存用于特定的数据结构?
我有以下情况:有几台机器形成一个集群。客户端可以加载数据集,我们需要选择将加载数据集的节点,如果没有一台机器可以容纳数据集,则拒绝加载/避免OOM错误。
我们目前做什么:我们现在在数据集中并估计为(手动确定)。然后检查这是否低于可用内存(已获得),如果是,则加载它(否则在其他节点上重做该过程/报告没有可用容量)。entry count
memory to be used
entry count * empirical factor
Runtime.freeMemory()
这种方法的问题在于:
- 需要手动重新访问和更新
empirical factor
-
freeMemory
有时可能会因为一些未清理的垃圾而漏报(这可以通过在每次此类调用之前运行来避免,但是这会减慢服务器的速度,并且还可能导致过早升级)System.gc
- 另一种方法是“只是尝试加载数据集”(如果抛出OOM,则退出),但是一旦抛出OOM,您可能会损坏在同一JVM中运行的其他线程,并且没有从中恢复的优雅方法。
有没有更好的解决方案来解决这个问题?