changeset 1390:bdb5361c461c

6897143: Stress test crashes during HeapInspection using ParallelGC. Summary: ensure_parsability() must be called even if GC_locker prevents GC. Reviewed-by: ysr, chrisphi
author kevinw
date Fri, 16 Apr 2010 17:36:37 +0100
parents f9ec1e4bbb44
children 6ecb6e6de3d6
files src/share/vm/gc_implementation/shared/vmGCOperations.cpp
diffstat 1 files changed, 18 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/shared/vmGCOperations.cpp	Thu Apr 15 18:45:30 2010 -0400
+++ b/src/share/vm/gc_implementation/shared/vmGCOperations.cpp	Fri Apr 16 17:36:37 2010 +0100
@@ -115,11 +115,25 @@
 void VM_GC_HeapInspection::doit() {
   HandleMark hm;
   CollectedHeap* ch = Universe::heap();
+  ch->ensure_parsability(false); // must happen, even if collection does
+                                 // not happen (e.g. due to GC_locker)
   if (_full_gc) {
-    ch->collect_as_vm_thread(GCCause::_heap_inspection);
-  } else {
-    // make the heap parsable (no need to retire TLABs)
-    ch->ensure_parsability(false);
+    // The collection attempt below would be skipped anyway if
+    // the gc locker is held. The following dump may then be a tad
+    // misleading to someone expecting only live objects to show
+    // up in the dump (see CR 6944195). Just issue a suitable warning
+    // in that case and do not attempt to do a collection.
+    // The latter is a subtle point, because even a failed attempt
+    // to GC will, in fact, induce one in the future, which we
+    // probably want to avoid in this case because the GC that we may
+    // be about to attempt holds value for us only
+    // if it happens now and not if it happens in the eventual
+    // future.
+    if (GC_locker::is_active()) {
+      warning("GC locker is held; pre-dump GC was skipped");
+    } else {
+      ch->collect_as_vm_thread(GCCause::_heap_inspection);
+    }
   }
   HeapInspection::heap_inspection(_out, _need_prologue /* need_prologue */);
 }