Jvm 为什么我可以成功地指定超过物理内存大小的堆大小?

Jvm 为什么我可以成功地指定超过物理内存大小的堆大小?,jvm,Jvm,我的MacBookPro只有8GB的RAM,为什么JVM可以从100G的堆大小开始? 之所以会发生这种情况,是因为大多数操作系统(包括OSX)都支持虚拟内存。在这种情况下,进程向操作系统请求那么多的空间,并返回似乎有可用空间的内容。然而,内存被分为页面(这是一种分块提供内存的方式),操作系统仅在实际使用这些页面时才使用真正的内存填充这些页面。随着JVM开始使用越来越多的这些页面,它们将首先映射到物理内存,然后当内存无法装入物理内存时,将开始将内存页面交换到磁盘(直到磁盘耗尽,进程达到极限,此时它

我的MacBookPro只有8GB的RAM,为什么JVM可以从100G的堆大小开始?
之所以会发生这种情况,是因为大多数操作系统(包括OSX)都支持虚拟内存。在这种情况下,进程向操作系统请求那么多的空间,并返回似乎有可用空间的内容。然而,内存被分为页面(这是一种分块提供内存的方式),操作系统仅在实际使用这些页面时才使用真正的内存填充这些页面。随着JVM开始使用越来越多的这些页面,它们将首先映射到物理内存,然后当内存无法装入物理内存时,将开始将内存页面交换到磁盘(直到磁盘耗尽,进程达到极限,此时它将被终止)


这不是JVM所独有的;其他进程也会这样做。

我认为JVM在启动时会执行类似于
heap=malloc(1000GB)
的操作。如果一个进程调用了
malloc(1MB)
,那么这个1MB内存被占用,其他进程无法使用它。是吗?最初的JVM确实做到了这一点,但G1GC的工作方式略有不同。但是,您仍然可以在C程序上执行malloc(1000Gb),并使其成功。此时虚拟内存空间只是一个数字,因为页面还没有被使用。如果您查看顶部或类似位置,您可以看到它的用途,其中显示了从实际内存到虚拟内存的使用:
physem:7643M已使用(1846M有线),541M未使用。VM:841G vsize
还有一个问题。我的mac有8GB内存,我的程序使用
heap=malloc(1000GB)
应用了1000GB内存。如果我继续将数据填充到
堆中
,会发生什么?与Java中的情况相同;操作系统将根据需要将虚拟内存空间的区域映射到真实的物理页面中;当这些页面不再适合实际内存时,它们将被交换到磁盘。如果磁盘已满,则最终会使用SIGSEV终止进程。
java -Xmx100G -Xms100G Hello