4

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

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

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

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

1 回答 1

1

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

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

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

--

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

--

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

于 2013-10-11T06:44:08.543 回答