常量垃圾收集Java

时间:2015-03-17 02:41:22

标签: java garbage-collection

我查看我的应用程序日志并看到以下内容:

163.029: [GC163.029: [ParNew: 545354K->8K(613440K), 0.0421560 secs] 547578K->2232K(20903424K), 0.0422630 secs] [Times: user=0.27 sys=0.03, real=0.04 secs]
164.014: [GC164.014: [ParNew: 545352K->6K(613440K), 0.0438010 secs] 547576K->2230K(20903424K), 0.0439220 secs] [Times: user=0.30 sys=0.00, real=0.04 secs]
164.995: [GC164.996: [ParNew: 545350K->10K(613440K), 0.0350310 secs] 547574K->2234K(20903424K), 0.0351570 secs] [Times: user=0.27 sys=0.00, real=0.04 secs]
165.967: [GC165.967: [ParNew: 545354K->8K(613440K), 0.0532350 secs] 547578K->2232K(20903424K), 0.0533560 secs] [Times: user=0.39 sys=0.00, real=0.06 secs]
166.946: [GC166.946: [ParNew: 545352K->10K(613440K), 0.0308930 secs] 547576K->2234K(20903424K), 0.0309980 secs] [Times: user=0.25 sys=0.00, real=0.03 secs]
167.919: [GC167.919: [ParNew: 545354K->12K(613440K), 0.0393180 secs] 547578K->2236K(20903424K), 0.0394180 secs] [Times: user=0.30 sys=0.00, real=0.04 secs]
168.890: [GC168.890: [ParNew: 545356K->4K(613440K), 0.0449310 secs] 547580K->2230K(20903424K), 0.0450500 secs] [Times: user=0.31 sys=0.00, real=0.04 secs]
169.869: [GC169.869: [ParNew: 545348K->4K(613440K), 0.0422740 secs] 547574K->2230K(20903424K), 0.0423800 secs] [Times: user=0.26 sys=0.02, real=0.04 secs]
170.850: [GC170.850: [ParNew: 545348K->4K(613440K), 0.0434500 secs] 547574K->2230K(20903424K), 0.0435570 secs] [Times: user=0.31 sys=0.00, real=0.04 secs]

有足够的内存(我只使用2.6%的内存)

什么可能导致这种行为?我正在使用此命令

     java -Xss515m -Xms20g -Xmx20g -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar

2 个答案:

答案 0 :(得分:1)

鉴于HotSpot使用ephemeral GC,常见的垃圾收集是正常且无害的。这只意味着伊甸园一代已经耗尽空间而且正在被收集,这通常非常快 - 几乎不可察觉。

因此,垃圾收集的频率主要与您的分配带宽有关,而不是与使用中的内存量相关"。错误在于认为它不好,而实际上它是GC的设计和工作方式。

答案 1 :(得分:1)

所有现代Java GC都具有世代结构。

如果您使用Oracle Hotspot,那么您拥有:Young generation,Old generation和GC版本的PermGen(直到7版)或Metaspace(8版)

年轻一代通常比旧一代小,因为它的收藏应该很快完成。

如果要减少次要集合的数量而不是将 -Xmn param设置为更大的值 (例如 -Xmn1G )。