src/share/vm/gc_implementation/g1/heapRegionSets.cpp

Thu, 22 Sep 2011 10:57:37 -0700

author
johnc
date
Thu, 22 Sep 2011 10:57:37 -0700
changeset 3175
4dfb2df418f2
parent 2974
e8b0b0392037
child 3268
8aae2050e83e
permissions
-rw-r--r--

6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp

tonyp@2472 1 /*
tonyp@2472 2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
tonyp@2472 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
tonyp@2472 4 *
tonyp@2472 5 * This code is free software; you can redistribute it and/or modify it
tonyp@2472 6 * under the terms of the GNU General Public License version 2 only, as
tonyp@2472 7 * published by the Free Software Foundation.
tonyp@2472 8 *
tonyp@2472 9 * This code is distributed in the hope that it will be useful, but WITHOUT
tonyp@2472 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
tonyp@2472 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
tonyp@2472 12 * version 2 for more details (a copy is included in the LICENSE file that
tonyp@2472 13 * accompanied this code).
tonyp@2472 14 *
tonyp@2472 15 * You should have received a copy of the GNU General Public License version
tonyp@2472 16 * 2 along with this work; if not, write to the Free Software Foundation,
tonyp@2472 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
tonyp@2472 18 *
tonyp@2472 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
tonyp@2472 20 * or visit www.oracle.com if you need additional information or have any
tonyp@2472 21 * questions.
tonyp@2472 22 *
tonyp@2472 23 */
tonyp@2472 24
tonyp@2472 25 #include "precompiled.hpp"
tonyp@2974 26 #include "gc_implementation/g1/heapRegionRemSet.hpp"
tonyp@2472 27 #include "gc_implementation/g1/heapRegionSets.hpp"
tonyp@2472 28
tonyp@2472 29 //////////////////// FreeRegionList ////////////////////
tonyp@2472 30
tonyp@2472 31 const char* FreeRegionList::verify_region_extra(HeapRegion* hr) {
tonyp@2472 32 if (hr->is_young()) {
tonyp@2472 33 return "the region should not be young";
tonyp@2472 34 }
tonyp@2472 35 // The superclass will check that the region is empty and
tonyp@2472 36 // not-humongous.
tonyp@2472 37 return HeapRegionLinkedList::verify_region_extra(hr);
tonyp@2472 38 }
tonyp@2472 39
tonyp@2472 40 //////////////////// MasterFreeRegionList ////////////////////
tonyp@2472 41
tonyp@2974 42 const char* MasterFreeRegionList::verify_region_extra(HeapRegion* hr) {
tonyp@2974 43 // We should reset the RSet for parallel iteration before we add it
tonyp@2974 44 // to the master free list so that it is ready when the region is
tonyp@2974 45 // re-allocated.
tonyp@2974 46 if (!hr->rem_set()->verify_ready_for_par_iteration()) {
tonyp@2974 47 return "the region's RSet should be ready for parallel iteration";
tonyp@2974 48 }
tonyp@2974 49 return FreeRegionList::verify_region_extra(hr);
tonyp@2974 50 }
tonyp@2974 51
tonyp@2472 52 bool MasterFreeRegionList::check_mt_safety() {
tonyp@2472 53 // Master Free List MT safety protocol:
tonyp@2472 54 // (a) If we're at a safepoint, operations on the master free list
tonyp@2472 55 // should be invoked by either the VM thread (which will serialize
tonyp@2472 56 // them) or by the GC workers while holding the
tonyp@2472 57 // FreeList_lock.
tonyp@2472 58 // (b) If we're not at a safepoint, operations on the master free
tonyp@2472 59 // list should be invoked while holding the Heap_lock.
tonyp@2472 60
tonyp@2472 61 guarantee((SafepointSynchronize::is_at_safepoint() &&
tonyp@2472 62 (Thread::current()->is_VM_thread() ||
tonyp@2472 63 FreeList_lock->owned_by_self())) ||
tonyp@2472 64 (!SafepointSynchronize::is_at_safepoint() &&
tonyp@2472 65 Heap_lock->owned_by_self()),
tonyp@2643 66 hrs_ext_msg(this, "master free list MT safety protocol"));
tonyp@2472 67
tonyp@2472 68 return FreeRegionList::check_mt_safety();
tonyp@2472 69 }
tonyp@2472 70
tonyp@2472 71 //////////////////// SecondaryFreeRegionList ////////////////////
tonyp@2472 72
tonyp@2472 73 bool SecondaryFreeRegionList::check_mt_safety() {
tonyp@2472 74 // Secondary Free List MT safety protocol:
tonyp@2472 75 // Operations on the secondary free list should always be invoked
tonyp@2472 76 // while holding the SecondaryFreeList_lock.
tonyp@2472 77
tonyp@2472 78 guarantee(SecondaryFreeList_lock->owned_by_self(),
tonyp@2643 79 hrs_ext_msg(this, "secondary free list MT safety protocol"));
tonyp@2472 80
tonyp@2472 81 return FreeRegionList::check_mt_safety();
tonyp@2472 82 }
tonyp@2472 83
tonyp@2472 84 //////////////////// HumongousRegionSet ////////////////////
tonyp@2472 85
tonyp@2472 86 const char* HumongousRegionSet::verify_region_extra(HeapRegion* hr) {
tonyp@2472 87 if (hr->is_young()) {
tonyp@2472 88 return "the region should not be young";
tonyp@2472 89 }
tonyp@2472 90 // The superclass will check that the region is not empty and
tonyp@2472 91 // humongous.
tonyp@2472 92 return HeapRegionSet::verify_region_extra(hr);
tonyp@2472 93 }
tonyp@2472 94
tonyp@2643 95 //////////////////// MasterHumongousRegionSet ////////////////////
tonyp@2472 96
tonyp@2472 97 bool MasterHumongousRegionSet::check_mt_safety() {
tonyp@2472 98 // Master Humongous Set MT safety protocol:
tonyp@2472 99 // (a) If we're at a safepoint, operations on the master humongous
tonyp@2472 100 // set should be invoked by either the VM thread (which will
tonyp@2472 101 // serialize them) or by the GC workers while holding the
tonyp@2472 102 // OldSets_lock.
tonyp@2472 103 // (b) If we're not at a safepoint, operations on the master
tonyp@2472 104 // humongous set should be invoked while holding the Heap_lock.
tonyp@2472 105
tonyp@2472 106 guarantee((SafepointSynchronize::is_at_safepoint() &&
tonyp@2472 107 (Thread::current()->is_VM_thread() ||
tonyp@2472 108 OldSets_lock->owned_by_self())) ||
tonyp@2472 109 (!SafepointSynchronize::is_at_safepoint() &&
tonyp@2472 110 Heap_lock->owned_by_self()),
tonyp@2643 111 hrs_ext_msg(this, "master humongous set MT safety protocol"));
tonyp@2472 112 return HumongousRegionSet::check_mt_safety();
tonyp@2472 113 }

mercurial