此问题是有关 Java的拒绝启动 - 无法为理论储量对象堆足够的空间和应该很容易弄清楚。然而;我的搜索并没有产生任何有用的东西。

基本上我们有2级32位操作系统上使用相同的硬件不同的机器的(RedHat的&的SuSE)。都使用相同的两个JVM执行相同的命令行。 RedHat的工作完全正常,但SuSE的报告没有足够的内存。

我们只需要知道这是否与SUSE版本的限制,我们正在使用或者如果它是别的东西。

'执行cat / proc /版' 为我们提供了:

Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

'UNAME -a' 为我们提供了在两种类型的机器执行以下操作:

UTC 2005 i686 i686 i386 GNU/Linux
有帮助吗?

解决方案

在JVM内存限制有关最大可用的连续块可用,而不是游离的内存量。极限约1.4 GB变化到有点过2.0 GB,并取决于您的操作系统把各种事情在内存中。我不知道在哪里红帽或SUSE负载的东西的细节入内存,但它可能是SUSE是在RAM中间,其中红帽可能会在年底(投机)映射它映射了一些图书馆的地址。

请记住,在Java中你的实际内存使用的超过的你指定XMX什么。其他的内存设置也会影响您的堆(如PermGen的)的大小。因此,它也有可能是在SUSE烫发空间具有larget默认比红帽。

此外,根据您的应用程序的内存分配方案,你也许可以侥幸逃脱小堆的大小和不同的垃圾收集的选项。还有一些细节在这里( http://java.sun.com/performance/参考/白皮书/ tuning.html )等地。例如,如果您分配了很多小的,临时块的,你会想比,如果你有很多位,长寿命对象的不同GC设置。

关于链接的问题,为什么不使用红帽?这可能是一个简单的解决方案,但我保证它会更快解决您的问题比深钻研的java调整和操作系统内存管理的神秘世界:P

其他提示

首先,你是神经病是运行的32位操作系统,当你有这么多的地址空间的压力。迁移到64位Linux 64位JVM。多少时间您浪费已经试图弄清这个问题,你必须从一开始就怀疑将与64位系统的更大的地址空间消失?

其次,众所周知,从所有的Linux供应商红帽对员工最核心的工程师,使一些严重的调整对他们的RHEL产品的内核。这些通常包括大型工作像你这样的补丁(当然,这是对于32位系统的大的工作量,这没有什么64位特殊)。因此,有一定的几率的原因,最终是RHEL有其他客户做同样疯狂的东西,你和你的工作,他们做了支持这些客户受益。

最后虽然,因为我怀疑你要坚持试图找到一种方式来做到这一点在32位的SuSE我会指出,Linux提供了多种在32位x86地址空间的取舍,并有可能(但不是一定),你的SuSE系统上只是有不同的折衷选择。如果你能调出运行内核的配置(通常的/ boot / config中....),那么你可以像HIGHMEM比较设置。

在常规选项,直到几年前为2:2分,也就是用户空间被限制的地址空间,一个简单的解决编程2GiB并有不俗的效率,但在这种情况下显然你不能有你的要求堆,因为它会离开程序文本没有空间,堆栈等最近的趋势是3:1(类似于Windows / 3GB开关),其在填鸭式操作系统内核本身到少的成本扩展用户空间的地址空间空间,可能会导致其自身的问题。这可能会实现,但它会是很狭窄的,所以我也不会感到惊讶,如果它不为你从事的工作。最后,新的Linux内核还提供了一个选项,你在哪里得到4GiB 32位的用户空间,这可能是足以让你的工作可靠地运行,以显著的性能成本,因为那显然空间和内核地址不能并存的。

要试试这个你需要一个新的内核。您可以只安装一个由SuSE的(看看他们是否提供其他人,例如“PAE”选项中选择),或者您可能需要自己编译,在这种情况下,它可能是无效支持合同提供的。

不过说真的,你应该去与选项1,切换到64位JVM和把你的脚。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top