鼓励Java中的主要GC(但不是STW GC)

时间:2015-08-14 21:38:52

标签: java garbage-collection

我正在探索Java中的一些东西,但我记忆有限。我通过查看占用率统计来处理这个问题,当我超过80%(比如说)停止分配树的新位以避免OutOfMemory时。并且使用我迄今为止使用20%的空间来计算。

然后我不时地决定向下移动树。这个应该释放我已分配的树的90%,因为我忘记了旧根并移动到其中一个孩子。它确实释放了那个记忆,但只有当我调用System.gc()时才会释放它,这是邪恶的并且阻止了我的世界。但如果我不打电话给gc(),我的限制代码会阻止我添加到我的树上。

我想要做的就是召集G1或CMS收藏家,我可以真正做到老一代得到一个干净的,并继续计算并分配树的新位,因为收集器做了它#s工作。

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

1 个答案:

答案 0 :(得分:0)

如果您调用-XX:+ExplicitGCInvokesConcurrent

,则设置System.gc()应触发并发周期

或者你可以使用-XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly用于CMS,一旦堆达到该阈值就会启动并发周期,因为你的目标是80%+占用基本上会持续消耗CPU时间(可能受{{1我不确定这些目标如何相互影响)清理老一代,从而迅速释放记忆。

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

  

或者,同样有帮助的,我如何避免这种人为的80%限制,这是我问题的根源。

  • 过度配置内存,RAM通常比开发人员小时便宜,而且GC需要一些喘息空间才能有效地工作
  • 考虑使用软引用来保留有用的数据,但如果需要可以由GC丢弃。它们不是免费的,所以看看额外的费用是否值得。