无操作程序的Java虚拟内存?

无操作程序的Java虚拟内存?,java,memory,jvm,virtual,Java,Memory,Jvm,Virtual,对于以下无操作代码 public class a { public static void main(String args[]) throws Exception{ Thread.sleep(100000); } } 如果我在64位jvm上运行它,通过“top”,我可以看到它使用2GB虚拟内存。什么占用了虚拟内存?这个例子可能很奇怪,但我们确实看到一些生产代码使用了大量虚拟内存,因此超过了ulimit-v 谢谢 Yang虚拟内存并不意味着它实际上已被分配和使用。它只是意味着它有那么多当前可寻

对于以下无操作代码

public class a {
public static void main(String args[]) throws Exception{
Thread.sleep(100000);
}
}
如果我在64位jvm上运行它,通过“top”,我可以看到它使用2GB虚拟内存。什么占用了虚拟内存?这个例子可能很奇怪,但我们确实看到一些生产代码使用了大量虚拟内存,因此超过了ulimit-v

谢谢
Yang

虚拟内存并不意味着它实际上已被分配和使用。它只是意味着它有那么多当前可寻址的资源,可以在需要时使用。

当您启动Java应用程序时,它会在启动时创建堆(最大大小)。最近的Sun/Oracle JVM的默认大小是主内存的1/4。这听起来很浪费,但它所做的只是保留地址空间。鉴于每个应用程序都有自己的地址空间,这并不重要。(除非您的32位JVM地址空间有限)

请参阅。虚拟内存消耗几乎毫无意义。我知道,但它映射到了什么地方??二进制本身加上库并没有那么大。“不是”-我很确定你不想在这里使用双负数。我自己会修好的,但我不太会做2kyet@user933882它只是在必要的情况下绘制的。在64位机器上,虚拟地址空间非常大,因此2GB块是否映射到进程并不重要。好的,我发现这个讨论pmap显示:
00000000 901D0000 1195584 rw--0000000000000000 000:00000[anon]00000000 d9160000 39808 rw--0000000000000000:00000[anon]
所以看起来只是一种JVM实现行为。堆空间由通过malloc(3)分配的内存组成。这称为匿名内存,因为它在文件系统中没有映射(我们将在本章后面的“匿名内存”中进一步讨论)。