Linux RHEL6分配更多内存来运行java程序

时间:2013-01-08 06:44:49

标签: java linux

运行我的java应用程序会在我的新rhel62计算机上占用更多内存。相同的程序在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 qaatestp 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 问题?还是没问题? :)

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

3 个答案:

答案 0 :(得分:3)

非常感谢您的回复。

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

Linux glibc >= 2.10 (RHEL 6) malloc may show excessive virtual memory usage

由于

答案 1 :(得分:2)

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

但是,请密切关注RES(常驻)和SHR(共享)内存列。在你的情况下,差异不是那么大:只有14MB而常驻内存为18MB,而且共享基本相同。

答案 2 :(得分:0)

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

猜测,你的旧机器有12 GB而你的新机器有24 GB。