diff --git a/src/libloomw/wtrace.cpp b/src/libloomw/wtrace.cpp
index bbc1416b22bf832eb3628c5aa1b6352b3f7d2779..242e6ea097f52e725d9f777a13933ffa0d27e2dc 100644
--- a/src/libloomw/wtrace.cpp
+++ b/src/libloomw/wtrace.cpp
@@ -4,7 +4,12 @@
 #include <libloom/log.h>
 
 #include <unistd.h>
-#ifndef __APPLE__
+#ifdef __APPLE__
+#include <mach/vm_statistics.h>
+#include <mach/mach_types.h>
+#include <mach/mach_init.h>
+#include <mach/mach_host.h>
+#else
 #include <sys/sysinfo.h>
 #endif
 
@@ -33,7 +38,32 @@ double read_cpu_time(long hz)
 int read_mem_usage_percent()
 {
 #ifdef __APPLE__
-    return 50;
+    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);
+    int usage;
+    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 = static_cast<int64_t>(vm_stats.free_count) *
+                                static_cast<int64_t>(page_size);
+
+        long long used_memory = (static_cast<int64_t>(vm_stats.active_count) +
+                                 static_cast<int64_t>(vm_stats.inactive_count) +
+                                 static_cast<int64_t>(vm_stats.wire_count)) *
+                                static_cast<int64_t>(page_size);
+        double total = static_cast<double>(free_memory + used_memory);
+        usage = static_cast<int>(used_memory / total * 100);
+    } else {
+        base::logger->warn("Cannot read memory utilizaton");
+        usage = -1;
+    }
+    return usage;
 #else
     struct sysinfo mem_info;
     if (sysinfo (&mem_info) < 0) {