我试图在集群计算环境(IBM运行CentOS Version6.2Final)上运行一个Java应用程序,该应用程序可以为我提供最多1TB的内存空间。
我可以使用最多300 of的最大内存(Xmx)创建JVM,但我需要更多的内存(如果需要的话,我可以提供详细信息)。
但是,使用Xmx选项创建一个内存超过300 of的JVM似乎是不可能的。更确切地说,我得到了经典的错误消息:
VM初始化过程中发生错误。 无法为对象堆预留足够的空间。
我的(64位) JVM的详细信息如下:
OpenJDK运行时环境(IcedTea6 1.10.6) (流变-1.43.1.10.6.el6_2-x86_64) OpenJDK 64位服务器VM (构建20.0-b11,混合模式)
我也尝试过使用Java 7 64位JVM,但我也遇到了同样的问题。
此外,我试图创建一个JVM来运行HelloWorld.jar,但是如果您要求的不仅仅是-Xmx300G,那么JVM的创建仍然失败,所以我认为它与特定的应用程序没有任何关系。
有人知道为什么我不能创建一个内存超过300克的JVM吗?
有人能提出解决方案/解决办法吗?
发布于 2014-03-28 14:14:13
我可以想到几个可能的解释:
ulimit
进行检查。(请注意,根据这只虫子,如果每个进程资源限制停止JVM分配堆区域,您将得到错误消息。)提出的其他几个想法(海事组织)不太可能:
有人能提出解决方案/解决办法吗?
ulimit
。malloc
大量内存,并查看在失败之前可以分配多少内存。发布于 2014-04-03 12:43:23
(编辑,请参阅关于交换空间的新增部分)
SHMMAX和SHMALL
由于您使用的是CentOS,您可能遇到了类似于描述的SHMMAX
和SHMALL
内核设置的问题。在该链接下面是一个示例计算,用于获取和设置正确的SHMALL
设置。
连续记忆
一些用户已经报告说,没有足够的连续内存可用,其他人说它是不相干的。
我不确定CentOS上的JVM是否需要一个连续的内存块。根据SAS,分段内存可以阻止JVM以很大的Xmx
启动或启动Xms
内存设置,但互联网上的其他声明称这并不重要。我试图在我的48 of工作站上证明或不证明这一点,但是我成功地启动了JVM,初始和最大设置为40 of。我非常肯定没有这样大小的连续块可用,但是不同操作系统上的JVM的行为可能有所不同,因为每个操作系统的内存管理可能不同(也就是说,Windows通常隐藏单个进程的物理地址)。
查找最大的连续内存块
使用/proc/meminfo
查找最大的可用连续内存块,请参见VmAllocChunk
下面的值。所有值的这是一个指南和解释。如果您看到的值小于300 If,请尝试一个位于VmAllocChunk
值之下的值。
但是,通常这个数字高于物理可用内存(因为它是可用的虚拟内存值),它可能会给您带来假阳性。这是你可以保留的价值,但一旦你开始使用它,它可能需要交换。因此,您还应该检查MemFree
和Inactive
值。相反,您也可以查看整个列表,查看哪些值不超过300 at。
其他调优选项,您可以检查64位JVM
我不知道你为什么在300 at的时候遇到内存限制问题。有一段时间,我想你可能已经达到了最大的页数。在默认为4kB的情况下,300 4kB为78,643,200
页面。看上去不像是什么著名的神奇数字。例如,如果2^24
是最大值,那么16,777,216
页面或64 be应该是理论上可分配的最大值。
但是,假设为了证明您需要更大的页面(事实证明,对于大内存Java应用程序的性能而言,这更好),您应该使用在JBoss上查阅此手册,它解释了如何使用-XX:+UseLargePages
并设置kernel.shmmax
(同样也有)、vm.nr_hugepages
和vm.huge_tlb_shm_group
(不确定后者是必需的)。
强调你的系统
其他人也已经提出了这一点。要找出问题在于JVM而不是操作系统,您应该强调这一点。您可以使用的一个工具是斯特雷斯林。在本教程中,您可以找到一些可以使用的选项。您特别感兴趣的是以下命令:
stress --vm 2 --vm-bytes 300G --timeout 30s --verbose
如果该命令失败,或者锁定您的系统,您就会知道操作系统限制了该内存量的使用。如果它成功了,我们应该尝试调整JVM,使它能够使用可用的内存。
编辑Apr6:检查交换空间
具有非常大的内部内存大小的系统很少或根本不使用交换空间,这并不少见。对于许多应用程序来说,这可能不是问题,但是JVM需要交换可用的交换空间大于请求的内存大小。根据这个错误报告,JVM将尝试增加交换空间本身,但是,由于在这个线程建议中的一些答案,JVM可能并不总是能够这样做。
因此:使用cat /proc/swaps # free
检查当前可用的交换空间,如果它小于300 it,按照此CentOS手册的说明增加系统的交换空间。
注1:我们可以从布格利波特#4719001中推断,可用交换空间的连续块并不是必需的。但是如果您不确定,删除所有交换空间并重新创建它,它应该删除任何碎片。
注2:我看到了一些类似于这一个报告0MB
交换空间和能够运行0MB
的帖子。这可能是因为JVM本身增加了交换空间。但是,尝试手动增加交换空间以确定它是否解决了您的问题并不会有什么害处。
过早结论
我意识到以上这些都是对你问题的开箱即用的回答.我希望它能给您提供一些提示,说明您可以尝试如何使JVM正常工作。您也可以尝试其他JVM,如果问题最终证明是您当前使用的JVM的限制,但根据我到目前为止所读到的,不应该对64位JVM设置任何限制。
您在JVM初始化时得到的错误使我相信,问题不在于JVM,而在于操作系统无法遵守300 of内存的预留。
我自己的测试表明,JVM可以访问所有虚拟内存,而不关心可用的物理内存量。如果虚拟内存低于物理内存,这将是奇怪的,但是VmAllocChunk
设置应该在这个方向给出提示(它通常要大得多)。
发布于 2014-03-28 13:09:29
如果您看一看常见问题科 of HotSpot VM,它提到在64位VM上,只有64位的地址位可以使用,因此最大的HotSpot堆大小取决于系统上存在的物理内存和交换空间的数量。
如果您从理论上计算,那么您可以拥有一个18446744073709551616 MB的内存,但是它是有以上限制的。
您必须使用-Xmx
命令来定义JVM的最大堆大小,默认情况下在64位JVM上使用64+ 30% = 83.2MB。
我在我的机器上试了一下命令,它看起来很好用。
java -Xmx500g com.test.TestClass
我还试图定义以to为单位的最大堆,但它不起作用。
https://stackoverflow.com/questions/22711247
复制相似问题