【问题标题】:Does full garbage collection occur without old gen collection being full是否会在旧代收集未满的情况下进行完整的垃圾收集
【发布时间】:2013-10-10 14:26:20
【问题描述】:
我有三个关于垃圾回收的问题
我正在尝试研究我的应用程序中的垃圾回收,我注意到发生了完整的 GC。通过研究 GC 日志,我可以发现 old gen 甚至没有使用分配给它的一半内存。那为什么会发生full GC。 JVM 是否使用了其他算法来释放内存,即使老一代没有被完全利用?
什么可以称为良好的 GC 趋势。我的意思是,如果每 10-15 分钟发生一次完整的 GC,我可以调用应用程序使其处于良好状态。我想知道一个应用程序的理想 GC 应该是怎样的。我知道这在很大程度上取决于应用程序,但应该有一些可以称为理想的东西。
- 我没有设置 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 将负责您的世代的大小。