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

标签 java garbage-collection

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

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

我想做的是调用 G1 或 CMS 收集器,我确实可以通过老一代进行清理,并在收集器完成其工作时进行计算并分配树的新位。

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

最佳答案

如果调用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 无论如何都需要一些喘息空间才能高效工作
  • 考虑使用软引用来保存有用但可以在需要时被 GC 丢弃的数据。但它们不是免费的,所以看看额外的费用是否值得。

关于java - 鼓励 Java 中的主要 GC(但不是 STW GC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019031/

相关文章:

java - 如何实现没有标签的自定义菜单?

java - 从堆栈写入文件

java - 部署的 EAR 中的配置文件修改

java - JVM - 弱引用是否在次要 GC 中收集?

pointers - 垃圾收集与共享指针

memory-management - RCU 作为传统垃圾收集的替代方案

PHP 垃圾回收

c# - MediaPlayer 中的内存泄漏

java - 如何获取 onActivityResult 中的上下文?

java - 为什么 getSimpleName() 在 com.sun.tools.javac.tree.JCTree$JCClassDecl 中是两次