Mac OS X
总虚拟内存
这在 Mac OS X 上很棘手,因为它不使用预设的交换分区或 Linux 之类的文件。这是 Apple 文档中的一个条目:
注意:与大多数基于 Unix 的操作系统不同,Mac OS X 不为虚拟内存使用预先分配的交换分区。相反,它使用机器引导分区上的所有可用空间。
所以,如果你想知道还有多少虚拟内存可用,你需要得到根分区的大小。你可以这样做:
struct statfs stats;
if (0 == statfs("/", &stats))
{
myFreeSwap = (uint64_t)stats.f_bsize * stats.f_bfree;
}
当前使用的虚拟总数
使用“vm.swapusage”键调用 systcl 可以提供有关交换使用的有趣信息:
sysctl -n vm.swapusage
vm.swapusage: total = 3072.00M used = 2511.78M free = 560.22M (encrypted)
并不是说如果需要更多交换,此处显示的总交换使用量可能会改变,如上一节所述。所以总数实际上是当前的交换总数。在 C++ 中,可以这样查询这些数据:
xsw_usage vmusage = {0};
size_t size = sizeof(vmusage);
if( sysctlbyname("vm.swapusage", &vmusage, &size, NULL, 0)!=0 )
{
perror( "unable to get swap usage by calling sysctlbyname(\"vm.swapusage\",...)" );
}
请注意,在 sysctl.h 中声明的“xsw_usage”似乎没有记录在案,我怀疑有一种更便携的方式来访问这些值。
我的进程当前使用的虚拟内存
task_info
您可以使用该功能获取有关当前进程的统计信息。这包括进程的当前驻留大小和当前虚拟大小。
#include<mach/mach.h>
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (KERN_SUCCESS != task_info(mach_task_self(),
TASK_BASIC_INFO, (task_info_t)&t_info,
&t_info_count))
{
return -1;
}
// resident size is in t_info.resident_size;
// virtual size is in t_info.virtual_size;
可用总 RAM
系统中可用的物理 RAM 量可使用如下sysctl
系统函数获得:
#include <sys/types.h>
#include <sys/sysctl.h>
...
int mib[2];
int64_t physical_memory;
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
length = sizeof(int64_t);
sysctl(mib, 2, &physical_memory, &length, NULL, 0);
当前使用的内存
您可以从host_statistics
系统函数中获取一般内存统计信息。
#include <mach/vm_statistics.h>
#include <mach/mach_types.h>
#include <mach/mach_init.h>
#include <mach/mach_host.h>
int main(int argc, const char * argv[]) {
vm_size_t page_size;
mach_port_t mach_port;
mach_msg_type_number_t count;
vm_statistics64_data_t vm_stats;
mach_port = mach_host_self();
count = sizeof(vm_stats) / sizeof(natural_t);
if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
KERN_SUCCESS == host_statistics64(mach_port, HOST_VM_INFO,
(host_info64_t)&vm_stats, &count))
{
long long free_memory = (int64_t)vm_stats.free_count * (int64_t)page_size;
long long used_memory = ((int64_t)vm_stats.active_count +
(int64_t)vm_stats.inactive_count +
(int64_t)vm_stats.wire_count) * (int64_t)page_size;
printf("free memory: %lld\nused memory: %lld\n", free_memory, used_memory);
}
return 0;
}
这里需要注意的一点是,Mac OS X 中有五种内存页面。它们如下:
- 已锁定且无法换出的有线页面
- 正在加载到物理内存中并且相对难以换出的活动页面
- 加载到内存中的非活动页面,但最近没有使用过,甚至可能根本不需要。这些是交换的潜在候选人。可能需要刷新此内存。
- 缓存的页面已经被缓存了一些,很可能很容易被重用。缓存内存可能不需要刷新。缓存页面仍有可能被重新激活
- 完全免费并可随时使用的免费页面。
需要注意的是,仅仅因为 Mac OS X 有时可能会显示非常少的实际可用内存,这可能并不能很好地表明有多少可以在短时间内使用。
我的进程当前使用的 RAM
请参阅上面的“我的进程当前使用的虚拟内存”。相同的代码适用。