2013-03-07 55 views
2

我正在使用Oracle 1.7.0_10 VM来运行我正在运行的高性能Java应用程序。我花了很多时间在HPROF分析器上查看内存分配情况,因为它正在执行大量的GC(通过-verbose:gc output测量)。现在,我的配置很少,但GC仍然运行频繁,工作量很少,需要很长时间。例如,这里的一些输出我得到了不使用特殊的GC选项(-verbose:gc -XX:+PrintGCDetails -Xmx4g):为什么垃圾回收器继续在JDK 1.7中运行?

[GC [PSYoungGen: 21197K->96K(1228224K)] 420220K->399118K(2045440K), 0.0081950 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[Full GC (System) [PSYoungGen: 96K->0K(1228224K)] [ParOldGen: 399022K->394779K(817216K)] 399118K->394779K(2045440K) [PSPermGen: 10758K->10758K(21248K)], 0.1503380 secs] [Times: user=0.89 sys=0.00, real=0.15 secs] 

[GC [PSYoungGen: 21195K->128K(1238592K)] 415974K->394907K(2055808K), 0.0061850 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[Full GC (System) [PSYoungGen: 128K->0K(1238592K)] [ParOldGen: 394779K->394779K(817216K)] 394907K->394779K(2055808K) [PSPermGen: 10758K->10758K(21248K)], 0.2534350 secs] [Times: user=1.71 sys=0.01, real=0.25 secs] 

这些通用的消息时2.5秒挂钟时间重复做10次 - 根据他们的大致250毫秒计时,这是所有的进程似乎在这段时间内(我明白它可能会在另一个线程上做一些工作)。令我困惑的是,似乎没有太多工作要做。看看这些信息,所有这些年代似乎都有足够的空间 - 杨为21Mb-> 0,但分配了1.2G,老一代的规模几乎没有变化,远低于门槛。

鉴于此,为什么GC会频繁运行?而且它似乎也没有反正它应该需要250毫秒的核心i7上没有别的运行来清理这么小的内存。

我试过其他GC参数,但没有一个似乎有影响。不幸的是,由于我的应用程序使用了1.7个特定功能,因此我无法在其他虚拟机中运行。

回答

6

鉴于此,GC为何频繁运行?

“全GC (系统)”通常表明你的应用程序已经明确要求垃圾收集致电Runtime.getRuntime().gc()System.gc()来运行。

因此,您可能需要仔细检查您的代码。

而且,看Does java garbage collection log entry "Full GC (System)" mean some class called System.gc()?

+0

非常感谢 - 我用相当多的内部图书馆,事实证明他们中的一个有一个的System.gc()。删除后,额外的GC呼叫消失,我的运行时间下降30%。 – user2144429 2013-03-07 14:35:49

+1

您可以使用-XX:+ DisableExplicitGC让JVM忽略System.gc() – 2013-03-08 16:19:16