【问题标题】:Garbage collection for a simulation that creates a lot of instances用于创建大量实例的模拟的垃圾收集
【发布时间】:2022-01-22 20:45:37
【问题描述】:

我正在创建一个落沙游戏。这意味着会有很多实例代表每个单独的元素,并且很多元素将被销毁。

这将是一个二维数组,例如 Element[][]。

我是用 Java 编写的,所以当我删除一个元素(从二维数组中取消分配它)时,它仍然会保留在内存中,直到垃圾收集。最终内存会逐渐增加,直到垃圾收集开始,这会冻结游戏。

我想避免任何冻结,并且希望内存使用量可以保持较低。如果垃圾收集器可以定期或类似地运行,则可能会起作用。

总的来说,如果我无法解决这个问题,我不确定我的应用是否可以在 Java 中实现。

是否有适合这种情况的首选垃圾收集器或我可以用来处理此问题的任何其他方法?

【问题讨论】:

    标签: java memory garbage-collection


    【解决方案1】:

    JVM 不允许您按需运行垃圾收集。您可以尝试调用System.gc(),但它只会建议(如documentation 中所述)JVM 运行FullGC。

    JVM 提供了多种收集器

    Serial 和 parallel 收藏家使用 Stop The World 方法,因此他们会在运行时冻结您的游戏。

    G1 收集器尝试在延迟和吞吐量之间取得平衡。

    我从您的问题了解到您正在寻找低延迟垃圾收集,因此用户不会注意到暂停。我会推荐其中一位收藏家

    因为他们声称具有亚毫秒级暂停的低延迟。

    使用 JVM,您将无法避免 gc 暂停。它们最终会发生,但选择正确的 GC 可以减少它们的持续时间和发生率。所以也许 Java 不适合这个用例。

    关于保持低内存使用率,这取决于您。垃圾收集不能帮助你。分配对象时要非常小心。

    【讨论】:

    • 谢谢,这很有帮助。我认为使用 ZGC 或类似方法以及对象池的组合可以很好地工作。我可以使用 SoftReferences 将所有“被破坏”的元素存储在缓存中以供重复使用,以避免内存不足错误的风险。
    • 当心对象池会使事情变得更糟......因为SoftReferences 给垃圾收集器带来了额外的负担。 JVM 必须在主 GC 运行后处理它们,这可能是一个瓶颈。它们还可能导致通常寿命很短的对象被终身使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2016-02-04
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多