【问题标题】:Does full garbage collection occur without old gen collection being full是否会在旧代收集未满的情况下进行完整的垃圾收集
【发布时间】:2013-10-10 14:26:20
【问题描述】:

我有三个关于垃圾回收的问题

  1. 我正在尝试研究我的应用程序中的垃圾回收,我注意到发生了完整的 GC。通过研究 GC 日志,我可以发现 old gen 甚至没有使用分配给它的一半内存。那为什么会发生full GC。 JVM 是否使用了其他算法来释放内存,即使老一代没有被完全利用?

  2. 什么可以称为良好的 GC 趋势。我的意思是,如果每 10-15 分钟发生一次完整的 GC,我可以调用应用程序使其处于良好状态。我想知道一个应用程序的理想 GC 应该是怎样的。我知道这在很大程度上取决于应用程序,但应该有一些可以称为理想的东西。

  3. 我没有设置 NewSize 或 Newratio 属性。机器中默认的 NewRatio 似乎是 2。但我可以看到我的年轻一代只使用了 1/4 的堆大小,其余的被终身代使用。这怎么可能?我所定义的只是 Xmx 和 permsize。

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    主要收集可能有多种原因,在大多数情况下,您可以使用 jstat -gccause 来查看原因。

    其中几个原因是 -System.gc() 如果从您的应用程序或您使用并依赖此调用的任何其他代码调用。 -当达到旧的空间占用率时 -当 PermGen 收集发生时 - 根据您使用的收集器,CMSIncrementalMode 似乎会在老年代限制之前导致主要收集。

    很可能 System.gc() 是您意外的主要收集的原因,尝试使用标志 -XX:+DisableExcplicitGC 看看是否仍然得到它们。

    --

    没有一种趋势可以描述所有的用法。这应该基于您的需求。您的 GC 现在的工作方式是否会影响您的应用程序/服务的性能。您是否会遇到长时间停顿,从而降低您的吞吐量?你想达到什么目标?最重要的是你产生的垃圾是什么?尝试分析堆转储,看看是否可以在优化收集器之前以某种方式减少数量。

    --

    这取决于您使用的标志,您的操作系统等的 JVM 版本...一般来说 GC 人体工程学,更具体地说,选项 -XX:+UseAdaptiveSizePolicy 将负责您的世代的大小。

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多