有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

垃圾收集鼓励Java中的主要GC(但不是STW GC)

我正在探索Java中的一棵树,但内存有限。我通过查看占用率统计数据来处理这个问题,当我超过80%(比如说)时,停止分配新的树位以避免OutOfMemory。用我到目前为止得到的20%的净空来计算

然后我时不时地决定从树上下来。这个应该释放我分配的90%的树,因为我忘记了旧根并移到了它的一个子树上。它确实释放了内存,但前提是我调用系统。gc(),它是邪恶的,阻止了我的世界。但如果我不调用gc(),我的限制代码就会阻止我添加到树中

我想做的是向G1或CMS收集器发出呼吁,让老一代的收集器变得干净,并在收集器工作时继续计算和分配新的树位

有什么办法可以做到吗?或者,同样有帮助的是,我如何避免这种人为的80%限制,这是我问题的根源


共 (1) 个答案

  1. # 1 楼答案

    如果调用System.gc(),则设置-XX:+ExplicitGCInvokesConcurrent应触发并发循环

    或者,您可以对CMS使用-XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly,一旦堆达到该阈值,它将启动并发循环,因为您的目标是80%以上的占用率,这将基本上持续消耗CPU时间(可能受到GCTimeRatio的限制,我不确定这些目标如何交互),以清理旧一代,从而快速释放内存

    G1GC(InitiatingHeapOccupancyPercent)的等效参数已默认为45%,因此如果达到该值,它应该已经在运行混合收集周期。您应该检查GC日志以进行验证

    Or, equally helpful, how I could avoid this artificial 80% limit, that is the root of my problem.

    • 过度提供内存,RAM通常比开发人员的工作时间便宜,地面军事系统无论如何都需要一些喘息的空间来高效工作
    • 考虑使用软引用来保存有用的数据,但是如果需要,GC可以丢弃这些数据。他们不是免费的,所以看看额外的费用是否值得