# HG changeset patch # Parent 085f2d4ce92d44d453bc1a77aeb8e10e2c734327 diff -r 085f2d4ce92d src/share/vm/gc/g1/g1CollectedHeap.cpp --- a/src/share/vm/gc/g1/g1CollectedHeap.cpp Tue Sep 29 14:04:53 2015 +0200 +++ b/src/share/vm/gc/g1/g1CollectedHeap.cpp Tue Sep 29 14:10:07 2015 +0200 @@ -3716,6 +3716,10 @@ return oop(region->bottom())->is_typeArray(); } + bool is_objArray_region(HeapRegion*region) const { + return oop(region->bottom())->is_objArray(); + } + bool humongous_region_is_candidate(G1CollectedHeap* heap, HeapRegion* region) const { assert(region->is_starts_humongous(), "Must start a humongous object"); @@ -3755,7 +3759,9 @@ // important use case for eager reclaim, and this special handling // may reduce needed headroom. - return is_typeArray_region(region) && is_remset_small(region); + return (is_typeArray_region(region) || + (G1EagerReclaimRefHumongousObjects && is_objArray_region(region) && !G1CollectedHeap::heap()->collector_state()->during_marking())) && + is_remset_small(region); } public: @@ -6175,10 +6181,6 @@ return false; } - guarantee(obj->is_typeArray(), - "Only eagerly reclaiming type arrays is supported, but the object " - PTR_FORMAT " is not.", p2i(r->bottom())); - if (G1TraceEagerReclaimHumongousObjects) { gclog_or_tty->print_cr("Dead humongous region %u size " SIZE_FORMAT " start " PTR_FORMAT " length %u with remset " SIZE_FORMAT " code roots " SIZE_FORMAT " is marked %d reclaim candidate %d type array %d", region_idx, diff -r 085f2d4ce92d src/share/vm/gc/g1/g1_globals.hpp --- a/src/share/vm/gc/g1/g1_globals.hpp Tue Sep 29 14:04:53 2015 +0200 +++ b/src/share/vm/gc/g1/g1_globals.hpp Tue Sep 29 14:10:07 2015 +0200 @@ -285,6 +285,9 @@ "Try to reclaim dead large objects that have a few stale " \ "references at every young GC.") \ \ + experimental(bool, G1EagerReclaimRefHumongousObjects, true, \ + "Try to reclaim dead large array of references.") \ + \ experimental(bool, G1TraceEagerReclaimHumongousObjects, false, \ "Print some information about large object liveness " \ "at every young GC.") \