diff --git a/sysdeps/freebsd/mem.c b/sysdeps/freebsd/mem.c
index a9e9d25..ed609dc 100644
--- a/sysdeps/freebsd/mem.c
+++ b/sysdeps/freebsd/mem.c
@@ -55,6 +55,17 @@ static gulong mem_get_by_bytes (glibtop *server, const char *name) {
 	return result;
 }
 
+static gulong try_mem_get_by_bytes (glibtop *server, const char *name) {
+	gulong result = 0;
+	size_t len = sizeof (result);
+
+	if (sysctlbyname (name, &result, &len, NULL, 0)) {
+		return 0;
+	}
+	return result;
+}
+
+
 static gulong mem_get_by_pages (glibtop *server, const char *name) {
 	guint result = 0;
 	size_t len = sizeof (result);
@@ -75,6 +86,7 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
 	gulong memcached;
 	gulong membuffer;
 	gulong memfree;
+	gulong zfs_arc_size;
 
 	glibtop_init_s (&server, GLIBTOP_SYSDEPS_MEM, 0);
 
@@ -85,6 +97,7 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
 	meminactive = mem_get_by_pages (server, "vm.stats.vm.v_inactive_count");
 	memwired = mem_get_by_pages (server, "vm.stats.vm.v_wire_count");
 	memcached = mem_get_by_pages (server, "vm.stats.vm.v_cache_count");
+	zfs_arc_size = try_mem_get_by_bytes (server, "kstat.zfs.misc.arcstats.size");
 	membuffer = mem_get_by_bytes (server, "vfs.bufspace");
 	memfree = mem_get_by_pages (server, "vm.stats.vm.v_free_count");
 
@@ -96,6 +109,13 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
 	buf->cached = memcached;
 	buf->locked = 0;
 
-	buf->user = memactive + memwired;
+	if (zfs_arc_size) {
+		buf->cached += zfs_arc_size;
+		buf->user = buf->used - (buf->buffer + buf->cached + meminactive);
+	}
+	else {
+		buf->user = memactive + memwired;
+	}
+
 	buf->flags = _glibtop_sysdeps_mem;
 }
