diff src/share/vm/memory/metaspace.cpp @ 6730:5d2156bcb78b

7195789: NPG: assert(used + free == capacity) failed: Accounting is wrong Reviewed-by: coleenp, jcoomes
author jmasa
date Tue, 04 Sep 2012 16:20:28 -0700
parents 03049e0e8544
children 942bb29b20b0
line wrap: on
line diff
--- a/src/share/vm/memory/metaspace.cpp	Tue Sep 04 18:01:20 2012 -0700
+++ b/src/share/vm/memory/metaspace.cpp	Tue Sep 04 16:20:28 2012 -0700
@@ -2541,7 +2541,22 @@
 
 // MetaspaceAux
 
+size_t MetaspaceAux::used_in_bytes_unsafe(Metaspace::MetadataType mdtype) {
+  size_t used = 0;
+  ClassLoaderDataGraphMetaspaceIterator iter;
+  while (iter.repeat()) {
+    Metaspace* msp = iter.get_next();
+    // Sum allocation_total for each metaspace
+    if (msp != NULL) {
+      used += msp->used_words(mdtype);
+    }
+  }
+  return used * BytesPerWord;
+}
+
 size_t MetaspaceAux::used_in_bytes(Metaspace::MetadataType mdtype) {
+  assert(SafepointSynchronize::is_at_safepoint(),
+    "Consistency checks require being at a safepoint");
   size_t used = 0;
 #ifdef ASSERT
   size_t free = 0;
@@ -2646,15 +2661,15 @@
   out->print_cr(" Metaspace total "
                 SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
                 " reserved " SIZE_FORMAT "K",
-                capacity_in_bytes()/K, used_in_bytes()/K, reserved_in_bytes()/K);
+                capacity_in_bytes()/K, used_in_bytes_unsafe()/K, reserved_in_bytes()/K);
   out->print_cr("  data space     "
                 SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
                 " reserved " SIZE_FORMAT "K",
-                capacity_in_bytes(nct)/K, used_in_bytes(nct)/K, reserved_in_bytes(nct)/K);
+                capacity_in_bytes(nct)/K, used_in_bytes_unsafe(nct)/K, reserved_in_bytes(nct)/K);
   out->print_cr("  class space    "
                 SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
                 " reserved " SIZE_FORMAT "K",
-                capacity_in_bytes(ct)/K, used_in_bytes(ct)/K, reserved_in_bytes(ct)/K);
+                capacity_in_bytes(ct)/K, used_in_bytes_unsafe(ct)/K, reserved_in_bytes(ct)/K);
 }
 
 // Print information for class space and data space separately.