Thu, 20 Sep 2012 09:52:56 -0700
7190666: G1: assert(_unused == 0) failed: Inconsistency in PLAB stats
Summary: Reset the fields in ParGCAllocBuffer, that are used for accumulating values for the ResizePLAB sensors in PLABStats, to zero after flushing the values to the PLABStats fields. Flush PLABStats values only when retiring the final allocation buffers prior to disposing of a G1ParScanThreadState object, rather than when retiring every allocation buffer.
Reviewed-by: jwilhelm, jmasa, ysr
1 /*
2 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_SPACEDECORATOR_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_SHARED_SPACEDECORATOR_HPP
28 #include "gc_implementation/shared/mutableSpace.hpp"
29 #include "memory/space.hpp"
30 #include "utilities/globalDefinitions.hpp"
32 class SpaceDecorator: public AllStatic {
33 public:
34 // Initialization flags.
35 static const bool Clear = true;
36 static const bool DontClear = false;
37 static const bool Mangle = true;
38 static const bool DontMangle = false;
39 };
41 // Functionality for use with class Space and class MutableSpace.
42 // The approach taken with the mangling is to mangle all
43 // the space initially and then to mangle areas that have
44 // been allocated since the last collection. Mangling is
45 // done in the context of a generation and in the context
46 // of a space.
47 // The space in a generation is mangled when it is first
48 // initialized and when the generation grows. The spaces
49 // are not necessarily up-to-date when this mangling occurs
50 // and the method mangle_region() is used.
51 // After allocations have been done in a space, the space generally
52 // need to be remangled. Remangling is only done on the
53 // recently allocated regions in the space. Typically, that is
54 // the region between the new top and the top just before a
55 // garbage collection.
56 // An exception to the usual mangling in a space is done when the
57 // space is used for an extraordinary purpose. Specifically, when
58 // to-space is used as scratch space for a mark-sweep-compact
59 // collection.
60 // Spaces are mangled after a collection. If the generation
61 // grows after a collection, the added space is mangled as part of
62 // the growth of the generation. No additional mangling is needed when the
63 // spaces are resized after an expansion.
64 // The class SpaceMangler keeps a pointer to the top of the allocated
65 // area and provides the methods for doing the piece meal mangling.
66 // Methods for doing sparces and full checking of the mangling are
67 // included. The full checking is done if DEBUG_MANGLING is defined.
68 // GenSpaceMangler is used with the GenCollectedHeap collectors and
69 // MutableSpaceMangler is used with the ParallelScavengeHeap collectors.
70 // These subclasses abstract the differences in the types of spaces used
71 // by each heap.
73 class SpaceMangler: public CHeapObj<mtGC> {
74 friend class VMStructs;
76 // High water mark for allocations. Typically, the space above
77 // this point have been mangle previously and don't need to be
78 // touched again. Space belows this point has been allocated
79 // and remangling is needed between the current top and this
80 // high water mark.
81 HeapWord* _top_for_allocations;
82 HeapWord* top_for_allocations() { return _top_for_allocations; }
84 public:
86 // Setting _top_for_allocations to NULL at initialization
87 // makes it always below top so that mangling done as part
88 // of the initialize() call of a space does nothing (as it
89 // should since the mangling is done as part of the constructor
90 // for the space.
91 SpaceMangler() : _top_for_allocations(NULL) {}
93 // Methods for top and end that delegate to the specific
94 // space type.
95 virtual HeapWord* top() const = 0;
96 virtual HeapWord* end() const = 0;
98 // Return true if q matches the mangled pattern.
99 static bool is_mangled(HeapWord* q) PRODUCT_RETURN0;
101 // Used to save the an address in a space for later use during mangling.
102 void set_top_for_allocations(HeapWord* v);
104 // Overwrites the unused portion of this space.
105 // Mangle only the region not previously mangled [top, top_previously_mangled)
106 void mangle_unused_area();
107 // Mangle all the unused region [top, end)
108 void mangle_unused_area_complete();
109 // Do some sparse checking on the area that should have been mangled.
110 void check_mangled_unused_area(HeapWord* limit) PRODUCT_RETURN;
111 // Do a complete check of the area that should be mangled.
112 void check_mangled_unused_area_complete() PRODUCT_RETURN;
114 // Mangle the MemRegion. This is a non-space specific mangler. It
115 // is used during the initial mangling of a space before the space
116 // is fully constructed. Also is used when a generation is expanded
117 // and possibly before the spaces have been reshaped to to the new
118 // size of the generation.
119 static void mangle_region(MemRegion mr) PRODUCT_RETURN;
120 };
122 class ContiguousSpace;
124 // For use with GenCollectedHeap's
125 class GenSpaceMangler: public SpaceMangler {
126 ContiguousSpace* _sp;
128 ContiguousSpace* sp() { return _sp; }
130 HeapWord* top() const { return _sp->top(); }
131 HeapWord* end() const { return _sp->end(); }
133 public:
134 GenSpaceMangler(ContiguousSpace* sp) : SpaceMangler(), _sp(sp) {}
135 };
137 // For use with ParallelScavengeHeap's.
138 class MutableSpaceMangler: public SpaceMangler {
139 MutableSpace* _sp;
141 MutableSpace* sp() { return _sp; }
143 HeapWord* top() const { return _sp->top(); }
144 HeapWord* end() const { return _sp->end(); }
146 public:
147 MutableSpaceMangler(MutableSpace* sp) : SpaceMangler(), _sp(sp) {}
148 };
150 #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_SPACEDECORATOR_HPP