diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 4843ac1784ceda4c67eb062bf1f414b08f418d69..1dcdf5d6270a101883c200578e4408b5c3d93a7e 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -7459,6 +7459,8 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
   struct svalue *ss;
 #ifdef USE_DL_MALLOC
   struct mallinfo mi = dlmallinfo();
+#elif HAVE_MALLINFO2
+  struct mallinfo2 mi = mallinfo2();
 #elif HAVE_MALLINFO
   struct mallinfo mi = mallinfo();
 #endif
@@ -7470,11 +7472,14 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
    * statistics from our bundled Doug Lea malloc, and not the
    * underlying system malloc. Ideally we should include both. */
 
-#if defined(HAVE_MALLINFO) || defined(USE_DL_MALLOC)
+#if defined(HAVE_MALLINFO2) || defined(HAVE_MALLINFO) || defined(USE_DL_MALLOC)
 
   push_text("num_malloc_blocks");
   push_ulongest(1 + mi.hblks);	/* 1 for the arena. */
   push_text("malloc_block_bytes");
+#ifdef HAVE_MALLINFO2
+  size = mi.arena + mi.hblkhd;
+#else
   if (mi.arena < 0) {
     /* Kludge for broken Linux libc, where the fields are ints.
      *
@@ -7499,11 +7504,15 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
   } else {
     size += mi.hblkhd;
   }
+#endif
   push_ulongest(size);
 
   push_text("num_malloc");
   push_ulongest(mi.ordblks + mi.smblks);
   push_text("malloc_bytes");
+#ifdef HAVE_MALLINFO2
+  size = mi.uordblks + mi.usmblks;
+#else
   if (mi.uordblks < 0) {
     size = (unsigned int)mi.uordblks;
   } else {
@@ -7517,11 +7526,15 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
       size += mi.usmblks;
     }
   }
+#endif
   push_ulongest(size);
 
   push_text("num_free_blocks");
   push_int(1);
   push_text("free_block_bytes");
+#ifdef HAVE_MALLINFO2
+  size = mi.fsmblks + mi.fordblks;
+#else
   if (mi.fsmblks < 0) {
     size = (unsigned int)mi.fsmblks;
   } else {
@@ -7532,6 +7545,7 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
   } else {
     size += mi.fordblks;
   }
+#endif
   push_ulongest(size);
 
 #endif
diff --git a/src/configure.in b/src/configure.in
index 989bee5a7d57b63c723e71f32f3a86f28a16d146..a9aeb5522478f93fa54b48649b7858b0cacf8133 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -4584,6 +4584,7 @@ AC_CHECK_FUNCS( \
  gmtime_s \
  strptime \
  mallinfo \
+ mallinfo2 \
  mallopt \
  ptrace \
  setrlimit \