src/share/vm/gc_implementation/g1/heapRegionSeq.hpp

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

author
johnc
date
Thu, 22 Sep 2011 10:57:37 -0700
changeset 3175
4dfb2df418f2
parent 3168
4f93f0d00802
child 3713
720b6a76dd9d
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

ysr@777 1 /*
tonyp@2469 2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP
stefank@2314 27
ysr@777 28 class HeapRegion;
ysr@777 29 class HeapRegionClosure;
tonyp@2963 30 class FreeRegionList;
tonyp@2963 31
tonyp@2963 32 #define G1_NULL_HRS_INDEX ((size_t) -1)
tonyp@2963 33
tonyp@2963 34 // This class keeps track of the region metadata (i.e., HeapRegion
tonyp@2963 35 // instances). They are kept in the _regions array in address
tonyp@2963 36 // order. A region's index in the array corresponds to its index in
tonyp@2963 37 // the heap (i.e., 0 is the region at the bottom of the heap, 1 is
tonyp@2963 38 // the one after it, etc.). Two regions that are consecutive in the
tonyp@2963 39 // array should also be adjacent in the address space (i.e.,
tonyp@2963 40 // region(i).end() == region(i+1).bottom().
tonyp@2963 41 //
tonyp@2963 42 // We create a HeapRegion when we commit the region's address space
tonyp@2963 43 // for the first time. When we uncommit the address space of a
tonyp@2963 44 // region we retain the HeapRegion to be able to re-use it in the
tonyp@2963 45 // future (in case we recommit it).
tonyp@2963 46 //
tonyp@2963 47 // We keep track of three lengths:
tonyp@2963 48 //
tonyp@2963 49 // * _length (returned by length()) is the number of currently
tonyp@2963 50 // committed regions.
tonyp@2963 51 // * _allocated_length (not exposed outside this class) is the
tonyp@2963 52 // number of regions for which we have HeapRegions.
tonyp@2963 53 // * _max_length (returned by max_length()) is the maximum number of
tonyp@2963 54 // regions the heap can have.
tonyp@2963 55 //
tonyp@2963 56 // and maintain that: _length <= _allocated_length <= _max_length
ysr@777 57
ysr@777 58 class HeapRegionSeq: public CHeapObj {
tonyp@3168 59 friend class VMStructs;
ysr@777 60
tonyp@2963 61 // The array that holds the HeapRegions.
tonyp@2963 62 HeapRegion** _regions;
ysr@777 63
tonyp@2963 64 // Version of _regions biased to address 0
tonyp@2963 65 HeapRegion** _regions_biased;
ysr@777 66
tonyp@2963 67 // The number of regions committed in the heap.
tonyp@2963 68 size_t _length;
ysr@777 69
tonyp@2963 70 // The address of the first reserved word in the heap.
tonyp@2963 71 HeapWord* _heap_bottom;
ysr@777 72
tonyp@2963 73 // The address of the last reserved word in the heap - 1.
tonyp@2963 74 HeapWord* _heap_end;
tonyp@2963 75
tonyp@2963 76 // The log of the region byte size.
tonyp@2963 77 size_t _region_shift;
tonyp@2963 78
tonyp@2963 79 // A hint for which index to start searching from for humongous
tonyp@2963 80 // allocations.
tonyp@2963 81 size_t _next_search_index;
tonyp@2963 82
tonyp@2963 83 // The number of regions for which we have allocated HeapRegions for.
tonyp@2963 84 size_t _allocated_length;
tonyp@2963 85
tonyp@2963 86 // The maximum number of regions in the heap.
tonyp@2963 87 size_t _max_length;
tonyp@2963 88
tonyp@2963 89 // Find a contiguous set of empty regions of length num, starting
tonyp@2963 90 // from the given index.
tonyp@2963 91 size_t find_contiguous_from(size_t from, size_t num);
tonyp@2963 92
tonyp@2963 93 // Map a heap address to a biased region index. Assume that the
tonyp@2963 94 // address is valid.
tonyp@2963 95 inline size_t addr_to_index_biased(HeapWord* addr) const;
tonyp@2963 96
tonyp@2963 97 void increment_length(size_t* length) {
tonyp@2963 98 assert(*length < _max_length, "pre-condition");
tonyp@2963 99 *length += 1;
tonyp@2963 100 }
tonyp@2963 101
tonyp@2963 102 void decrement_length(size_t* length) {
tonyp@2963 103 assert(*length > 0, "pre-condition");
tonyp@2963 104 *length -= 1;
tonyp@2963 105 }
ysr@777 106
ysr@777 107 public:
tonyp@2963 108 // Empty contructor, we'll initialize it with the initialize() method.
tonyp@2963 109 HeapRegionSeq() { }
ysr@777 110
tonyp@2963 111 void initialize(HeapWord* bottom, HeapWord* end, size_t max_length);
ysr@777 112
tonyp@2963 113 // Return the HeapRegion at the given index. Assume that the index
tonyp@2963 114 // is valid.
tonyp@2963 115 inline HeapRegion* at(size_t index) const;
ysr@777 116
tonyp@2963 117 // If addr is within the committed space return its corresponding
tonyp@2963 118 // HeapRegion, otherwise return NULL.
tonyp@2963 119 inline HeapRegion* addr_to_region(HeapWord* addr) const;
ysr@777 120
tonyp@2963 121 // Return the HeapRegion that corresponds to the given
tonyp@2963 122 // address. Assume the address is valid.
tonyp@2963 123 inline HeapRegion* addr_to_region_unsafe(HeapWord* addr) const;
ysr@777 124
tonyp@2963 125 // Return the number of regions that have been committed in the heap.
tonyp@2963 126 size_t length() const { return _length; }
tonyp@2963 127
tonyp@2963 128 // Return the maximum number of regions in the heap.
tonyp@2963 129 size_t max_length() const { return _max_length; }
tonyp@2963 130
tonyp@2963 131 // Expand the sequence to reflect that the heap has grown from
tonyp@2963 132 // old_end to new_end. Either create new HeapRegions, or re-use
tonyp@2963 133 // existing ones, and return them in the given list. Returns the
tonyp@2963 134 // memory region that covers the newly-created regions. If a
tonyp@2963 135 // HeapRegion allocation fails, the result memory region might be
tonyp@2963 136 // smaller than the desired one.
tonyp@2963 137 MemRegion expand_by(HeapWord* old_end, HeapWord* new_end,
tonyp@2963 138 FreeRegionList* list);
tonyp@2963 139
tonyp@2963 140 // Return the number of contiguous regions at the end of the sequence
ysr@777 141 // that are available for allocation.
ysr@777 142 size_t free_suffix();
ysr@777 143
tonyp@2643 144 // Find a contiguous set of empty regions of length num and return
tonyp@2963 145 // the index of the first region or G1_NULL_HRS_INDEX if the
tonyp@2963 146 // search was unsuccessful.
tonyp@2963 147 size_t find_contiguous(size_t num);
ysr@777 148
tonyp@2963 149 // Apply blk->doHeapRegion() on all committed regions in address order,
tonyp@2963 150 // terminating the iteration early if doHeapRegion() returns true.
tonyp@2963 151 void iterate(HeapRegionClosure* blk) const;
ysr@777 152
tonyp@2963 153 // As above, but start the iteration from hr and loop around. If hr
tonyp@2963 154 // is NULL, we start from the first region in the heap.
tonyp@2963 155 void iterate_from(HeapRegion* hr, HeapRegionClosure* blk) const;
ysr@777 156
tonyp@2963 157 // Tag as uncommitted as many regions that are completely free as
tonyp@2963 158 // possible, up to shrink_bytes, from the suffix of the committed
tonyp@2963 159 // sequence. Return a MemRegion that corresponds to the address
tonyp@2963 160 // range of the uncommitted regions. Assume shrink_bytes is page and
tonyp@2963 161 // heap region aligned.
tonyp@2963 162 MemRegion shrink_by(size_t shrink_bytes, size_t* num_regions_deleted);
ysr@777 163
tonyp@2963 164 // Do some sanity checking.
tonyp@2963 165 void verify_optional() PRODUCT_RETURN;
ysr@777 166 };
stefank@2314 167
stefank@2314 168 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP

mercurial