Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve RAM info on a Mac?

I need to retrieve the total amount of RAM present in a system and the total RAM currently being used, so I can calculate a percentage. This is similar to: Retrieve system information on MacOS X?

However, in that question the best answer suggests how to get RAM by reading from:

/usr/bin/vm_stat

Due to the nature of my program, I found out that I am not cannot read from that file - I require a method that will provide me RAM info without simply opening a file and reading from it. I am looking for something to do with function calls. Something like this preferably : getTotalRam() and getRamInUse().

I obviously do not expect it to be that simple but I was looking for a solution other than reading from a file.

I am running Mac OS X Snow Leopard, but would preferably get a solution that would work across all current Mac OS X Platforms (i.e. Lion).

Solutions can be in C++, C or Obj-C, however C++ would the best possible solution in my case so if possible please try to provide it in C++.

like image 693
fdh Avatar asked Jan 08 '12 23:01

fdh


People also ask

Where do I find my RAM and processor info on Mac?

Click the Apple icon and choose About This Mac. The Overview tab will provide the operating system version, processor, and memory information.

How do I find out what RAM I have installed?

Find Out How Much RAM You Have Whether you're using Windows 10 or 11, checking your RAM is easy. Open Settings > System > About and move to the Device Specifications section. You should see a line named "Installed RAM" that will be able to tell you how much you currently have.


2 Answers

Getting the machine's physical memory is simple with 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

VM stats are only slightly trickier:

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

You can then use the data in vmstat to get the information you'd like:

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;

There is also a 64-bit version of the interface.

like image 156
sbooth Avatar answered Oct 14 '22 14:10

sbooth


You're not supposed to read from /usr/bin/vm_stat, rather you're supposed to run it; it is a program. Look at the first four lines of output

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

Add the numbers in the right column and multiple by the system page size (as returned by getpagesize()) and you get the total amount of physical memory in the system in bytes.

vm_stat isn't setuid on Mac OS, so I assume there is a non-privileged API somewhere to access this information and that vm_stat is using it. But I don't know what that interface is.

like image 32
Kyle Jones Avatar answered Oct 14 '22 13:10

Kyle Jones