Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当通过-Xmx分配更多内存时,Sun JVM会变慢吗?_Java_Jvm_Performance - Fatal编程技术网

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

Java 当通过-Xmx分配更多内存时,Sun JVM会变慢吗?,java,jvm,performance,Java,Jvm,Performance,当更多的内存可用并通过-Xmx使用时,Sun JVM会变慢吗?(假设:机器有足够的物理内存,因此虚拟内存交换不是问题。) 我这样做是因为我的生产服务器将要接受内存升级。我想把-Xmx的值提高到一些颓废的值。这个想法是为了防止由于我自己的编程错误而导致的堆空间耗尽故障。罕见的事件,但如果我有一个淫秽的-Xmx值,比如2048mb或更高,我的快速发展的webapp可以避免这些事件。该应用程序受到严格监控,因此JVM内存消耗会出现异常峰值,任何缺陷都会得到修复 可能的重要细节: Java 6(以64

当更多的内存可用并通过-Xmx使用时,Sun JVM会变慢吗?(假设:机器有足够的物理内存,因此虚拟内存交换不是问题。)

我这样做是因为我的生产服务器将要接受内存升级。我想把-Xmx的值提高到一些颓废的值。这个想法是为了防止由于我自己的编程错误而导致的堆空间耗尽故障。罕见的事件,但如果我有一个淫秽的-Xmx值,比如2048mb或更高,我的快速发展的webapp可以避免这些事件。该应用程序受到严格监控,因此JVM内存消耗会出现异常峰值,任何缺陷都会得到修复

可能的重要细节:

  • Java 6(以64位模式运行)
  • 四芯Xeon
  • RHEL4 64位
  • 春天,冬眠
  • 高磁盘和网络IO
编辑:我试图避免发布JVM的配置,但很明显,这让问题变得可笑地没有结尾。因此,我们来看看相关的配置参数:


在垃圾收集环境中,更多的内存通常会提供更好的性能,至少只要这不会导致虚拟内存的使用/交换

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


我不确定是否还有64位(32位)的服务器和客户机VM,因此您可能也要对此进行调查。

如果您只是在问题上投入更多内存,您的应用程序将有更好的吞吐量,但如果您不是在使用CMS垃圾收集器的多核系统上,您的响应能力可能会下降。这是因为将出现较少的地面军事,但它们将有更多的工作要做。这样做的好处是,GCs将释放更多内存,因此分配将继续非常便宜,因此吞吐量更高


顺便说一下,您似乎混淆了-Xmx和-Xms-Xms只设置初始堆大小,而-Xmx是最大堆大小。

通过添加更多内存,堆将需要更长的时间填满。因此,它将减少垃圾收集的频率。但是,根据对象的致命程度,您可能会发现执行单个GC所需的时间会增加


GC需要多长时间的主要因素是有多少活动对象。因此,如果几乎所有对象都在年轻时死亡,并且一旦建立起来,没有一个对象能够逃出年轻的堆,那么您可能不会注意到执行GC所需的时间有多大的变化。但是,每当您必须循环使用永久堆时,您可能会发现所有对象都会在不合理的时间内停止,因为大多数对象仍然存在。相应地调整大小。

根据我的经验,它不会减慢速度,但JVM会一直尝试缩减到Xms,并尝试保持在较低的边界或接近Xms。因此,如果您可以努力,也可以使用Xms。Sun推荐两款尺寸相同的产品。添加一些-XX:NewSize=512m(只是一个虚构的数字),以避免旧一代中昂贵的旧数据堆积,从而导致更长/更重的地面军事系统。我们使用700MB的NewSize运行我们的web应用程序,因为大多数数据都是短期的


所以,底线是:我不期望你的速度放慢,但要把你更多的记忆用在工作上。设置一个更大的新大小区域并将Xms设置为Xmx以降低GC上的压力,因为它不需要尝试缩减到Xms限制…

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


当然,您不应该将-Xmx设置为某些疯狂的值,如300GB,除非您真的需要它:)

谢谢您的输入,但我相信我的其余配置都很好。而且,即使它有缺陷,我想把这个问题保持在“所有事物都是平等的……”的范围内。不,我没有混淆这两个参数:)我只是认为在最初发布这个问题时,这是所有相关的——自更新以来。谢谢你的意见@斯图·汤普森:但你似乎在交替使用这两个词,所以很难说你指的是哪一个。废话。你是对的。我有一个拼写错误,当我指的是“Xmx”的时候,我就把“Xms”放了进去。对不起,谢谢。正如您将从我编辑的问题中看到的,我已将最大持续时间设置为GC持续时间。虽然我知道有能力调整永久堆等,但我还没有打着“过早优化”的幌子去那里。但也许这是有道理的…我能感觉到另一个问题来了!
-Xms256m 
-Xmx1024m 
-XX:+UseConcMarkSweepGC 
-XX:+AlwaysActAsServerClassMachine 
-XX:MaxGCPauseMillis=1000 
-XX:MaxGCMinorPauseMillis=1000 
-XX:+PrintGCTimeStamps 
-XX:+HeapDumpOnOutOfMemoryError