是否完整垃圾收集没有旧的gen收集

时间:2013-10-10 14:26:20

标签: java garbage-collection

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

-

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

-

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