当通过-Xmx分配更多内存时,Sun JVM会减慢吗?

11
当使用-Xmx参数增加可用内存时,Sun JVM会变慢吗?(假设机器有足够的物理内存以避免虚拟内存交换问题。)我问这个问题是因为我的生产服务器将进行内存升级。我想将-Xmx值增加到一些“奢侈”的值。目的是防止由于我自己的编程错误而导致堆空间耗尽失败。这是罕见的事件,但如果我有一个像2048mb或更高的过分的-Xmx值就可以避免。该应用程序受到密切监控,因此会注意到JVM内存消耗异常的峰值并修复任何缺陷。
可能的重要细节:
- Java 6(运行在64位模式下) - 4核Xeon处理器 - RHEL4 64位 - Spring,Hibernate - 高磁盘和网络IO
编辑:我试图避免发布我的JVM配置,但显然这使得问题变得非常开放。因此,以下是相关的配置参数:
-Xms256m 
-Xmx1024m 
-XX:+UseConcMarkSweepGC 
-XX:+AlwaysActAsServerClassMachine 
-XX:MaxGCPauseMillis=1000 
-XX:MaxGCMinorPauseMillis=1000 
-XX:+PrintGCTimeStamps 
-XX:+HeapDumpOnOutOfMemoryError 
5个回答

6
通过增加内存,堆空间填满所需的时间将更长。因此,它将减少垃圾回收的频率。但是,根据对象的生命周期长短,您可能会发现单个GC执行时间变长。
决定GC执行时间的主要因素是活动对象的数量。因此,如果几乎所有对象的生命周期都很短,并且一旦对象进入老年代就不再逃逸到年轻代,那么您可能不会注意到执行GC所需时间的太大变化。但是,每当必须循环老年代时,您可能会发现由于大多数这些对象仍然存在,所有内容都会停止运行过长时间。请相应地调整大小。

谢谢。从我编辑过的问题中可以看出,我已经设置了GC持续时间的最大值。虽然我知道可以调整老年堆等参数,但在“过早优化”的幌子下,我还没有去那里。但也许这是有意义的...我感觉又要提一个SO问题了! - Stu Thompson

4
如果你只是为问题添加更多的内存,你的应用程序吞吐量会更好,但如果你不在使用CMS垃圾收集器的多核系统上,响应能力可能会降低。这是因为GC的次数会减少,但它们需要做更多的工作。好处是,你将获得更多的内存释放,因此分配将继续非常便宜,从而提高了吞吐量。
顺便说一下,你似乎混淆了-Xmx和-Xms。-Xms只设置初始堆大小,而-Xmx是最大堆大小。

不,我没有混淆这两个参数 :) 我只是当初发布问题时认为这是所有相关的内容--现在已经更新。感谢您的回答! - Stu Thompson
@Stu Thompson:但是你似乎在交替使用这两个词,所以很难确定你指的是哪一个。 - Michael Myers
1
糟糕。你是对的。我打错了一个字母,应该是'Xmx'而不是'Xms'。请原谅我的错误。 - Stu Thompson

0

在垃圾回收的环境中,更多的内存通常会给您带来更好的性能,至少在这不会导致虚拟内存使用/交换的情况下。

GC仅跟踪引用,而不是内存本身。最终,VM将分配相同数量的(大多数是短暂的临时)对象,但垃圾收集器需要调用的次数较少 - 因此垃圾收集器的总工作量也不会更多 - 甚至更少,因为这也可以帮助使用弱引用的缓存机制。

我不确定64位系统是否仍有服务器和客户端VM(32位系统有),因此您可能还需要进行调查。


谢谢您的建议,但我相信我的其余配置是正确的。即使有缺陷,我也希望将这个问题保持在“一切都平等”的范畴内。 - Stu Thompson

0
根据我的经验,它不会变慢,但JVM会一直尝试削减到Xms并尽量保持在较低的边界或接近边界。因此,如果您能够承受,也可以提高Xms。Sun建议两者大小相同。添加一些-XX:NewSize = 512m(只是一个虚构的数字),以避免旧数据在老年代中积累导致更长/更重的GC。我们正在使用700 MB NewSize运行Web应用程序,因为大多数数据都是短暂的。
因此,底线是:我不认为会变慢,但要让更多的内存发挥作用。设置较大的新大小区域,并将Xms设置为Xmx,以降低GC的压力,因为它不需要尝试削减到Xms限制...

0

如果你增加-Xmx,通常不会提高性能/吞吐量。理论上可能会有更长的“停顿时间”,但在实践中,使用CMS并不是真正的问题。

当然,除非你真的需要,否则不应将-Xmx设置为像300G字节这样疯狂的值 :)


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