Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 相同的程序,相同的JVM,但不同机器上的内存需求和执行时间大不相同——为什么?_Java_Jvm_Out Of Memory_Heap_Execution Time - Fatal编程技术网

Java 相同的程序,相同的JVM,但不同机器上的内存需求和执行时间大不相同——为什么?

Java 相同的程序,相同的JVM,但不同机器上的内存需求和执行时间大不相同——为什么?,java,jvm,out-of-memory,heap,execution-time,Java,Jvm,Out Of Memory,Heap,Execution Time,作为大型实验的一部分,我正在尝试在集群上运行一个(java模拟框架)模拟。我对一个(相对)简单的模拟似乎需要大量内存感到惊讶。在集群上,它抛出“java.lang.OutOfMemoryError:java堆空间”异常,用于小于“-Xmx2500M”的堆化。一次执行需要5小时才能运行。我在我的两台Mac电脑(iMac和MacBook Pro)上运行了相同的实验,它们在不到一个小时的时间内执行,“-Xmx1024”没有给出任何错误。群集作业需要“-XX:MaxPermSize=250M”,而在我的

作为大型实验的一部分,我正在尝试在集群上运行一个(java模拟框架)模拟。我对一个(相对)简单的模拟似乎需要大量内存感到惊讶。在集群上,它抛出“java.lang.OutOfMemoryError:java堆空间”异常,用于小于“-Xmx2500M”的堆化。一次执行需要5小时才能运行。我在我的两台Mac电脑(iMac和MacBook Pro)上运行了相同的实验,它们在不到一个小时的时间内执行,“-Xmx1024”没有给出任何错误。群集作业需要“-XX:MaxPermSize=250M”,而在我的Mac电脑上,不需要高于默认值的增量。我运行相同的代码,相同的输入,在所有情况下使用完全相同的jar

在每种情况下都使用64位JVM(据我所知,它们非常相似):


$java-版本
java版本“1.6.0_26”
Java(TM)SE运行时环境(build 1.6.0_26-b03)
Java HotSpot(TM)64位服务器虚拟机(构建20.1-b02,混合模式)
$java-版本
java版本“1.6.0_31”
Java(TM)SE运行时环境(构建1.6.0_31-b04-415-10M3646)
Java HotSpot(TM)64位服务器虚拟机(构建20.6-b01-415,混合模式)
我在所有情况下都运行客户机JVM(最初在集群上使用服务器,切换到客户机没有任何区别)。我曾经尝试过使用Java7在集群上执行,同样存在巨大的内存和执行时间问题


我完全不知所措,没有人能解释这一点。以前有人见过这个吗?非常感谢您的帮助

我怀疑一个人有更快的网络或磁盘IO。如果您正在使用队列写入磁盘或写入网络,其中一台计算机可以正常工作,而另一台计算机无法正常工作,则队列可能会增长,从而减慢机器速度,并使用无限量的内存

如果您有更快的网络IO,则可能有助于更快地发送数据(保持队列较小),也可能意味着您接收数据的速度过快(意味着队列的增长速度可能快于它们的消耗速度)


很大程度上取决于应用程序的实际功能。当您的程序获得OOME时,我建议您获取一个堆转储并对其进行分析,然后查找消耗大量内存的集合(例如队列)。

我怀疑问题在于您使用的是服务器JVM。客户端JVM在64位计算机上不可用。即使您请求客户端JVM,它也会给您服务器一个。

也许您应该使用-XX:+heapdumponAutofmemoryError创建一个堆转储,然后使用MAT或类似的工具查看内存的消耗情况。我会使用VisualVM或类似于YourKit的商业内存分析器。在我看来,您也有两个不同的JVM版本。不是说这是你的问题,但它可能会有帮助。谢谢大家,我将检查堆转储@马特:你说得对,他们略有不同。然而,我尝试了Java6和Java7JVM,它们都给出了相同的问题。如果Mac运行的JVM需要不到一半的RAM来运行同一个作业,我会觉得很奇怪。谢谢你的快速回答。IO速度是最早的建议之一。集群的速度要慢得多,这解释了为什么初始化比我自己的机器慢得多。但是,程序一旦运行,直到最后(5小时后)才会读/写磁盘,并在一个文件中写入一行。我还应该说,在这些测试期间,没有其他人在集群上运行任何东西。我将研究堆转储,但同时,还有其他建议吗?如果您正在模拟集群,是否有任何网络IO,甚至是环回?速度数据可以通过环回传输,并因处理器和操作系统而异。整个作业(单个作业)在单个群集节点上执行:其想法是一次运行数百个这样的作业。节点之间不需要通信,每个作业作为自己的java进程是完全独立的。如果不使用IO,它如何模拟集群?你是说每个节点都是完全受CPU限制的吗?对不起,我想我把你弄糊涂了。它不是在模拟集群,而是在集群上运行:一组功能强大的机器(集群节点),用于进行大规模实验。节点共享磁盘空间,因此可能存在IO速度慢的问题,我认为这不是根本原因。集群可以运行跨多个节点的作业(这是我认为您需要的,节点之间的IO是问题所在),但我运行的特定作业是独立的java程序。我可以在我的机器上运行它们,就像在集群上一样。区别在于集群可以同时运行数百个
<on the cluster>
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

<on my macs>
$ java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-10M3646)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)