我正在探索Java中的一些东西,但我记忆有限。我通过查看占用率统计来处理这个问题,当我超过80%(比如说)停止分配树的新位以避免OutOfMemory时。并且使用我迄今为止使用20%的空间来计算。
然后我不时地决定向下移动树。这个应该释放我已分配的树的90%,因为我忘记了旧根并移动到其中一个孩子。它确实释放了那个记忆,但只有当我调用System.gc()时才会释放它,这是邪恶的并且阻止了我的世界。但如果我不打电话给gc(),我的限制代码会阻止我添加到我的树上。
我想要做的就是召集G1或CMS收藏家,我可以真正做到老一代得到一个干净的,并继续计算并分配树的新位,因为收集器做了它#s工作。
有什么想法可以实现吗?或者,同样有帮助的是,我如何避免这种人为的80%限制,这是我问题的根源。
答案 0 :(得分:0)
如果您调用-XX:+ExplicitGCInvokesConcurrent
System.gc()
应触发并发周期
或者你可以使用-XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly
用于CMS,一旦堆达到该阈值就会启动并发周期,因为你的目标是80%+占用基本上会持续消耗CPU时间(可能受{{1我不确定这些目标如何相互影响)清理老一代,从而迅速释放记忆。
G1GC(GCTimeRatio
)的等效参数已默认为45%,因此如果已达到该点,它应该已经在运行混合收集周期。您应该检查GC日志以进行验证。
或者,同样有帮助的,我如何避免这种人为的80%限制,这是我问题的根源。