增加可用的内核和内存会导致JVM执行更多的垃圾回收吗?

9
我正在升级生产硬件,我们在新的套件上看到了比旧的更多的young-gen GC。 相同的程序在两台机器上运行(二进制完全相同)。一个显而易见的区别(我希望这不会对JVM产生影响)是我们已经升级了RHEL5 - > RHEL6。 我们的JVM(Java 64位Hotspot 1.6,java-version在两个版本上都相同)使用相同的命令行GC选项运行:
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseParallelGC -XX:+UseCompressedOops

另外:

-Xmx1024M -Xms1024M -XX:NewSize=512M -XX:SurvivorRatio=2

这两台机器的区别在于新机器的RAM大约是旧机器的两倍(32gb-尽管最大堆大小未变),同时拥有更多的核心(24 vs. 16)。

该应用程序连接到多个外部进程并执行大量网络操作,因此这可能表明存在一些退步、配置错误或不兼容性(这就是我们进行测试的原因...)。我想知道的是:

在更多的核心上运行时,年轻代GC的增加是否可能是自然和预期的后果,或者我应该对这种情况感到担忧?

我们在JConsole中确认了GC的数量,但与执行以下操作相同:

grep "PSYoungGen" ./log | wc -l 

(注意 -XX:+PrintGC -XX:+PrintGCDetails)

两个服务器上的Full GC看起来差不多。

请注意,这里的GC次数是整个应用程序启动过程中的次数,因此它并没有执行"更多的工作"。是相同的工作,只是进行了更多的垃圾回收运行。

我曾经想知道,例如是否使用-XX:+UseParallelGC会导致日志中出现大量的条目,因为使用了更多的线程(将young-gen collections分解成更小的部分,意味着有更多、更小的collections-这不是需要担心的事情)。


4
更多的核心 -> 每秒更多的计算量 -> 每秒更多的垃圾回收。 - Marko Topolnik
两台机器上的JVM版本是否相同?(1.6x64) - assylias
@assylias 同样的 JVM 在两个程序中运行(问题已更新)。 - jelford
1
它也是相同的操作系统吗? - NG.
显示剩余2条评论
2个回答

1

令人困惑的问题...

简短回答

不,GC频率只取决于您的创建速率。除非您的应用程序利用了这个新硬件,否则GC频率应该是相同的。

详细回答

我认为这与操作系统升级无关,增加总内存也与此无关。

它不能来自指针大小的增加,因为最大堆大小为1GB。因此,即使您使用64位JVM,JVM已经使用32位指针。

您的应用程序在启动期间是否使用了所有核心?

这可能解释了YoungGC率的增加:如果您的应用程序使用了8个以上的线程,则意味着它将在同样的时间内执行更多的工作。您应该观察到分配率的增加(请参阅GC日志)。

您还应该注意到Young GC持续时间的下降,因为PSScavenge使用更多的线程。这是正确的吗?

根据此页面ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8)。您之前在YGC周期中使用了13个线程,现在正在使用18个线程。

线程数量是由http://www.c0t0d0s0.org/archives/6617-About-Java,-parallel-garbage-collection-and-processor-sets.html证实的。但奇怪的是,在相同的工作量下,有更多的GC(我*认为* - 可能是某些第三方库偷偷地生成了线程)。 - jelford
你真的需要比较升级前和升级后的分配率,以确认这个“相同工作量”的事情。如果你之前的分配率是500MB/s,现在是750MB/s,你的GC将必须更频繁地进行,以满足应用程序的需求。 - Pierre Laporte
我是否可以通过 AR = GCs * Eden Space / #seconds 进行测量? 如果是这样,那么由于Eden Space未更改,GC计数更高,则必须更多。 我错过了什么吗? - jelford
AR = ((当前GC前堆占用 - 上次GC后堆占用) / (当前GC时间戳 - 上次GC时间戳)). 您应该使用类似HPJMeter的日志查看器来自动计算此值。 - Pierre Laporte
接受了这一点 - 正如您所指出的那样,更多的GC可能意味着更多的工作。事实证明,它正在做更多的工作;在PROD中清除的已持久化状态在暂存中被重新加载。大约有7GB的数据(只要处理完就全部丢弃,这就是为什么它不明显的原因)。 - jelford

-3

这取决于您的操作系统架构(x64或x86),使用x86时,JVM可以达到4GB,而使用x64时,它可以达到2GB(RAM数量)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接