运行我的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 问题?还是没问题? :)
在询问支持团队之前,我想过在这里提出这个问题。请提出你的建议?
答案 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。