垃圾收集鼓励Java中的主要GC(但不是STW GC)
我正在探索Java中的一棵树,但内存有限。我通过查看占用率统计数据来处理这个问题,当我超过80%(比如说)时,停止分配新的树位以避免OutOfMemory。用我到目前为止得到的20%的净空来计算
然后我时不时地决定从树上下来。这个应该释放我分配的90%的树,因为我忘记了旧根并移到了它的一个子树上。它确实释放了内存,但前提是我调用系统。gc(),它是邪恶的,阻止了我的世界。但如果我不调用gc(),我的限制代码就会阻止我添加到树中
我想做的是向G1或CMS收集器发出呼吁,让老一代的收集器变得干净,并在收集器工作时继续计算和分配新的树位
有什么办法可以做到吗?或者,同样有帮助的是,我如何避免这种人为的80%限制,这是我问题的根源
# 1 楼答案
如果调用
System.gc()
,则设置-XX:+ExplicitGCInvokesConcurrent
应触发并发循环或者,您可以对CMS使用
-XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly
,一旦堆达到该阈值,它将启动并发循环,因为您的目标是80%以上的占用率,这将基本上持续消耗CPU时间(可能受到GCTimeRatio
的限制,我不确定这些目标如何交互),以清理旧一代,从而快速释放内存G1GC(
InitiatingHeapOccupancyPercent
)的等效参数已默认为45%,因此如果达到该值,它应该已经在运行混合收集周期。您应该检查GC日志以进行验证