src/share/vm/gc_implementation/parallelScavenge/adjoiningVirtualSpaces.hpp

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

author
johnc
date
Thu, 22 Sep 2011 10:57:37 -0700
changeset 3175
4dfb2df418f2
parent 2314
f95d63e2154a
child 6876
710a3c8b516e
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

duke@435 1 /*
stefank@2314 2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 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.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_ADJOININGVIRTUALSPACES_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_ADJOININGVIRTUALSPACES_HPP
stefank@2314 27
stefank@2314 28 #include "gc_implementation/parallelScavenge/psVirtualspace.hpp"
stefank@2314 29
duke@435 30
duke@435 31 // Contains two virtual spaces that each can individually span
duke@435 32 // most of the reserved region but committed parts of which
duke@435 33 // cannot overlap.
duke@435 34 //
duke@435 35 // +-------+ <--- high_boundary for H
duke@435 36 // | |
duke@435 37 // | H |
duke@435 38 // | |
duke@435 39 // | |
duke@435 40 // | |
duke@435 41 // --------- <--- low for H
duke@435 42 // | |
duke@435 43 // ========= <--- low_boundary for H, high_boundary for L
duke@435 44 // | |
duke@435 45 // | |
duke@435 46 // | |
duke@435 47 // --------- <--- high for L
duke@435 48 // | |
duke@435 49 // | L |
duke@435 50 // | |
duke@435 51 // | |
duke@435 52 // | |
duke@435 53 // +-------+ <--- low_boundary for L
duke@435 54 //
duke@435 55 // Each virtual space in the AdjoiningVirtualSpaces grows and shrink
duke@435 56 // within its reserved region (between the low_boundary and the
duke@435 57 // boundary) independently. If L want to grow above its high_boundary,
duke@435 58 // then the high_boundary of L and the low_boundary of H must be
duke@435 59 // moved up consistently. AdjoiningVirtualSpaces provide the
duke@435 60 // interfaces for moving the this boundary.
duke@435 61
duke@435 62 class AdjoiningVirtualSpaces {
duke@435 63 // space at the high end and the low end, respectively
duke@435 64 PSVirtualSpace* _high;
duke@435 65 PSVirtualSpace* _low;
duke@435 66
duke@435 67 // The reserved space spanned by the two spaces.
duke@435 68 ReservedSpace _reserved_space;
duke@435 69
duke@435 70 // The minimum byte size for the low space. It will not
duke@435 71 // be shrunk below this value.
duke@435 72 size_t _min_low_byte_size;
duke@435 73 // Same for the high space
duke@435 74 size_t _min_high_byte_size;
duke@435 75
duke@435 76 const size_t _alignment;
duke@435 77
duke@435 78 public:
duke@435 79 // Allocates two virtual spaces that will be located at the
duke@435 80 // high and low ends. Does no initialization.
duke@435 81 AdjoiningVirtualSpaces(ReservedSpace rs,
duke@435 82 size_t min_low_byte_size,
duke@435 83 size_t min_high_byte_size,
duke@435 84 size_t alignment);
duke@435 85
duke@435 86 // accessors
duke@435 87 PSVirtualSpace* high() { return _high; }
duke@435 88 PSVirtualSpace* low() { return _low; }
duke@435 89 ReservedSpace reserved_space() { return _reserved_space; }
duke@435 90 size_t min_low_byte_size() { return _min_low_byte_size; }
duke@435 91 size_t min_high_byte_size() { return _min_high_byte_size; }
duke@435 92 size_t alignment() const { return _alignment; }
duke@435 93
duke@435 94 // move boundary between the two spaces up
duke@435 95 bool adjust_boundary_up(size_t size_in_bytes);
duke@435 96 // and down
duke@435 97 bool adjust_boundary_down(size_t size_in_bytes);
duke@435 98
duke@435 99 // Maximum byte size for the high space.
duke@435 100 size_t high_byte_size_limit() {
duke@435 101 return _reserved_space.size() - _min_low_byte_size;
duke@435 102 }
duke@435 103 // Maximum byte size for the low space.
duke@435 104 size_t low_byte_size_limit() {
duke@435 105 return _reserved_space.size() - _min_high_byte_size;
duke@435 106 }
duke@435 107
duke@435 108 // Sets the boundaries for the virtual spaces and commits and
duke@435 109 // initial size;
duke@435 110 void initialize(size_t max_low_byte_size,
duke@435 111 size_t init_low_byte_size,
duke@435 112 size_t init_high_byte_size);
duke@435 113 };
stefank@2314 114
stefank@2314 115 #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_ADJOININGVIRTUALSPACES_HPP

mercurial