当我运行 htop (在 OS X 10.6.8 上)时,我看到如下内容:
1 [|||||||| 20.0%] 任务:共 70 个,0 个正在运行 2 [||| 7.2%] 平均负载:1.11 0.79 0.64 3 [||||||||||||||||||||||||||||||81.3%] 正常运行时间:00:30:42 4 [|| 5.8%] 内存[||||||||||||||||||||||||3872/4096MB] 共享版[ 0/0MB] PID 用户优先级 NI VIRT RES SHR S CPU% MEM% TIME+ 命令 284 501 57 0 15.3G 1064M 0 S 0.0 6.5 0:01.26 /Applications/Firefox.app/Contents/MacOS/firefox -psn_0_90134 437 501 57 0 14.8G 785M 0 S 0.0 4.8 0:00.18 /Applications/Thunderbird.app/Contents/MacOS/thunderbird -psn_0_114716 428 501 63 0 12.8G 351M 0 S 1.0 2.1 0:00.51 /Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/ 696 501 63 0 11.7G 175M 0 S 0.0 1.1 0:00.02 /System/Library/Frameworks/QuickLook.framework/Resources/quicklookd.app/Conte 38 0 33 0 11.1G 422M 0 S 0.0 2.6 0:00.59 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framewo 183 501 48 0 10.9G 137M 0 S 0.0 0.8 0:00.03 /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder
我怎样才能让进程使用数 GB 的 VIRT 内存,而使用的交换空间仍为 0MB?
答案1
VIRT
与已用内存(虚拟内存或其他)无关,但与已用地址空间,这并不像您想象的那么相关。
现代操作系统(包括 OSX)有一项功能叫做请求调页它的工作原理是告诉操作系统将虚拟地址空间的某个区域映射到文件(例如共享库/DLL)。只有当程序尝试读取这些虚拟地址时,文件才会加载到内存中。
如果这些共享库实际上是共享的,那么操作系统实际上将在多个进程之间共享物理内存;也就是说,这些数十 GB 中的很大一部分不仅是文件支持的库,而且也是相同的文件支持库。
此外,如果需要临时内存(用于数据、设置、位图、声音等),并且没有任何未使用的物理页面,则操作系统实际上会丢弃这些文件支持区域的内容并将其提供给您的应用程序。如果再次需要这些页面,操作系统只需从磁盘重新加载它们即可。
交换 ( SWP
) 是用于暂存内存的特殊文件支持区域。创建交换空间将允许操作系统将暂存内存移至磁盘而不是(由更多正在运行的进程使用的)共享库,这通常会提高性能,也许最令人惊讶的是,它会产生较少的交换比根本没有交换空间要多。
答案2
您仍有剩余内存。系统不会交换出去,因为目前还不需要交换……但是,我又注意到一些奇怪的事情 - 据我所知,您没有设置交换空间。在我的一个 (linux) 系统上,它显示
CPU[|||||||||||||||||||| 63.2%] Tasks: 89, 114 thr; 1 running
Mem[||||||||||||||||| 167/1001MB] Load average: 0.19 1.13 0.75
Swp[ 0/1021MB] Uptime: 00:06:54
例如。
我不确定这是 OS X 的怪癖还是其他问题 - 你可能需要检查一下活动监视器