src/share/vm/gc_implementation/shared/vmGCOperations.cpp

Print this page
rev 4773 : 8005849: JEP 167: Event-Based JVM Tracing
Reviewed-by: acorn, coleenp, sla
Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>

*** 143,178 **** bool VM_GC_HeapInspection::skip_operation() const { assert(Universe::heap()->supports_heap_inspection(), "huh?"); return false; } 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) { ! // 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 inspect(_csv_format, _print_help, _print_class_stats, _columns); ! inspect.heap_inspection(_out, _need_prologue /* need_prologue */); } void VM_GenCollectForAllocation::doit() { SvcGCMarker sgcm(SvcGCMarker::MINOR); --- 143,183 ---- bool VM_GC_HeapInspection::skip_operation() const { assert(Universe::heap()->supports_heap_inspection(), "huh?"); return false; } + bool VM_GC_HeapInspection::collect() { + if (GC_locker::is_active()) { + return false; + } + Universe::heap()->collect_as_vm_thread(GCCause::_heap_inspection); + return true; + } + void VM_GC_HeapInspection::doit() { HandleMark hm; ! Universe::heap()->ensure_parsability(false); // must happen, even if collection does // not happen (e.g. due to GC_locker) + // or _full_gc being false if (_full_gc) { ! if (!collect()) { ! // The collection attempt was skipped because 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. warning("GC locker is held; pre-dump GC was skipped"); } } HeapInspection inspect(_csv_format, _print_help, _print_class_stats, _columns); ! inspect.heap_inspection(_out); } void VM_GenCollectForAllocation::doit() { SvcGCMarker sgcm(SvcGCMarker::MINOR);