1

在我的新 rhel62 机器上运行我的 java 应用程序需要更多内存。相同的程序在 rhel55 上占用的内存更少。

我写了一个非常简单的“HelloWorld”java 程序,然后运行它。这在 rhel62 中也需要大量内存。我在 Rhel55 和 Rhel62 中都使用 Java_1.7

import java.io.* ;
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
        Console console = System.console();
        String input = console.readLine("Enter ...:");
        System.out.println(input);
    }
}
$ /usr/java/jdk1.7.0_09/bin/javac hello.java
$ /usr/java/jdk1.7.0_09/bin/java HelloWorldApp
Hello World!
Enter ...:

顶级命令上的 Java 应用程序

rhel62:Linux qatestp 2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5069 qaatestp  20   0 5557m  18m 7604 S  0.0  0.1   0:00.11 java
31719 qaatestp  20   0  105m 1972 1468 S  0.0  0.0   0:00.35 bash

rhel55:Linux qa2testp 2.6.18-238.5.1.el5 #1 SMP Mon Feb 21 05:52:39 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18065 qa2testp  17   0 2400m  14m 7508 S  0.0  0.2   0:00.22 java
17244 qa2testp  15   0 66196 1784 1232 S  0.0  0.0   0:00.81 bash

我不知道为什么这在 rhel62 中会这样,因此我面临着不必要的问题。这是Linux rhel6.2 的问题吗?还是Java问题?或没有问题?:)

在询问支持团队之前,我想在这里提出这个问题。请给出您的建议?

4

3 回答 3

3

非常感谢您的回复。

这是因为在 Rhel6 上进行了内存分配更改。RHEL6 为每个线程分配单独的内存块。在多核处理器中,这将提高性能,但会增加内存开销。有一个环境变量 MALLOC_ARENA_MAX,将此值设置为 1 会减少此内存分配。请参阅以下链接了解更多详情。

Linux glibc >= 2.10 (RHEL 6) malloc 可能会显示过多的虚拟内存使用情况

谢谢

于 2013-01-08T15:17:18.863 回答
2

您不应该仅通过查看VIRT列来快速判断 - 它只是意味着分配了这么多虚拟内存。这个虚拟内存可能永远不会被实际访问。

但是,请密切注意RES(驻留)和SHR(共享)内存列。在您的情况下,差异并不大:常驻内存只有 14MB 和 18MB,共享内存基本相同。

于 2013-01-08T06:51:41.200 回答
0

默认情况下,Java 设置的最大堆大小是启动时主内存大小的 1/4。您拥有的内存越多,启动时它允许的虚拟内存就越多。请注意,这并不意味着它会使用更多的常驻内存,但通常意味着它会。

猜测一下,您的旧机器有 12 GB,而新机器有 24 GB。

于 2013-01-08T07:23:20.620 回答