【问题标题】:What is the Maximum Java Heap Space for SuSE LinuxSuSE Linux 的最大 Java 堆空间是多少
【发布时间】:2010-11-06 18:01:31
【问题描述】:

这个问题与Java Refuses To Start - Could Not Resrve Enough Space for Object Heap 有关,应该很容易弄清楚。然而;我的搜索没有产生任何有用的信息。

基本上,我们在具有相同硬件的不同机器上拥有 2 个 32 位操作系统(RedHat 和 SuSE)。两者都使用相同的 JVM,都执行相同的命令行。 RedHat 运行良好,但 SuSE 报告内存不足。

我们只需要知道这是我们使用的 SuSE 版本的限制还是其他原因。

'cat /proc/version' 给我们:

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

【问题讨论】:

    标签: linux memory heap-memory redhat suse


    【解决方案1】:

    JVM 内存限制与可用的最大空闲连续块有关,而不是空闲内存量。该限制从大约 1.4 GB 到略高于 2.0 GB 不等,具体取决于您的操作系统将各种内容放在内存中的位置。我不知道 Redhat 或 Suse 将内容加载到内存中的细节,但可能是 suse 将某个库映射到 RAM 中间的地址,Redhat 可能会在最后映射它(推测)。

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

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

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

    【讨论】:

    • 感谢您的解释。分配位是有道理的,并且可以解释它。如果由我决定,我很乐意切换到 Redhat ......但是我们公司已经切换到 SuSE,因此我们的“新”机器都是 SuSE :(。至于降低我们的最大堆大小,我们很乐意但目前这是不可能的。不过,我们正在计划减少内存使用量。
    【解决方案2】:

    首先,当你有这么大的地址空间压力时,你会疯狂地运行一个 32 位操作系统。在 64 位 Linux 上迁移到 64 位 JVM。您已经浪费了多少时间来尝试诊断这个问题,您从一开始就怀疑它会随着 64 位系统的更大地址空间而消失?

    其次,众所周知,在所有 Linux 供应商中,Red Hat 拥有最多的内核工程师,并对其 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 并站稳脚跟。

    【讨论】:

    • 如果可以的话。不幸的是,我无法控制机器、合同,也无法切换 linux 版本:(
    猜你喜欢
    • 2015-01-01
    • 2015-04-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2011-02-24
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多