【发布时间】:2014-04-29 09:59:27
【问题描述】:
在我们的生产机器上运行一个简单的 Java 程序,我注意到这个程序消耗了更多的 10G virt。我知道虚拟内存没有那么重要,但至少我想了解为什么需要它。
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
try {
Thread.sleep(10000);
} catch(InterruptedException e) {
/* ignored */
}
}
}
当我运行那个小程序时,top 在说什么:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18764 myuser 20 0 10.2g 20m 8128 S 1.7 0.1 0:00.05 java
有人知道为什么会这样吗?
uname -a 说:
Linux m4fxhpsrm1dg 2.6.32-358.18.1.el6.x86_64 #1 SMP Fri Aug 2 17:04:38 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux
在较旧的 32 位 Linux 机器上,相同的程序仅消耗大约 1G virt。旧机器有 4GB 内存,新机器有 32GB。
【问题讨论】:
-
@CurtisHx:想想看。 1 GB 的虚拟内存!还是疯了,这么大的地址空间干什么?
-
@MSalters 为托管堆预分配(不提交)空间。这是 64 位的世界,你可以拥有尽可能多的虚拟空间,这实际上并不重要。
-
@MSalters 是 JVM,而不是预先分配所有地址空间的 Hello World 代码。
-
我认为这可能是我见过的第一个问题,它在 StackOverflow 上可能比它发布的地方更合适......哈哈。
-
@a_horse_with_no_name:我的意思是预订本身加起来有几兆字节。这是 UNIX 风格编程的一个问题,您可能有成千上万的小进程并存。如果整个过程只是一个兆字节,那没问题。
标签: java memory-management jvm 64-bit virtual-memory