Mac OS X
我也希望能为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
使用以下sysctl
系统功能可以使用系统中可用的物理RAM量:
#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);
当前使用的RAM
您可以从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
请参阅上面的“我的进程当前使用的虚拟内存”。相同的代码适用。