运行"免费"命令,我看到使用的内存是:
总计:3854884
使用:3752304
免费:102580
共享:352个
缓冲区:9252
缓存:150908
- / + buffers / cache:
二手:3592144
免费:262740
Swap: 0 0 0
但是在运行htop
时,我发现在VIRT列(虚拟内存)下有许多使用4507M内存的进程。 RES列(进程正在使用的物理RAM)显示209M。 SHR(共享内存)为5352M。
-Xmx
配置为2048m
。
如果交换空间为零,如何使用虚拟内存?
答案 0 :(得分:3)
这些程序(htop等)正在计算的虚拟内存只是进程请求的地址空间的大小。您有物理内存,实际RAM和虚拟地址空间,用户空间程序将地址映射到物理内存。它们是分开的。 0x0ff84560
指针可能实际上并不引用RAM的那部分。操作系统可以设置一个映射,用于确定实际引用RAM的位置。更进一步,它可以在RAM有备份之前设置映射。这是一个事件驱动的过程。操作系统将根据请求设置映射,没有真正的后备,没有分配物理内存,只有在您尝试使用虚拟内存时才实际将其映射到实际RAM。
虚拟内存的大小是此映射的大小。但并非所有这些都必须由物理RAM支持,因此即使没有交换,它也可能比RAM大。但是这会导致程序尝试实际上使用比RAM更多的内存。如果他们只是请求它,那就完全没有问题了。只有当他们使用它时。
此外,正如Thilo所提到的,内存映射文件可以添加到此。您可以将整个100TB文件映射到您的虚拟地址空间没问题。操作系统在后台处理物流:引入您需要的部件(您尝试访问的部件)并收获必须的部件以清除物理内存。