2009-04-14 30 views
8

当更多内存可用并通过-Xmx使用时,Sun JVM是否会减速? (假设:机器有足够的物理内存,以便虚拟内存交换不成问题。)当通过-Xmx分配更多内存时,Sun JVM会减慢吗?

我问,因为我的生产服务器要接收内存升级。我想将-Xmx的值提高到decodent。这个想法是为了防止由于我自己的编程错误而导致的任何堆空间耗尽失败。罕见的事件,但如果我有一个淫秽-Xmx值(如2048mb或更高),则可以通过快速发展的Web应用程序避免它们。应用程序受到严密监控,所以JVM内存消耗中的异常峰值将被注意到并修复任何缺陷。

可能的重要的细节:

  • 爪哇6(runnign在64位模式下)
  • 4核至强
  • RHEL4 64位
  • 弹簧,休眠
  • 高磁盘和网络IO

编辑:我试图避免发布我的JVM的配置,但很明显,这使得这个问题可笑地公开结束。所以,在这里我们去与相关的配置参数:

-Xms256m 
-Xmx1024m 
-XX:+UseConcMarkSweepGC 
-XX:+AlwaysActAsServerClassMachine 
-XX:MaxGCPauseMillis=1000 
-XX:MaxGCMinorPauseMillis=1000 
-XX:+PrintGCTimeStamps 
-XX:+HeapDumpOnOutOfMemoryError 

回答

6

通过增加更多的内存,堆将需要更长的时间才能填满。因此,它会减少垃圾收集的频率。然而,根据你的物体的死亡程度,你可能会发现做单个GC需要多长时间。

GC需要多长时间的主要因素是有多少个个对象。因此,如果几乎所有的物体都会年轻化,并且一旦建立起来,它们都不会逃过这个年轻的堆,但是您可能没有注意到做GC的时间需要多长时间。但是,无论何时你必须循环使用终身堆,你可能会发现所有的事情都会停止,因为这些对象中的大部分仍然存在。相应地调整大小。

0

更多内存通常让你在垃圾回收的环境中更好的表现,至少只要这不会导致虚拟内存使用/交换。

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

我不确定是否还有64位的服务器和客户端虚拟机(有32位),所以你可能也想调查一下。

+0

感谢输入,但我相信我的其余配置还是不错的。而且,即使它有缺陷,我也想把这个问题放在“所有事情都是平等的......” – 2009-04-14 19:26:05

+0

叹息......显然我必须更多地泄露这个问题。 :) – 2009-04-14 19:44:43

4

如果您只是在该问题上投入更多内存,则应用程序中的吞吐量会更高,但如果您不在使用CMS垃圾回收器的多核系统上,则响应速度可能会降低。这是因为更少的GC会发生,但他们会有更多的工作要做。好处在于你可以获得更多的内存释放,所以分配将继续非常便宜,因此获得更高的吞吐量。顺便说一下,你好像很容易混淆-Xmx和-Xms。 -Xms只是设置初始堆大小,而-Xmx是最大堆大小。

+0

不,我没有混淆这两个参数:)我只是认为这是所有相关时最初发布的问题 - 自更新。感谢您的输入! – 2009-04-14 19:47:29

0

根据我的经验,它不会放慢速度,但JVM总是试图一直切回到Xms并尝试保持在较低的边界或接近。所以如果你可以付出努力,也会碰撞Xms。 Sun推荐两个尺寸相同的尺寸。添加一些-XX:NewSize = 512m(只是一个编号)以避免旧一代旧数据的昂贵堆积,从而导致较长/较重的GC。我们使用700 MB NewSize运行我们的Web应用程序,因为大多数数据都是短暂的。

所以,底线:我不指望放慢速度,而是让更多的内存工作。设置一个更大的新尺寸区域并将Xms设置为Xmx以降低GC上的压力,因为它不需要尝试减少到​​Xms限制...

0

它通常不会帮助您的性能/吞吐量,如果你增加-Xmx。 从理论上讲,可能会有更长的“停止世界”阶段,但在实践中与CMS不是一个真正的问题。

当然,你不应该设置-Xmx像300Gbyte一些疯狂的价值,除非你真的需要它:)

相关问题