2013-07-09 43 views
0

我开始一个Java程序:为什么有完整的GC?

java -cp -Xms6072m -Xmx6072m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:-DisableExplicitGC 

但也有太多的全部GC?

2013-07-09T18:16:42.215+0800: [Full GC [PSYoungGen: 11987K->0K(1972032K)] [PSOldGen: 333076K->150949K(408768K)] 345063K->150949K(2380800K) [PSPermGen: 44430K->44430K(262144K)], 0.4696770 secs] [Times: user=0.47 sys=0.00, real=0.47 secs] 

2013-07-09T18:16:58.696+0800: [Full GC [PSYoungGen: 12357K->0K(2029568K)] [PSOldGen: 386748K->118215K(383232K)] 399105K->118215K(2412800K) [PSPermGen: 44430K->44430K(262144K)], 0.5117670 secs] [Times: user=0.51 sys=0.00, real=0.51 secs] 

我不知道为什么!任何人都可以帮助我?

+2

两个完整的GC相隔16秒是“太多”了吗? –

+0

尝试-XX:MaxPermSize = 512m或更高 –

+0

尝试'-Xmx * highvalue *',也请阅读[this](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523) .html) – NINCOMPOOP

回答

1

根据您选择的垃圾收集器,垃圾收集不仅发生在内存已满时。他们可以由各种事件/州触发。不知何故,Garbace Collector认为这是开始运行垃圾回收的合适时机。

试着找出你正在使用的垃圾回收器的特性。防止垃圾收集可能非常棘手,没有任何进一步的信息很难给出任何建议。很少情况下,垃圾收集是任何问题的真正原因。通常垃圾收集在实时应用程序中非常重要。它在最后输出的时间的半秒很可能是整个垃圾收集所花费的时间。通常只有一小部分是应用程序暂停的时间。

1

我不知道什么是“太多”的意思,但我相信这样的意图:

-XX:-DisableExplicitGC

是禁用显式垃圾收集,即调用System.gc ()或Runtime.getRuntime()。gc()。如果是这样的意图,减号是错误的,它应该是:

-XX:+ DisableExplicitGC

1

根据你的命令行,你堆的几何形状:

  • 旧空间:4吉布
  • 杨空间:2吉布(1.5吉布伊甸+ 0.5 2GB的幸存者中,如果缺省比值适用)

根据你的GC日志中,当第一完整GC正在发生

  • 旧空间具有3.3吉布(4 GIB)
  • 年轻空间1.1吉布(2 GIB)

当JVM启动年轻GC,它必须确保它有足够的可用空间在旧的容纳促进对象。

不幸的是,你没有包含小的GC记录,所以我必须进一步推测。

JVM看到数据的1.1 2GB的年轻空间,只有约0.7吉布的旧空间的自由空间,所以在容纳推广对象也可能没有足够的自由空间。这可能是启动完整GC的原因。

但是为什么年轻的GC在这个时候触发了,如果伊甸园有足够的空间?
下面是几个可能的原因:

  • 自适应大小的政策可能会推卸伊甸园(1。5吉布到〜1GiB)
  • 分配大阵可能引发年轻GC(成为全GC)

同时请注意,-XX:-DisableExplicitGC标志没有作用(减而不是加号),所以这一切的怪异行为可能由System.gc()