annotate src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @ 795:215f81b4d9b3

6841831: G1: assert(contains_reference(from),"We just added it!") fires Summary: During parallel rset updating we have to make sure that the worker ids of the refinement threads do not intersect with the worker ids that can be claimed by the mutator threads. Reviewed-by: tonyp
author iveresov
date Mon, 18 May 2009 11:52:46 -0700
parents 4ac7d97e6101
children 29e7d79232b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
579
0fbdb4381b99 6814575: Update copyright year
xdono
parents: 545
diff changeset
2 * Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
21 * have any questions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
25 // A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
26 // It uses the "Garbage First" heap organization and algorithm, which
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
27 // may combine concurrent marking with parallel, incremental compaction of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
28 // heap subsets that will yield large amounts of garbage.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
29
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
30 class HeapRegion;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
31 class HeapRegionSeq;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
32 class PermanentGenerationSpec;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 class GenerationSpec;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 class OopsInHeapRegionClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 class G1ScanHeapEvacClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 class ObjectClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 class SpaceClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 class CompactibleSpaceClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 class Space;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40 class G1CollectorPolicy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 class GenRemSet;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 class G1RemSet;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 class HeapRegionRemSetIterator;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 class ConcurrentMark;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 class ConcurrentMarkThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 class ConcurrentG1Refine;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 class ConcurrentZFThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 // If want to accumulate detailed statistics on work queues
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 // turn this on.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 #define G1_DETAILED_STATS 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 #if G1_DETAILED_STATS
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 # define IF_G1_DETAILED_STATS(code) code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 #else
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 # define IF_G1_DETAILED_STATS(code)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 typedef GenericTaskQueue<oop*> RefToScanQueue;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 typedef GenericTaskQueueSet<oop*> RefToScanQueueSet;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 enum G1GCThreadGroups {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 G1CRGroup = 0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 G1ZFGroup = 1,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65 G1CMGroup = 2,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 G1CLGroup = 3
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 enum GCAllocPurpose {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 GCAllocForTenured,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71 GCAllocForSurvived,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 GCAllocPurposeCount
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 class YoungList : public CHeapObj {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 HeapRegion* _head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 HeapRegion* _scan_only_head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 HeapRegion* _scan_only_tail;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83 size_t _length;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
84 size_t _scan_only_length;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
85
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86 size_t _last_sampled_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87 size_t _sampled_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88 HeapRegion* _curr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 HeapRegion* _curr_scan_only;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91 HeapRegion* _survivor_head;
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
92 HeapRegion* _survivor_tail;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
93 size_t _survivor_length;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95 void empty_list(HeapRegion* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
96
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
98 YoungList(G1CollectedHeap* g1h);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100 void push_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
101 void add_survivor_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 HeapRegion* pop_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
103 void empty_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 bool is_empty() { return _length == 0; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105 size_t length() { return _length; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
106 size_t scan_only_length() { return _scan_only_length; }
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
107 size_t survivor_length() { return _survivor_length; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 void rs_length_sampling_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
110 bool rs_length_sampling_more();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
111 void rs_length_sampling_next();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
112
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
113 void reset_sampled_info() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 _last_sampled_rs_lengths = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116 size_t sampled_rs_lengths() { return _last_sampled_rs_lengths; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 // for development purposes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119 void reset_auxilary_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 HeapRegion* first_region() { return _head; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121 HeapRegion* first_scan_only_region() { return _scan_only_head; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
122 HeapRegion* first_survivor_region() { return _survivor_head; }
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
123 HeapRegion* last_survivor_region() { return _survivor_tail; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124 HeapRegion* par_get_next_scan_only_region() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 HeapRegion* ret = _curr_scan_only;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 if (ret != NULL)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128 _curr_scan_only = ret->get_next_young_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
129 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
130 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132 // debugging
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
133 bool check_list_well_formed();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 bool check_list_empty(bool ignore_scan_only_list,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 bool check_sample = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 void print();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 class RefineCardTableEntryClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 class G1CollectedHeap : public SharedHeap {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 friend class VM_G1CollectForAllocation;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 friend class VM_GenCollectForPermanentAllocation;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 friend class VM_G1CollectFull;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 friend class VM_G1IncCollectionPause;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 friend class VMStructs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 // Closures used in implementation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 friend class G1ParCopyHelper;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 friend class G1IsAliveClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 friend class G1EvacuateFollowersClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 friend class G1ParScanThreadState;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 friend class G1ParScanClosureSuper;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 friend class G1ParEvacuateFollowersClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 friend class G1ParTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155 friend class G1FreeGarbageRegionClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 friend class RefineCardTableEntryClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 friend class G1PrepareCompactClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 friend class RegionSorter;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
159 friend class CountRCClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 friend class EvacPopObjClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 // Other related classes.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163 friend class G1MarkSweep;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 enum SomePrivateConstants {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167 VeryLargeInBytes = HeapRegion::GrainBytes/2,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
168 VeryLargeInWords = VeryLargeInBytes/HeapWordSize,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
169 MinHeapDeltaBytes = 10 * HeapRegion::GrainBytes, // FIXME
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 NumAPIs = HeapRegion::MaxAge
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 // The one and only G1CollectedHeap, so static functions can find it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 static G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 // Storage for the G1 heap (excludes the permanent generation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 VirtualSpace _g1_storage;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 MemRegion _g1_reserved;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 // The part of _g1_storage that is currently committed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 MemRegion _g1_committed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183 // The maximum part of _g1_storage that has ever been committed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184 MemRegion _g1_max_committed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 // The number of regions that are completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 size_t _free_regions;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 // The number of regions we could create by expansion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 size_t _expansion_regions;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 // Return the number of free regions in the heap (by direct counting.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 size_t count_free_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 // Return the number of free regions on the free and unclean lists.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 size_t count_free_regions_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 // The block offset table for the G1 heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 G1BlockOffsetSharedArray* _bot_shared;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 // Move all of the regions off the free lists, then rebuild those free
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 // lists, before and after full GC.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 void tear_down_region_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 void rebuild_region_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 // This sets all non-empty regions to need zero-fill (which they will if
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 // they are empty after full collection.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 void set_used_regions_to_need_zero_fill();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 // The sequence of all heap regions in the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 HeapRegionSeq* _hrs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 // The region from which normal-sized objects are currently being
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 // allocated. May be NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 HeapRegion* _cur_alloc_region;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 // Postcondition: cur_alloc_region == NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 void abandon_cur_alloc_region();
636
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
217 void abandon_gc_alloc_regions();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219 // The to-space memory regions into which objects are being copied during
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 // a GC.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 HeapRegion* _gc_alloc_regions[GCAllocPurposeCount];
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
222 size_t _gc_alloc_region_counts[GCAllocPurposeCount];
636
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
223 // These are the regions, one per GCAllocPurpose, that are half-full
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
224 // at the end of a collection and that we want to reuse during the
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
225 // next collection.
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
226 HeapRegion* _retained_gc_alloc_regions[GCAllocPurposeCount];
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
227 // This specifies whether we will keep the last half-full region at
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
228 // the end of a collection so that it can be reused during the next
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
229 // collection (this is specified per GCAllocPurpose)
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
230 bool _retain_gc_alloc_region[GCAllocPurposeCount];
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232 // A list of the regions that have been set to be alloc regions in the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 // current collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234 HeapRegion* _gc_alloc_region_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 // When called by par thread, require par_alloc_during_gc_lock() to be held.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 void push_gc_alloc_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 // This should only be called single-threaded. Undeclares all GC alloc
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240 // regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 void forget_alloc_region_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 // Should be used to set an alloc region, because there's other
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 // associated bookkeeping.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 void set_gc_alloc_region(int purpose, HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 // Check well-formedness of alloc region list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248 bool check_gc_alloc_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250 // Outside of GC pauses, the number of bytes used in all regions other
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
251 // than the current allocation region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252 size_t _summary_bytes_used;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
253
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
254 // This is used for a quick test on whether a reference points into
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
255 // the collection set or not. Basically, we have an array, with one
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
256 // byte per region, and that byte denotes whether the corresponding
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
257 // region is in the collection set or not. The entry corresponding
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
258 // the bottom of the heap, i.e., region 0, is pointed to by
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
259 // _in_cset_fast_test_base. The _in_cset_fast_test field has been
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
260 // biased so that it actually points to address 0 of the address
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
261 // space, to make the test as fast as possible (we can simply shift
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
262 // the address to address into it, instead of having to subtract the
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
263 // bottom of the heap from the address before shifting it; basically
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
264 // it works in the same way the card table works).
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
265 bool* _in_cset_fast_test;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
266
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
267 // The allocated array used for the fast test on whether a reference
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
268 // points into the collection set or not. This field is also used to
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
269 // free the array.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
270 bool* _in_cset_fast_test_base;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
271
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
272 // The length of the _in_cset_fast_test_base array.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
273 size_t _in_cset_fast_test_length;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
274
353
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
275 volatile unsigned _gc_time_stamp;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
276
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
277 size_t* _surviving_young_words;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
278
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
279 void setup_surviving_young_words();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
280 void update_surviving_young_words(size_t* surv_young_words);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
281 void cleanup_surviving_young_words();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
282
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
283 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
284
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
285 // Returns "true" iff none of the gc alloc regions have any allocations
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
286 // since the last call to "save_marks".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
287 bool all_alloc_regions_no_allocs_since_save_marks();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
288 // Perform finalization stuff on all allocation regions.
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
289 void retire_all_alloc_regions();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
290
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
291 // The number of regions allocated to hold humongous objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
292 int _num_humongous_regions;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
293 YoungList* _young_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
294
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
295 // The current policy object for the collector.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
296 G1CollectorPolicy* _g1_policy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
297
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
298 // Parallel allocation lock to protect the current allocation region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
299 Mutex _par_alloc_during_gc_lock;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
300 Mutex* par_alloc_during_gc_lock() { return &_par_alloc_during_gc_lock; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
301
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
302 // If possible/desirable, allocate a new HeapRegion for normal object
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
303 // allocation sufficient for an allocation of the given "word_size".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
304 // If "do_expand" is true, will attempt to expand the heap if necessary
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 // to to satisfy the request. If "zero_filled" is true, requires a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306 // zero-filled region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307 // (Returning NULL will trigger a GC.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
308 virtual HeapRegion* newAllocRegion_work(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309 bool do_expand,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
310 bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
311
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
312 virtual HeapRegion* newAllocRegion(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
313 bool zero_filled = true) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
314 return newAllocRegion_work(word_size, false, zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
315 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
316 virtual HeapRegion* newAllocRegionWithExpansion(int purpose,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
317 size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
318 bool zero_filled = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
319
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
320 // Attempt to allocate an object of the given (very large) "word_size".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
321 // Returns "NULL" on failure.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
322 virtual HeapWord* humongousObjAllocate(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
323
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
324 // If possible, allocate a block of the given word_size, else return "NULL".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
325 // Returning NULL will trigger GC or heap expansion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
326 // These two methods have rather awkward pre- and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
327 // post-conditions. If they are called outside a safepoint, then
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
328 // they assume that the caller is holding the heap lock. Upon return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
329 // they release the heap lock, if they are returning a non-NULL
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
330 // value. attempt_allocation_slow() also dirties the cards of a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
331 // newly-allocated young region after it releases the heap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
332 // lock. This change in interface was the neatest way to achieve
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333 // this card dirtying without affecting mem_allocate(), which is a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
334 // more frequently called method. We tried two or three different
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
335 // approaches, but they were even more hacky.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 HeapWord* attempt_allocation(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337 bool permit_collection_pause = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
338
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
339 HeapWord* attempt_allocation_slow(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
340 bool permit_collection_pause = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
341
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
342 // Allocate blocks during garbage collection. Will ensure an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
343 // allocation region, either by picking one or expanding the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
344 // heap, and then allocate a block of the given size. The block
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
345 // may not be a humongous - it must fit into a single heap region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
346 HeapWord* allocate_during_gc(GCAllocPurpose purpose, size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
347 HeapWord* par_allocate_during_gc(GCAllocPurpose purpose, size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
348
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
349 HeapWord* allocate_during_gc_slow(GCAllocPurpose purpose,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350 HeapRegion* alloc_region,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
351 bool par,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
352 size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
353
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
354 // Ensure that no further allocations can happen in "r", bearing in mind
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
355 // that parallel threads might be attempting allocations.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
356 void par_allocate_remaining_space(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
357
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
358 // Retires an allocation region when it is full or at the end of a
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
359 // GC pause.
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
360 void retire_alloc_region(HeapRegion* alloc_region, bool par);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
361
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
362 // Helper function for two callbacks below.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
363 // "full", if true, indicates that the GC is for a System.gc() request,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
364 // and should collect the entire heap. If "clear_all_soft_refs" is true,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
365 // all soft references are cleared during the GC. If "full" is false,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
366 // "word_size" describes the allocation that the GC should
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
367 // attempt (at least) to satisfy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
368 void do_collection(bool full, bool clear_all_soft_refs,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
369 size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
370
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
371 // Callback from VM_G1CollectFull operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
372 // Perform a full collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
373 void do_full_collection(bool clear_all_soft_refs);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
374
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
375 // Resize the heap if necessary after a full collection. If this is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
376 // after a collect-for allocation, "word_size" is the allocation size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
377 // and will be considered part of the used portion of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
378 void resize_if_necessary_after_full_collection(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
379
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
380 // Callback from VM_G1CollectForAllocation operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
381 // This function does everything necessary/possible to satisfy a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
382 // failed allocation request (including collection, expansion, etc.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
383 HeapWord* satisfy_failed_allocation(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
384
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
385 // Attempting to expand the heap sufficiently
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
386 // to support an allocation of the given "word_size". If
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
387 // successful, perform the allocation and return the address of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
388 // allocated block, or else "NULL".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
389 virtual HeapWord* expand_and_allocate(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
390
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
391 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
392 // Expand the garbage-first heap by at least the given size (in bytes!).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
393 // (Rounds up to a HeapRegion boundary.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
394 virtual void expand(size_t expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
395
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
396 // Do anything common to GC's.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
397 virtual void gc_prologue(bool full);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
398 virtual void gc_epilogue(bool full);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
399
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
400 // We register a region with the fast "in collection set" test. We
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
401 // simply set to true the array slot corresponding to this region.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
402 void register_region_with_in_cset_fast_test(HeapRegion* r) {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
403 assert(_in_cset_fast_test_base != NULL, "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
404 assert(r->in_collection_set(), "invariant");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
405 int index = r->hrs_index();
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
406 assert(0 <= (size_t) index && (size_t) index < _in_cset_fast_test_length,
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
407 "invariant");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
408 assert(!_in_cset_fast_test_base[index], "invariant");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
409 _in_cset_fast_test_base[index] = true;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
410 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
411
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
412 // This is a fast test on whether a reference points into the
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
413 // collection set or not. It does not assume that the reference
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
414 // points into the heap; if it doesn't, it will return false.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
415 bool in_cset_fast_test(oop obj) {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
416 assert(_in_cset_fast_test != NULL, "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
417 if (_g1_committed.contains((HeapWord*) obj)) {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
418 // no need to subtract the bottom of the heap from obj,
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
419 // _in_cset_fast_test is biased
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
420 size_t index = ((size_t) obj) >> HeapRegion::LogOfHRGrainBytes;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
421 bool ret = _in_cset_fast_test[index];
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
422 // let's make sure the result is consistent with what the slower
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
423 // test returns
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
424 assert( ret || !obj_in_cs(obj), "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
425 assert(!ret || obj_in_cs(obj), "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
426 return ret;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
427 } else {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
428 return false;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
429 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
430 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
431
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
432 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
433
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
434 // Shrink the garbage-first heap by at most the given size (in bytes!).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
435 // (Rounds down to a HeapRegion boundary.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
436 virtual void shrink(size_t expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
437 void shrink_helper(size_t expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
438
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
439 // Do an incremental collection: identify a collection set, and evacuate
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
440 // its live objects elsewhere.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
441 virtual void do_collection_pause();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
442
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 // The guts of the incremental collection pause, executed by the vm
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 640
diff changeset
444 // thread.
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 640
diff changeset
445 virtual void do_collection_pause_at_safepoint();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
446
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
447 // Actually do the work of evacuating the collection set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
448 virtual void evacuate_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
449
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
450 // If this is an appropriate right time, do a collection pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
451 // The "word_size" argument, if non-zero, indicates the size of an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
452 // allocation request that is prompting this query.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
453 void do_collection_pause_if_appropriate(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
454
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
455 // The g1 remembered set of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
456 G1RemSet* _g1_rem_set;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
457 // And it's mod ref barrier set, used to track updates for the above.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
458 ModRefBarrierSet* _mr_bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
459
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
460 // A set of cards that cover the objects for which the Rsets should be updated
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
461 // concurrently after the collection.
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
462 DirtyCardQueueSet _dirty_card_queue_set;
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
463
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
464 // The Heap Region Rem Set Iterator.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
465 HeapRegionRemSetIterator** _rem_set_iterator;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
466
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
467 // The closure used to refine a single card.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
468 RefineCardTableEntryClosure* _refine_cte_cl;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
469
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
470 // A function to check the consistency of dirty card logs.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
471 void check_ct_logs_at_safepoint();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473 // After a collection pause, make the regions in the CS into free
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
474 // regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
475 void free_collection_set(HeapRegion* cs_head);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
476
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
477 // Applies "scan_non_heap_roots" to roots outside the heap,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
478 // "scan_rs" to roots inside the heap (having done "set_region" to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479 // indicate the region in which the root resides), and does "scan_perm"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
480 // (setting the generation to the perm generation.) If "scan_rs" is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481 // NULL, then this step is skipped. The "worker_i"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482 // param is for use with parallel roots processing, and should be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483 // the "i" of the calling parallel worker thread's work(i) function.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 // In the sequential case this param will be ignored.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 void g1_process_strong_roots(bool collecting_perm_gen,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
486 SharedHeap::ScanningOption so,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
487 OopClosure* scan_non_heap_roots,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
488 OopsInHeapRegionClosure* scan_rs,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
489 OopsInHeapRegionClosure* scan_so,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
490 OopsInGenClosure* scan_perm,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
491 int worker_i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
492
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
493 void scan_scan_only_set(OopsInHeapRegionClosure* oc,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494 int worker_i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495 void scan_scan_only_region(HeapRegion* hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 OopsInHeapRegionClosure* oc,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497 int worker_i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
498
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
499 // Apply "blk" to all the weak roots of the system. These include
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
500 // JNI weak roots, the code cache, system dictionary, symbol table,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
501 // string table, and referents of reachable weak refs.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
502 void g1_process_weak_roots(OopClosure* root_closure,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 OopClosure* non_root_closure);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
504
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
505 // Invoke "save_marks" on all heap regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
506 void save_marks();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
507
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
508 // Free a heap region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
509 void free_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
510 // A component of "free_region", exposed for 'batching'.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
511 // All the params after "hr" are out params: the used bytes of the freed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
512 // region(s), the number of H regions cleared, the number of regions
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
513 // freed, and pointers to the head and tail of a list of freed contig
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
514 // regions, linked throught the "next_on_unclean_list" field.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
515 void free_region_work(HeapRegion* hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
516 size_t& pre_used,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
517 size_t& cleared_h,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
518 size_t& freed_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
519 UncleanRegionList* list,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
520 bool par = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
521
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
522
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
523 // The concurrent marker (and the thread it runs in.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
524 ConcurrentMark* _cm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
525 ConcurrentMarkThread* _cmThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
526 bool _mark_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
527
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
528 // The concurrent refiner.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
529 ConcurrentG1Refine* _cg1r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
530
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
531 // The concurrent zero-fill thread.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
532 ConcurrentZFThread* _czft;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
533
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
534 // The parallel task queues
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
535 RefToScanQueueSet *_task_queues;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
536
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
537 // True iff a evacuation has failed in the current collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
538 bool _evacuation_failed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
539
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
540 // Set the attribute indicating whether evacuation has failed in the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
541 // current collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
542 void set_evacuation_failed(bool b) { _evacuation_failed = b; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
543
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
544 // Failed evacuations cause some logical from-space objects to have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
545 // forwarding pointers to themselves. Reset them.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546 void remove_self_forwarding_pointers();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
547
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
548 // When one is non-null, so is the other. Together, they each pair is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
549 // an object with a preserved mark, and its mark value.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
550 GrowableArray<oop>* _objs_with_preserved_marks;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
551 GrowableArray<markOop>* _preserved_marks_of_objs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
552
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
553 // Preserve the mark of "obj", if necessary, in preparation for its mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
554 // word being overwritten with a self-forwarding-pointer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
555 void preserve_mark_if_necessary(oop obj, markOop m);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
556
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
557 // The stack of evac-failure objects left to be scanned.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
558 GrowableArray<oop>* _evac_failure_scan_stack;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
559 // The closure to apply to evac-failure objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
560
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
561 OopsInHeapRegionClosure* _evac_failure_closure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
562 // Set the field above.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
563 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
564 set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_closure) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
565 _evac_failure_closure = evac_failure_closure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
566 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
567
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
568 // Push "obj" on the scan stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
569 void push_on_evac_failure_scan_stack(oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570 // Process scan stack entries until the stack is empty.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
571 void drain_evac_failure_scan_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
572 // True iff an invocation of "drain_scan_stack" is in progress; to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
573 // prevent unnecessary recursion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
574 bool _drain_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
575
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
576 // Do any necessary initialization for evacuation-failure handling.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
577 // "cl" is the closure that will be used to process evac-failure
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
578 // objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
579 void init_for_evac_failure(OopsInHeapRegionClosure* cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
580 // Do any necessary cleanup for evacuation-failure handling data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
581 // structures.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
582 void finalize_for_evac_failure();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
583
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
584 // An attempt to evacuate "obj" has failed; take necessary steps.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
585 void handle_evacuation_failure(oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
586 oop handle_evacuation_failure_par(OopsInHeapRegionClosure* cl, oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
587 void handle_evacuation_failure_common(oop obj, markOop m);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
588
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
589
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
590 // Ensure that the relevant gc_alloc regions are set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
591 void get_gc_alloc_regions();
636
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
592 // We're done with GC alloc regions. We are going to tear down the
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
593 // gc alloc list and remove the gc alloc tag from all the regions on
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
594 // that list. However, we will also retain the last (i.e., the one
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
595 // that is half-full) GC alloc region, per GCAllocPurpose, for
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
596 // possible reuse during the next collection, provided
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
597 // _retain_gc_alloc_region[] indicates that it should be the
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
598 // case. Said regions are kept in the _retained_gc_alloc_regions[]
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
599 // array. If the parameter totally is set, we will not retain any
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
600 // regions, irrespective of what _retain_gc_alloc_region[]
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
601 // indicates.
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
602 void release_gc_alloc_regions(bool totally);
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
603 #ifndef PRODUCT
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
604 // Useful for debugging.
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
605 void print_gc_alloc_regions();
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
606 #endif // !PRODUCT
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
607
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
608 // ("Weak") Reference processing support
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
609 ReferenceProcessor* _ref_processor;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
610
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
611 enum G1H_process_strong_roots_tasks {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
612 G1H_PS_mark_stack_oops_do,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
613 G1H_PS_refProcessor_oops_do,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
614 // Leave this one last.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
615 G1H_PS_NumElements
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
616 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
617
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
618 SubTasksDone* _process_strong_tasks;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
619
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
620 // List of regions which require zero filling.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
621 UncleanRegionList _unclean_region_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
622 bool _unclean_regions_coming;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
623
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
624 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
625 void set_refine_cte_cl_concurrency(bool concurrent);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
626
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
627 RefToScanQueue *task_queue(int i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
628
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
629 // A set of cards where updates happened during the GC
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
630 DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; }
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
631
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
632 // Create a G1CollectedHeap with the specified policy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
633 // Must call the initialize method afterwards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
634 // May not return if something goes wrong.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
635 G1CollectedHeap(G1CollectorPolicy* policy);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
636
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
637 // Initialize the G1CollectedHeap to have the initial and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
638 // maximum sizes, permanent generation, and remembered and barrier sets
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
639 // specified by the policy object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
640 jint initialize();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
641
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
642 void ref_processing_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
643
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
644 void set_par_threads(int t) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
645 SharedHeap::set_par_threads(t);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
646 _process_strong_tasks->set_par_threads(t);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
647 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
648
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
649 virtual CollectedHeap::Name kind() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
650 return CollectedHeap::G1CollectedHeap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
651 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
652
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
653 // The current policy object for the collector.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
654 G1CollectorPolicy* g1_policy() const { return _g1_policy; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
655
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
656 // Adaptive size policy. No such thing for g1.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
657 virtual AdaptiveSizePolicy* size_policy() { return NULL; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
658
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
659 // The rem set and barrier set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
660 G1RemSet* g1_rem_set() const { return _g1_rem_set; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
661 ModRefBarrierSet* mr_bs() const { return _mr_bs; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
662
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
663 // The rem set iterator.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
664 HeapRegionRemSetIterator* rem_set_iterator(int i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
665 return _rem_set_iterator[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
666 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
667
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
668 HeapRegionRemSetIterator* rem_set_iterator() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
669 return _rem_set_iterator[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
670 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
671
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
672 unsigned get_gc_time_stamp() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
673 return _gc_time_stamp;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
674 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
675
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
676 void reset_gc_time_stamp() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
677 _gc_time_stamp = 0;
353
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
678 OrderAccess::fence();
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
679 }
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
680
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
681 void increment_gc_time_stamp() {
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
682 ++_gc_time_stamp;
9bb2c10ac07b 6723570: G1: assertion failure: p == current_top or oop(p)->is_oop(),"p is not a block start" (revisited!)
iveresov
parents: 342
diff changeset
683 OrderAccess::fence();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
684 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
685
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
686 void iterate_dirty_card_closure(bool concurrent, int worker_i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
687
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
688 // The shared block offset table array.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
689 G1BlockOffsetSharedArray* bot_shared() const { return _bot_shared; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
690
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
691 // Reference Processing accessor
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
692 ReferenceProcessor* ref_processor() { return _ref_processor; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
693
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
694 // Reserved (g1 only; super method includes perm), capacity and the used
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
695 // portion in bytes.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
696 size_t g1_reserved_obj_bytes() { return _g1_reserved.byte_size(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
697 virtual size_t capacity() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
698 virtual size_t used() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
699 size_t recalculate_used() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
700 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
701 size_t recalculate_used_regions() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
702 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
703
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
704 // These virtual functions do the actual allocation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
705 virtual HeapWord* mem_allocate(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
706 bool is_noref,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
707 bool is_tlab,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
708 bool* gc_overhead_limit_was_exceeded);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
709
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
710 // Some heaps may offer a contiguous region for shared non-blocking
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
711 // allocation, via inlined code (by exporting the address of the top and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
712 // end fields defining the extent of the contiguous allocation region.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
713 // But G1CollectedHeap doesn't yet support this.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
714
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
715 // Return an estimate of the maximum allocation that could be performed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
716 // without triggering any collection or expansion activity. In a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
717 // generational collector, for example, this is probably the largest
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
718 // allocation that could be supported (without expansion) in the youngest
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
719 // generation. It is "unsafe" because no locks are taken; the result
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
720 // should be treated as an approximation, not a guarantee, for use in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
721 // heuristic resizing decisions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
722 virtual size_t unsafe_max_alloc();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
723
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
724 virtual bool is_maximal_no_gc() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
725 return _g1_storage.uncommitted_size() == 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
726 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
727
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
728 // The total number of regions in the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
729 size_t n_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
730
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
731 // The number of regions that are completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
732 size_t max_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
733
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
734 // The number of regions that are completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
735 size_t free_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
736
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737 // The number of regions that are not completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
738 size_t used_regions() { return n_regions() - free_regions(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
740 // True iff the ZF thread should run.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
741 bool should_zf();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
742
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
743 // The number of regions available for "regular" expansion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
744 size_t expansion_regions() { return _expansion_regions; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
745
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
746 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
747 bool regions_accounted_for();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
748 bool print_region_accounting_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
749 void print_region_counts();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
750 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
751
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
752 HeapRegion* alloc_region_from_unclean_list(bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753 HeapRegion* alloc_region_from_unclean_list_locked(bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755 void put_region_on_unclean_list(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 void put_region_on_unclean_list_locked(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
758 void prepend_region_list_on_unclean_list(UncleanRegionList* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
759 void prepend_region_list_on_unclean_list_locked(UncleanRegionList* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
760
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
761 void set_unclean_regions_coming(bool b);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
762 void set_unclean_regions_coming_locked(bool b);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
763 // Wait for cleanup to be complete.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
764 void wait_for_cleanup_complete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
765 // Like above, but assumes that the calling thread owns the Heap_lock.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
766 void wait_for_cleanup_complete_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
767
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
768 // Return the head of the unclean list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
769 HeapRegion* peek_unclean_region_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
770 // Remove and return the head of the unclean list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
771 HeapRegion* pop_unclean_region_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
772
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
773 // List of regions which are zero filled and ready for allocation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
774 HeapRegion* _free_region_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
775 // Number of elements on the free list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
776 size_t _free_region_list_size;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
777
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
778 // If the head of the unclean list is ZeroFilled, move it to the free
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
779 // list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
780 bool move_cleaned_region_to_free_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
781 bool move_cleaned_region_to_free_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
782
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
783 void put_free_region_on_list_locked(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
784 void put_free_region_on_list(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
785
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
786 // Remove and return the head element of the free list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
787 HeapRegion* pop_free_region_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
788
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
789 // If "zero_filled" is true, we first try the free list, then we try the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
790 // unclean list, zero-filling the result. If "zero_filled" is false, we
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
791 // first try the unclean list, then the zero-filled list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
792 HeapRegion* alloc_free_region_from_lists(bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
793
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
794 // Verify the integrity of the region lists.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
795 void remove_allocated_regions_from_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
796 bool verify_region_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
797 bool verify_region_lists_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
798 size_t unclean_region_list_length();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
799 size_t free_region_list_length();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
800
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
801 // Perform a collection of the heap; intended for use in implementing
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
802 // "System.gc". This probably implies as full a collection as the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
803 // "CollectedHeap" supports.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
804 virtual void collect(GCCause::Cause cause);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
805
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
806 // The same as above but assume that the caller holds the Heap_lock.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
807 void collect_locked(GCCause::Cause cause);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
808
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
809 // This interface assumes that it's being called by the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
810 // vm thread. It collects the heap assuming that the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
811 // heap lock is already held and that we are executing in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
812 // the context of the vm thread.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
813 virtual void collect_as_vm_thread(GCCause::Cause cause);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
814
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
815 // True iff a evacuation has failed in the most-recent collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
816 bool evacuation_failed() { return _evacuation_failed; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
817
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
818 // Free a region if it is totally full of garbage. Returns the number of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
819 // bytes freed (0 ==> didn't free it).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
820 size_t free_region_if_totally_empty(HeapRegion *hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
821 void free_region_if_totally_empty_work(HeapRegion *hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
822 size_t& pre_used,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
823 size_t& cleared_h_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824 size_t& freed_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
825 UncleanRegionList* list,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
826 bool par = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
827
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
828 // If we've done free region work that yields the given changes, update
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
829 // the relevant global variables.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
830 void finish_free_region_work(size_t pre_used,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
831 size_t cleared_h_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
832 size_t freed_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
833 UncleanRegionList* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
834
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
835
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
836 // Returns "TRUE" iff "p" points into the allocated area of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
837 virtual bool is_in(const void* p) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
838
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
839 // Return "TRUE" iff the given object address is within the collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
840 // set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
841 inline bool obj_in_cs(oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
842
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
843 // Return "TRUE" iff the given object address is in the reserved
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
844 // region of g1 (excluding the permanent generation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
845 bool is_in_g1_reserved(const void* p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
846 return _g1_reserved.contains(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
847 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
848
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
849 // Returns a MemRegion that corresponds to the space that has been
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
850 // committed in the heap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
851 MemRegion g1_committed() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
852 return _g1_committed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
853 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
854
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
855 NOT_PRODUCT( bool is_in_closed_subset(const void* p) const; )
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
856
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
857 // Dirty card table entries covering a list of young regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858 void dirtyCardsForYoungRegions(CardTableModRefBS* ct_bs, HeapRegion* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
859
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
860 // This resets the card table to all zeros. It is used after
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
861 // a collection pause which used the card table to claim cards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
862 void cleanUpCardTable();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
863
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
864 // Iteration functions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
865
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
866 // Iterate over all the ref-containing fields of all objects, calling
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
867 // "cl.do_oop" on each.
678
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
868 virtual void oop_iterate(OopClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
869 oop_iterate(cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
870 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
871 void oop_iterate(OopClosure* cl, bool do_perm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
872
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
873 // Same as above, restricted to a memory region.
678
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
874 virtual void oop_iterate(MemRegion mr, OopClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
875 oop_iterate(mr, cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
876 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
877 void oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
878
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
879 // Iterate over all objects, calling "cl.do_object" on each.
678
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
880 virtual void object_iterate(ObjectClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
881 object_iterate(cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
882 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
883 virtual void safe_object_iterate(ObjectClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
884 object_iterate(cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
885 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
886 void object_iterate(ObjectClosure* cl, bool do_perm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
887
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
888 // Iterate over all objects allocated since the last collection, calling
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
889 // "cl.do_object" on each. The heap must have been initialized properly
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
890 // to support this function, or else this call will fail.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
891 virtual void object_iterate_since_last_GC(ObjectClosure* cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
892
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
893 // Iterate over all spaces in use in the heap, in ascending address order.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
894 virtual void space_iterate(SpaceClosure* cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
895
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
896 // Iterate over heap regions, in address order, terminating the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
897 // iteration early if the "doHeapRegion" method returns "true".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
898 void heap_region_iterate(HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
899
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
900 // Iterate over heap regions starting with r (or the first region if "r"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
901 // is NULL), in address order, terminating early if the "doHeapRegion"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 // method returns "true".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
903 void heap_region_iterate_from(HeapRegion* r, HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
904
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
905 // As above but starting from the region at index idx.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
906 void heap_region_iterate_from(int idx, HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
907
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
908 HeapRegion* region_at(size_t idx);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
909
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
910 // Divide the heap region sequence into "chunks" of some size (the number
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
911 // of regions divided by the number of parallel threads times some
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
912 // overpartition factor, currently 4). Assumes that this will be called
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
913 // in parallel by ParallelGCThreads worker threads with discinct worker
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
914 // ids in the range [0..max(ParallelGCThreads-1, 1)], that all parallel
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
915 // calls will use the same "claim_value", and that that claim value is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
916 // different from the claim_value of any heap region before the start of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
917 // the iteration. Applies "blk->doHeapRegion" to each of the regions, by
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
918 // attempting to claim the first region in each chunk, and, if
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
919 // successful, applying the closure to each region in the chunk (and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
920 // setting the claim value of the second and subsequent regions of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
921 // chunk.) For now requires that "doHeapRegion" always returns "false",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
922 // i.e., that a closure never attempt to abort a traversal.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
923 void heap_region_par_iterate_chunked(HeapRegionClosure* blk,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
924 int worker,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
925 jint claim_value);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
926
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
927 // It resets all the region claim values to the default.
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
928 void reset_heap_region_claim_values();
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
929
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
930 #ifdef ASSERT
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
931 bool check_heap_region_claim_values(jint claim_value);
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
932 #endif // ASSERT
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
933
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
934 // Iterate over the regions (if any) in the current collection set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
935 void collection_set_iterate(HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
936
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
937 // As above but starting from region r
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
938 void collection_set_iterate_from(HeapRegion* r, HeapRegionClosure *blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
939
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
940 // Returns the first (lowest address) compactible space in the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
941 virtual CompactibleSpace* first_compactible_space();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
942
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
943 // A CollectedHeap will contain some number of spaces. This finds the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
944 // space containing a given address, or else returns NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
945 virtual Space* space_containing(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
946
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
947 // A G1CollectedHeap will contain some number of heap regions. This
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
948 // finds the region containing a given address, or else returns NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
949 HeapRegion* heap_region_containing(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
950
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
951 // Like the above, but requires "addr" to be in the heap (to avoid a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
952 // null-check), and unlike the above, may return an continuing humongous
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
953 // region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
954 HeapRegion* heap_region_containing_raw(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
955
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
956 // A CollectedHeap is divided into a dense sequence of "blocks"; that is,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
957 // each address in the (reserved) heap is a member of exactly
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
958 // one block. The defining characteristic of a block is that it is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
959 // possible to find its size, and thus to progress forward to the next
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
960 // block. (Blocks may be of different sizes.) Thus, blocks may
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
961 // represent Java objects, or they might be free blocks in a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
962 // free-list-based heap (or subheap), as long as the two kinds are
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
963 // distinguishable and the size of each is determinable.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
964
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
965 // Returns the address of the start of the "block" that contains the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
966 // address "addr". We say "blocks" instead of "object" since some heaps
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
967 // may not pack objects densely; a chunk may either be an object or a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
968 // non-object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
969 virtual HeapWord* block_start(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
970
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
971 // Requires "addr" to be the start of a chunk, and returns its size.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
972 // "addr + size" is required to be the start of a new chunk, or the end
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
973 // of the active area of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
974 virtual size_t block_size(const HeapWord* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
975
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
976 // Requires "addr" to be the start of a block, and returns "TRUE" iff
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
977 // the block is an object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
978 virtual bool block_is_obj(const HeapWord* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
979
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
980 // Does this heap support heap inspection? (+PrintClassHistogram)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
981 virtual bool supports_heap_inspection() const { return true; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
982
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
983 // Section on thread-local allocation buffers (TLABs)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 // See CollectedHeap for semantics.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986 virtual bool supports_tlab_allocation() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 virtual size_t tlab_capacity(Thread* thr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
988 virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
989 virtual HeapWord* allocate_new_tlab(size_t size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
990
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
991 // Can a compiler initialize a new object without store barriers?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
992 // This permission only extends from the creation of a new object
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993 // via a TLAB up to the first subsequent safepoint.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
994 virtual bool can_elide_tlab_store_barriers() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
995 // Since G1's TLAB's may, on occasion, come from non-young regions
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
996 // as well. (Is there a flag controlling that? XXX)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
998 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
999
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1000 // Can a compiler elide a store barrier when it writes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1001 // a permanent oop into the heap? Applies when the compiler
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1002 // is storing x to the heap, where x->is_perm() is true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1003 virtual bool can_elide_permanent_oop_store_barriers() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1004 // At least until perm gen collection is also G1-ified, at
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1005 // which point this should return false.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1006 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1007 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1008
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1009 virtual bool allocs_are_zero_filled();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1010
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1011 // The boundary between a "large" and "small" array of primitives, in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012 // words.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1013 virtual size_t large_typearray_limit();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1014
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1015 // Returns "true" iff the given word_size is "very large".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 static bool isHumongous(size_t word_size) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1017 return word_size >= VeryLargeInWords;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1018 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1019
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1020 // Update mod union table with the set of dirty cards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1021 void updateModUnion();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1022
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1023 // Set the mod union bits corresponding to the given memRegion. Note
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1024 // that this is always a safe operation, since it doesn't clear any
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1025 // bits.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1026 void markModUnionRange(MemRegion mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1027
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1028 // Records the fact that a marking phase is no longer in progress.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1029 void set_marking_complete() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1030 _mark_in_progress = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1031 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1032 void set_marking_started() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1033 _mark_in_progress = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1034 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1035 bool mark_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1036 return _mark_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1037 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1038
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1039 // Print the maximum heap capacity.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1040 virtual size_t max_capacity() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1041
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1042 virtual jlong millis_since_last_gc();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1043
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1044 // Perform any cleanup actions necessary before allowing a verification.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1045 virtual void prepare_for_verify();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1046
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1047 // Perform verification.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1048 virtual void verify(bool allow_dirty, bool silent);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1049 virtual void print() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1050 virtual void print_on(outputStream* st) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1051
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1052 virtual void print_gc_threads_on(outputStream* st) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1053 virtual void gc_threads_do(ThreadClosure* tc) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1054
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1055 // Override
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1056 void print_tracing_info() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1057
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1058 // If "addr" is a pointer into the (reserved?) heap, returns a positive
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1059 // number indicating the "arena" within the heap in which "addr" falls.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1060 // Or else returns 0.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1061 virtual int addr_to_arena_id(void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1062
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1063 // Convenience function to be used in situations where the heap type can be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1064 // asserted to be this type.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1065 static G1CollectedHeap* heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1066
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1067 void empty_young_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1068 bool should_set_young_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1069
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1070 void set_region_short_lived_locked(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1071 // add appropriate methods for any other surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1072
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1073 void young_list_rs_length_sampling_init() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1074 _young_list->rs_length_sampling_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1075 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1076 bool young_list_rs_length_sampling_more() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1077 return _young_list->rs_length_sampling_more();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1078 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1079 void young_list_rs_length_sampling_next() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1080 _young_list->rs_length_sampling_next();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1081 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1082 size_t young_list_sampled_rs_lengths() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1083 return _young_list->sampled_rs_lengths();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1084 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1085
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1086 size_t young_list_length() { return _young_list->length(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1087 size_t young_list_scan_only_length() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1088 return _young_list->scan_only_length(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1089
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1090 HeapRegion* pop_region_from_young_list() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1091 return _young_list->pop_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1092 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1093
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1094 HeapRegion* young_list_first_region() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1095 return _young_list->first_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1096 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1097
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1098 // debugging
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1099 bool check_young_list_well_formed() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1100 return _young_list->check_list_well_formed();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1101 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1102 bool check_young_list_empty(bool ignore_scan_only_list,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1103 bool check_sample = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1104
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1105 // *** Stuff related to concurrent marking. It's not clear to me that so
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1106 // many of these need to be public.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1107
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1108 // The functions below are helper functions that a subclass of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1109 // "CollectedHeap" can use in the implementation of its virtual
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1110 // functions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1111 // This performs a concurrent marking of the live objects in a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1112 // bitmap off to the side.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1113 void doConcurrentMark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1114
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1115 // This is called from the marksweep collector which then does
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1116 // a concurrent mark and verifies that the results agree with
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1117 // the stop the world marking.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1118 void checkConcurrentMark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1119 void do_sync_mark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1120
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1121 bool isMarkedPrev(oop obj) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1122 bool isMarkedNext(oop obj) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1123
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1124 // Determine if an object is dead, given the object and also
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1125 // the region to which the object belongs. An object is dead
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1126 // iff a) it was not allocated since the last mark and b) it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1127 // is not marked.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1128
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1129 bool is_obj_dead(const oop obj, const HeapRegion* hr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1130 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1131 !hr->obj_allocated_since_prev_marking(obj) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1132 !isMarkedPrev(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1133 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1134
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1135 // This is used when copying an object to survivor space.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1136 // If the object is marked live, then we mark the copy live.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1137 // If the object is allocated since the start of this mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1138 // cycle, then we mark the copy live.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1139 // If the object has been around since the previous mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1140 // phase, and hasn't been marked yet during this phase,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1141 // then we don't mark it, we just wait for the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1142 // current marking cycle to get to it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1143
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1144 // This function returns true when an object has been
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1145 // around since the previous marking and hasn't yet
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1146 // been marked during this marking.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1147
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1148 bool is_obj_ill(const oop obj, const HeapRegion* hr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1149 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1150 !hr->obj_allocated_since_next_marking(obj) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1151 !isMarkedNext(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1152 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1153
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1154 // Determine if an object is dead, given only the object itself.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1155 // This will find the region to which the object belongs and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1156 // then call the region version of the same function.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1157
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1158 // Added if it is in permanent gen it isn't dead.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1159 // Added if it is NULL it isn't dead.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1160
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1161 bool is_obj_dead(oop obj) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1162 HeapRegion* hr = heap_region_containing(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163 if (hr == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1164 if (Universe::heap()->is_in_permanent(obj))
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1165 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1166 else if (obj == NULL) return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1167 else return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1168 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1169 else return is_obj_dead(obj, hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1170 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1171
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1172 bool is_obj_ill(oop obj) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1173 HeapRegion* hr = heap_region_containing(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1174 if (hr == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1175 if (Universe::heap()->is_in_permanent(obj))
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1176 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1177 else if (obj == NULL) return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1178 else return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1179 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1180 else return is_obj_ill(obj, hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1181 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1182
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1183 // The following is just to alert the verification code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1184 // that a full collection has occurred and that the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1185 // remembered sets are no longer up to date.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1186 bool _full_collection;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1187 void set_full_collection() { _full_collection = true;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1188 void clear_full_collection() {_full_collection = false;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1189 bool full_collection() {return _full_collection;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1190
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1191 ConcurrentMark* concurrent_mark() const { return _cm; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1192 ConcurrentG1Refine* concurrent_g1_refine() const { return _cg1r; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1193
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1194 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1195 void stop_conc_gc_threads();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1196
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1197 // <NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1198
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1199 double predict_region_elapsed_time_ms(HeapRegion* hr, bool young);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1200 void check_if_region_is_too_expensive(double predicted_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1201 size_t pending_card_num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1202 size_t max_pending_card_num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1203 size_t cards_scanned();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1204
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1205 // </NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1206
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1207 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1208 size_t _max_heap_capacity;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1209
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1210 // debug_only(static void check_for_valid_allocation_state();)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1211
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1212 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1213 // Temporary: call to mark things unimplemented for the G1 heap (e.g.,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1214 // MemoryService). In productization, we can make this assert false
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1215 // to catch such places (as well as searching for calls to this...)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1216 static void g1_unimplemented();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1217
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1218 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1219
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1220 // Local Variables: ***
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1221 // c-indentation-style: gnu ***
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1222 // End: ***