什么是SuSE Linux的最大Java堆空间?

这个问题与Java拒绝开始 – 无法为对象留出足够的空间有关 ,应该很容易弄清楚。 然而; 我的search没有产生任何有用的东西。

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

我们只需要知道这是否是我们正在使用的SuSE版本的限制,或者是否是其他内容。

“猫/ 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'给了我们以下两种types的机器:

 UTC 2005 i686 i686 i386 GNU/Linux 

Solutions Collecting From Web of "什么是SuSE Linux的最大Java堆空间?"

JVM内存限制与可用的最大空闲连续块相关,而不是可用内存量。 这个限制从1.4GB到2.0GB不等,取决于你的操作系统在内存中放置什么东西。 我不知道Redhat或Suse将内容加载到内存中的细节,但可能是因为suse将一些库映射到RAM中间的地址,而Redhat可能会在最后映射它(猜测)。

请记住,您在java中的实际内存使用量超过了您为Xmx指定的内存使用量。 其他内存设置也影响你的堆的大小(如permgen)。 所以也可能是Suse上的perm空间比redhat有更大的默认空间。

另外,根据应用程序的内存分配配置文件,您可能会获得较小的堆大小和不同的垃圾收集选项。 这里有一些细节( http://java.sun.com/performance/reference/whitepapers/tuning.html )和其他地方。 例如,如果你分配了很多小的临时块,你会需要不同的GC设置,如果你有很多长寿命的对象。

关于链接的问题,为什么不使用Redhat呢? 这可能是一个简单的解决方案,但是我保证它会比解决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,并把你的脚。