在Mac上检索RAM信息?

我需要检索系统中存在的RAM总量以及当前使用的总RAM,因此我可以计算一个百分比。 这类似于: 在MacOS X上检索系统信息?

但是,在那个问题中,最佳答案建议如何通过以下方式获取RAM:

/usr/bin/vm_stat 

由于我的程序的性质,我发现我不能从该文件中读取 – 我需要一种方法,它将为我提供RAM信息,而无需简单地打开文件并从中读取。 我正在寻找与函数调用有关的东西。 这样的东西最好是: getTotalRam()getRamInUse()

我显然不希望它那么简单但我正在寻找除了从文件中读取之外的解决方案。

我正在运行Mac OS X Snow Leopard,但最好能获得适用于所有当前Mac OS X平台(即Lion)的解决方案。

解决方案可以是C ++,C或Obj-C,但是在我的情况下C ++是最好的解决方案,所以如果可能的话请尝试用C ++提供。

你不应该从/ usr / bin / vm_stat读取,而是你应该运行它; 这是一个程序。 看看前四行输出

 Pages free: 1880145. Pages active: 49962. Pages inactive: 43609. Pages wired down: 123353. 

在系统页面大小(由getpagesize()返回)中添加右列中的数字和多个数字,您将获得系统中物理内存的总量(以字节为单位)。

vm_stat在Mac OS上不是setuid,所以我假设某个地方有一个非特权API来访问这些信息,而vm_stat正在使用它。 但我不知道那个界面是什么。

使用sysctl获取机器的物理内存很简单:

 int mib [] = { CTL_HW, HW_MEMSIZE }; int64_t value = 0; size_t length = sizeof(value); if(-1 == sysctl(mib, 2, &value, &length, NULL, 0)) // An error occurred // Physical memory is now in value 

虚拟机统计数据稍微有些棘手:

 mach_msg_type_number_t count = HOST_VM_INFO_COUNT; vm_statistics_data_t vmstat; if(KERN_SUCCESS != host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count)) // An error occurred 

然后,您可以使用vmstat中的数据来获取您想要的信息:

 double total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count; double wired = vmstat.wire_count / total; double active = vmstat.active_count / total; double inactive = vmstat.inactive_count / total; double free = vmstat.free_count / total; 

还有一个64位版本的界面。

您可以通过查看top命令的来源找出这个问题的答案。 您可以从http://opensource.apple.com/下载源代码。 10.7.2源可在此处作为存档或在此处以可浏览的forms提供。 我建议下载存档并打开top.xcodeproj以便您可以使用Xcode查找定义(在Xcode中按命令单击非常有用)。

top命令显示标签“PhysMem”之后的物理内存(RAM)编号。 在项目中搜索该字符串,我们在globalstats.c中的函数update_physmem中找到它。 它从struct libtop_tsamp_tvm_stat成员计算已使用和可用的内存编号。

您可以命令 – 单击“vm_stat”以在libtop.h其声明作为libtop_tsamp_t的libtop_tsamp_t进行libtop.h 。 它被声明为类型vm_statistics_data_t 。 命令单击跳转到/usr/include/mach/vm_statistics.h定义。

在项目中搜索“vm_stat”,我们发现它是由libtop_tsamp_update_vm_stats中的函数libtop_tsamp_update_vm_stats libtop.c

 mach_msg_type_number_t count = sizeof(tsamp->vm_stat) / sizeof(natural_t); kr = host_statistics(libtop_port, HOST_VM_INFO, (host_info_t)&tsamp->vm_stat, &count); if (kr != KERN_SUCCESS) { return kr; } 

如果要调用host_statistics您需要弄清楚如何设置host_statistics 。 我相信你能为自己解决这个问题。

这已经4年了但我只是想在计算总RAM时添加一些额外的信息。

为了获得总RAM,除了Kyle Jones的答案之外,我们还应该考虑Pages occupied by compressor Pages speculativePages speculative

您可以查看此post以了解问题发生的位置。