diff --git a/ext/nokogiri/xml_document.c b/ext/nokogiri/xml_document.c
index 4b26cd4b6ec..d085b0a8ad9 100644
--- a/ext/nokogiri/xml_document.c
+++ b/ext/nokogiri/xml_document.c
@@ -89,12 +89,18 @@ dealloc(void *data)
 static size_t
 memsize_node(const xmlNodePtr node)
 {
+  /* note we don't count namespace definitions, just going for a good-enough number here */
   xmlNodePtr child;
   size_t memsize = 0;
   for (child = node->children; child; child = child->next) {
-    /* This should count the properties too. */
     memsize += sizeof(xmlNode) + memsize_node(child);
   }
+  /* xmlAttr and xmlNode share the same layout for next/prev/parent/etc. */
+  for (child = (xmlNodePtr)node->properties; child; child = child->next) {
+    memsize += sizeof(xmlAttr) + memsize_node(child);
+  }
+  memsize += xmlStrlen(node->name);
+  memsize += xmlStrlen(node->content);
   return memsize;
 }
 
diff --git a/test/test_memory_leak.rb b/test/test_memory_leak.rb
index 808040d25a9..b77d796e9a2 100644
--- a/test/test_memory_leak.rb
+++ b/test/test_memory_leak.rb
@@ -272,6 +272,50 @@ def test_leaking_dtd_nodes_after_internal_subset_removal
     end
   end # if NOKOGIRI_GC
 
+  def test_object_space_memsize_of
+    begin
+      require "objspace"
+    rescue LoadError
+      skip("ObjectSpace not available")
+    end
+
+    base_size = ObjectSpace.memsize_of(Nokogiri::XML(<<~XML))
+      <root>
+        <child>asdf</child>
+      </root>
+    XML
+
+    more_children_size = ObjectSpace.memsize_of(Nokogiri::XML(<<~XML))
+      <root>
+        <child>asdf</child>
+        <child>asdf</child>
+        <child>asdf</child>
+      </root>
+    XML
+    assert(more_children_size > base_size, "adding children should increase memsize")
+
+    attributes_size = ObjectSpace.memsize_of(Nokogiri::XML(<<~XML))
+      <root>
+        <child a="b" c="d">asdf</child>
+      </root>
+    XML
+    assert(attributes_size > base_size, "adding attributes should increase memsize")
+
+    string_size = ObjectSpace.memsize_of(Nokogiri::XML(<<~XML))
+      <root>
+        <child>asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf</child>
+      </root>
+    XML
+    assert(string_size > base_size, "longer strings should increase memsize")
+
+    bigger_name_size = ObjectSpace.memsize_of(Nokogiri::XML(<<~XML))
+      <root>
+        <superduperamazingchild>asdf</superduperamazingchild>
+      </root>
+    XML
+    assert(bigger_name_size > base_size, "longer tags should increase memsize")
+  end
+
   module MemInfo
     # from https://stackoverflow.com/questions/7220896/get-current-ruby-process-memory-usage
     # this is only going to work on linux