annotate src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @ 1705:2d160770d2e5

6814437: G1: remove the _new_refs array Summary: The per-worker _new_refs array is used to hold references that point into the collection set. It is populated during RSet updating and subsequently processed. In the event of an evacuation failure it processed again to recreate the RSets of regions in the collection set. Remove the per-worker _new_refs array by processing the references directly. Use a DirtyCardQueue to hold the cards containing the references so that the RSets of regions in the collection set can be recreated when handling an evacuation failure. Reviewed-by: iveresov, jmasa, tonyp
author johnc
date Mon, 02 Aug 2010 12:51:43 -0700
parents 4e5661ba9d98
children 5f429ee79634
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 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. 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 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
21 * questions.
342
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
1311
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 1261
diff changeset
59 typedef GenericTaskQueue<StarTask> RefToScanQueue;
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 1261
diff changeset
60 typedef GenericTaskQueueSet<RefToScanQueue> RefToScanQueueSet;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61
807
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
62 typedef int RegionIdx_t; // needs to hold [ 0..max_regions() )
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
63 typedef int CardIdx_t; // needs to hold [ 0..CardsPerRegion )
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
64
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65 enum G1GCThreadGroups {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 G1CRGroup = 0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 G1ZFGroup = 1,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 G1CMGroup = 2,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 G1CLGroup = 3
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 enum GCAllocPurpose {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 GCAllocForTenured,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 GCAllocForSurvived,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 GCAllocPurposeCount
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 class YoungList : public CHeapObj {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 HeapRegion* _head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
84 HeapRegion* _survivor_head;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
85 HeapRegion* _survivor_tail;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
86
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
87 HeapRegion* _curr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
88
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 size_t _length;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
90 size_t _survivor_length;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92 size_t _last_sampled_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
93 size_t _sampled_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
95 void empty_list(HeapRegion* list);
342
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
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
100 void push_region(HeapRegion* hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
101 void add_survivor_region(HeapRegion* hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
102
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
103 void empty_list();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
104 bool is_empty() { return _length == 0; }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
105 size_t length() { return _length; }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
106 size_t survivor_length() { return _survivor_length; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108 void rs_length_sampling_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 bool rs_length_sampling_more();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
110 void rs_length_sampling_next();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
111
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
112 void reset_sampled_info() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
113 _last_sampled_rs_lengths = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 size_t sampled_rs_lengths() { return _last_sampled_rs_lengths; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 // for development purposes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 void reset_auxilary_lists();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
119 void clear() { _head = NULL; _length = 0; }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
120
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
121 void clear_survivors() {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
122 _survivor_head = NULL;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
123 _survivor_tail = NULL;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
124 _survivor_length = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
125 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
126
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 HeapRegion* first_region() { return _head; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128 HeapRegion* first_survivor_region() { return _survivor_head; }
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
129 HeapRegion* last_survivor_region() { return _survivor_tail; }
342
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 // debugging
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132 bool check_list_well_formed();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
133 bool check_list_empty(bool check_sample = true);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 void print();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 class RefineCardTableEntryClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 class G1CollectedHeap : public SharedHeap {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 friend class VM_G1CollectForAllocation;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 friend class VM_GenCollectForPermanentAllocation;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 friend class VM_G1CollectFull;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 friend class VM_G1IncCollectionPause;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 friend class VMStructs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 // Closures used in implementation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 friend class G1ParCopyHelper;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 friend class G1IsAliveClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 friend class G1EvacuateFollowersClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 friend class G1ParScanThreadState;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 friend class G1ParScanClosureSuper;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 friend class G1ParEvacuateFollowersClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 friend class G1ParTask;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 friend class G1FreeGarbageRegionClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 friend class RefineCardTableEntryClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155 friend class G1PrepareCompactClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 friend class RegionSorter;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 friend class CountRCClosure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 friend class EvacPopObjClosure;
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
159 friend class G1ParCleanupCTTask;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 // Other related classes.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 friend class G1MarkSweep;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165 // The one and only G1CollectedHeap, so static functions can find it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 static G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
168 static size_t _humongous_object_threshold_in_words;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
169
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 // Storage for the G1 heap (excludes the permanent generation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171 VirtualSpace _g1_storage;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 MemRegion _g1_reserved;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 // The part of _g1_storage that is currently committed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 MemRegion _g1_committed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 // The maximum part of _g1_storage that has ever been committed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 MemRegion _g1_max_committed;
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 number of regions that are completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 size_t _free_regions;
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 number of regions we could create by expansion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184 size_t _expansion_regions;
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 // 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
187 size_t count_free_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 // 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
189 size_t count_free_regions_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 // The block offset table for the G1 heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 G1BlockOffsetSharedArray* _bot_shared;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 // 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
195 // lists, before and after full GC.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 void tear_down_region_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 void rebuild_region_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 // 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
199 // they are empty after full collection.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 void set_used_regions_to_need_zero_fill();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 // The sequence of all heap regions in the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 HeapRegionSeq* _hrs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 // The region from which normal-sized objects are currently being
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 // allocated. May be NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 HeapRegion* _cur_alloc_region;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 // Postcondition: cur_alloc_region == NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 void abandon_cur_alloc_region();
636
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
211 void abandon_gc_alloc_regions();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 // 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
214 // a GC.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 HeapRegion* _gc_alloc_regions[GCAllocPurposeCount];
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
216 size_t _gc_alloc_region_counts[GCAllocPurposeCount];
636
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
217 // These are the regions, one per GCAllocPurpose, that are half-full
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
218 // 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
219 // next collection.
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
220 HeapRegion* _retained_gc_alloc_regions[GCAllocPurposeCount];
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
221 // 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
222 // 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
223 // collection (this is specified per GCAllocPurpose)
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
224 bool _retain_gc_alloc_region[GCAllocPurposeCount];
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
226 // 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
227 // current collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
228 HeapRegion* _gc_alloc_region_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
230 // Determines PLAB size for a particular allocation purpose.
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
231 static size_t desired_plab_sz(GCAllocPurpose purpose);
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
232
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 // 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
234 void push_gc_alloc_region(HeapRegion* hr);
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 // This should only be called single-threaded. Undeclares all GC alloc
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 // regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 void forget_alloc_region_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240 // 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
241 // associated bookkeeping.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 void set_gc_alloc_region(int purpose, HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 // Check well-formedness of alloc region list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 bool check_gc_alloc_regions();
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 // 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
248 // than the current allocation region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249 size_t _summary_bytes_used;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
251 // 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
252 // the collection set or not. Basically, we have an array, with one
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
253 // byte per region, and that byte denotes whether the corresponding
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
254 // region is in the collection set or not. The entry corresponding
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
255 // 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
256 // _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
257 // biased so that it actually points to address 0 of the address
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
258 // 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
259 // the address to address into it, instead of having to subtract the
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
260 // bottom of the heap from the address before shifting it; basically
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
261 // it works in the same way the card table works).
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
262 bool* _in_cset_fast_test;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
263
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
264 // The allocated array used for the fast test on whether a reference
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
265 // 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
266 // free the array.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
267 bool* _in_cset_fast_test_base;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
268
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
269 // The length of the _in_cset_fast_test_base array.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
270 size_t _in_cset_fast_test_length;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
271
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
272 volatile unsigned _gc_time_stamp;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
273
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
274 size_t* _surviving_young_words;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
275
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
276 void setup_surviving_young_words();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
277 void update_surviving_young_words(size_t* surv_young_words);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
278 void cleanup_surviving_young_words();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
279
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
280 // It decides whether an explicit GC should start a concurrent cycle
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
281 // instead of doing a STW GC. Currently, a concurrent cycle is
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
282 // explicitly started if:
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
283 // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
284 // (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
285 bool should_do_concurrent_full_gc(GCCause::Cause cause);
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
286
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
287 // Keeps track of how many "full collections" (i.e., Full GCs or
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
288 // concurrent cycles) we have completed. The number of them we have
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
289 // started is maintained in _total_full_collections in CollectedHeap.
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
290 volatile unsigned int _full_collections_completed;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
291
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
292 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
293
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
294 // 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
295 // since the last call to "save_marks".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
296 bool all_alloc_regions_no_allocs_since_save_marks();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
297 // Perform finalization stuff on all allocation regions.
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
298 void retire_all_alloc_regions();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
299
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
300 // The number of regions allocated to hold humongous objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
301 int _num_humongous_regions;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
302 YoungList* _young_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
303
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
304 // The current policy object for the collector.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 G1CollectorPolicy* _g1_policy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307 // Parallel allocation lock to protect the current allocation region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
308 Mutex _par_alloc_during_gc_lock;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309 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
310
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
311 // If possible/desirable, allocate a new HeapRegion for normal object
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
312 // allocation sufficient for an allocation of the given "word_size".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
313 // 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
314 // 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
315 // zero-filled region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
316 // (Returning NULL will trigger a GC.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
317 virtual HeapRegion* newAllocRegion_work(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
318 bool do_expand,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
319 bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
320
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
321 virtual HeapRegion* newAllocRegion(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
322 bool zero_filled = true) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
323 return newAllocRegion_work(word_size, false, zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
324 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
325 virtual HeapRegion* newAllocRegionWithExpansion(int purpose,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
326 size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
327 bool zero_filled = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
328
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
329 // 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
330 // Returns "NULL" on failure.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
331 virtual HeapWord* humongousObjAllocate(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
332
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333 // 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
334 // Returning NULL will trigger GC or heap expansion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
335 // These two methods have rather awkward pre- and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 // post-conditions. If they are called outside a safepoint, then
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337 // 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
338 // 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
339 // value. attempt_allocation_slow() also dirties the cards of a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
340 // newly-allocated young region after it releases the heap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
341 // lock. This change in interface was the neatest way to achieve
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
342 // this card dirtying without affecting mem_allocate(), which is a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
343 // more frequently called method. We tried two or three different
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
344 // approaches, but they were even more hacky.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
345 HeapWord* attempt_allocation(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
346 bool permit_collection_pause = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
347
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
348 HeapWord* attempt_allocation_slow(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
349 bool permit_collection_pause = true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
351 // Allocate blocks during garbage collection. Will ensure an
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
352 // allocation region, either by picking one or expanding the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
353 // 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
354 // 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
355 HeapWord* allocate_during_gc(GCAllocPurpose purpose, size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
356 HeapWord* par_allocate_during_gc(GCAllocPurpose purpose, size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
357
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
358 HeapWord* allocate_during_gc_slow(GCAllocPurpose purpose,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
359 HeapRegion* alloc_region,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
360 bool par,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
361 size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
362
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
363 // 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
364 // that parallel threads might be attempting allocations.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
365 void par_allocate_remaining_space(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
366
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
367 // 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
368 // GC pause.
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
369 void retire_alloc_region(HeapRegion* alloc_region, bool par);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
370
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
371 // - if explicit_gc is true, the GC is for a System.gc() or a heap
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
372 // inspection request and should collect the entire heap
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
373 // - if clear_all_soft_refs is true, all soft references are cleared
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
374 // during the GC
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
375 // - if explicit_gc is false, word_size describes the allocation that
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
376 // the GC should attempt (at least) to satisfy
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
377 void do_collection(bool explicit_gc,
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
378 bool clear_all_soft_refs,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
379 size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
380
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
381 // Callback from VM_G1CollectFull operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
382 // Perform a full collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
383 void do_full_collection(bool clear_all_soft_refs);
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 // 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
386 // after a collect-for allocation, "word_size" is the allocation size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
387 // 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
388 void resize_if_necessary_after_full_collection(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
389
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
390 // Callback from VM_G1CollectForAllocation operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
391 // This function does everything necessary/possible to satisfy a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
392 // failed allocation request (including collection, expansion, etc.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
393 HeapWord* satisfy_failed_allocation(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
394
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
395 // Attempting to expand the heap sufficiently
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
396 // to support an allocation of the given "word_size". If
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
397 // successful, perform the allocation and return the address of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
398 // allocated block, or else "NULL".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
399 virtual HeapWord* expand_and_allocate(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
400
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
401 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
402 // 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
403 // (Rounds up to a HeapRegion boundary.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
404 virtual void expand(size_t expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
405
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
406 // Do anything common to GC's.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
407 virtual void gc_prologue(bool full);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
408 virtual void gc_epilogue(bool full);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
409
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
410 // We register a region with the fast "in collection set" test. We
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
411 // simply set to true the array slot corresponding to this region.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
412 void register_region_with_in_cset_fast_test(HeapRegion* r) {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
413 assert(_in_cset_fast_test_base != NULL, "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
414 assert(r->in_collection_set(), "invariant");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
415 int index = r->hrs_index();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
416 assert(0 <= index && (size_t) index < _in_cset_fast_test_length, "invariant");
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
417 assert(!_in_cset_fast_test_base[index], "invariant");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
418 _in_cset_fast_test_base[index] = true;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
419 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
420
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
421 // This is a fast test on whether a reference points into the
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
422 // collection set or not. It does not assume that the reference
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
423 // points into the heap; if it doesn't, it will return false.
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
424 bool in_cset_fast_test(oop obj) {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
425 assert(_in_cset_fast_test != NULL, "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
426 if (_g1_committed.contains((HeapWord*) obj)) {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
427 // no need to subtract the bottom of the heap from obj,
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
428 // _in_cset_fast_test is biased
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
429 size_t index = ((size_t) obj) >> HeapRegion::LogOfHRGrainBytes;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
430 bool ret = _in_cset_fast_test[index];
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
431 // let's make sure the result is consistent with what the slower
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
432 // test returns
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
433 assert( ret || !obj_in_cs(obj), "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
434 assert(!ret || obj_in_cs(obj), "sanity");
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
435 return ret;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
436 } else {
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
437 return false;
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
438 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
439 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 519
diff changeset
440
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
441 void clear_cset_fast_test() {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
442 assert(_in_cset_fast_test_base != NULL, "sanity");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
443 memset(_in_cset_fast_test_base, false,
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
444 _in_cset_fast_test_length * sizeof(bool));
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
445 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
446
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
447 // This is called at the end of either a concurrent cycle or a Full
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
448 // GC to update the number of full collections completed. Those two
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
449 // can happen in a nested fashion, i.e., we start a concurrent
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
450 // cycle, a Full GC happens half-way through it which ends first,
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
451 // and then the cycle notices that a Full GC happened and ends
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
452 // too. The outer parameter is a boolean to help us do a bit tighter
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
453 // consistency checking in the method. If outer is false, the caller
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
454 // is the inner caller in the nesting (i.e., the Full GC). If outer
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
455 // is true, the caller is the outer caller in this nesting (i.e.,
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
456 // the concurrent cycle). Further nesting is not currently
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
457 // supported. The end of the this call also notifies the
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
458 // FullGCCount_lock in case a Java thread is waiting for a full GC
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
459 // to happen (e.g., it called System.gc() with
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
460 // +ExplicitGCInvokesConcurrent).
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
461 void increment_full_collections_completed(bool outer);
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
462
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
463 unsigned int full_collections_completed() {
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
464 return _full_collections_completed;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
465 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
466
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
467 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
468
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
469 // 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
470 // (Rounds down to a HeapRegion boundary.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
471 virtual void shrink(size_t expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472 void shrink_helper(size_t expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
474 // Do an incremental collection: identify a collection set, and evacuate
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
475 // its live objects elsewhere.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
476 virtual void do_collection_pause();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
477
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
478 // 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
479 // thread.
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
480 virtual void do_collection_pause_at_safepoint(double target_pause_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482 // Actually do the work of evacuating the collection set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483 virtual void evacuate_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 // If this is an appropriate right time, do a collection pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
486 // 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
487 // allocation request that is prompting this query.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
488 void do_collection_pause_if_appropriate(size_t word_size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
489
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
490 // The g1 remembered set of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
491 G1RemSet* _g1_rem_set;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
492 // 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
493 ModRefBarrierSet* _mr_bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
495 // 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
496 // concurrently after the collection.
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
497 DirtyCardQueueSet _dirty_card_queue_set;
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
498
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
499 // The Heap Region Rem Set Iterator.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
500 HeapRegionRemSetIterator** _rem_set_iterator;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
501
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
502 // The closure used to refine a single card.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 RefineCardTableEntryClosure* _refine_cte_cl;
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 // A function to check the consistency of dirty card logs.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
506 void check_ct_logs_at_safepoint();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
507
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
508 // A DirtyCardQueueSet that is used to hold cards that contain
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
509 // references into the current collection set. This is used to
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
510 // update the remembered sets of the regions in the collection
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
511 // set in the event of an evacuation failure.
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
512 DirtyCardQueueSet _into_cset_dirty_card_queue_set;
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
513
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
514 // 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
515 // regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
516 void free_collection_set(HeapRegion* cs_head);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
517
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
518 // Abandon the current collection set without recording policy
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
519 // statistics or updating free lists.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
520 void abandon_collection_set(HeapRegion* cs_head);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
521
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
522 // Applies "scan_non_heap_roots" to roots outside the heap,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
523 // "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
524 // 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
525 // (setting the generation to the perm generation.) If "scan_rs" is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
526 // NULL, then this step is skipped. The "worker_i"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
527 // param is for use with parallel roots processing, and should be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
528 // 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
529 // In the sequential case this param will be ignored.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
530 void g1_process_strong_roots(bool collecting_perm_gen,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
531 SharedHeap::ScanningOption so,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
532 OopClosure* scan_non_heap_roots,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
533 OopsInHeapRegionClosure* scan_rs,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
534 OopsInGenClosure* scan_perm,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
535 int worker_i);
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 // 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
538 // JNI weak roots, the code cache, system dictionary, symbol table,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
539 // string table, and referents of reachable weak refs.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
540 void g1_process_weak_roots(OopClosure* root_closure,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
541 OopClosure* non_root_closure);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
542
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
543 // Invoke "save_marks" on all heap regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
544 void save_marks();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
545
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
546 // Free a heap region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
547 void free_region(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
548 // A component of "free_region", exposed for 'batching'.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
549 // 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
550 // 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
551 // 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
552 // regions, linked throught the "next_on_unclean_list" field.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
553 void free_region_work(HeapRegion* hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
554 size_t& pre_used,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
555 size_t& cleared_h,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
556 size_t& freed_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
557 UncleanRegionList* list,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
558 bool par = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
559
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 // The concurrent marker (and the thread it runs in.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
562 ConcurrentMark* _cm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
563 ConcurrentMarkThread* _cmThread;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
564 bool _mark_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
565
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
566 // The concurrent refiner.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
567 ConcurrentG1Refine* _cg1r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
568
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
569 // The concurrent zero-fill thread.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
570 ConcurrentZFThread* _czft;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
571
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
572 // The parallel task queues
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
573 RefToScanQueueSet *_task_queues;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
574
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
575 // True iff a evacuation has failed in the current collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
576 bool _evacuation_failed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
577
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
578 // Set the attribute indicating whether evacuation has failed in the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
579 // current collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
580 void set_evacuation_failed(bool b) { _evacuation_failed = b; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
581
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
582 // Failed evacuations cause some logical from-space objects to have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
583 // forwarding pointers to themselves. Reset them.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
584 void remove_self_forwarding_pointers();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
585
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
586 // 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
587 // an object with a preserved mark, and its mark value.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
588 GrowableArray<oop>* _objs_with_preserved_marks;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
589 GrowableArray<markOop>* _preserved_marks_of_objs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
590
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
591 // 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
592 // word being overwritten with a self-forwarding-pointer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
593 void preserve_mark_if_necessary(oop obj, markOop m);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
594
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
595 // The stack of evac-failure objects left to be scanned.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
596 GrowableArray<oop>* _evac_failure_scan_stack;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
597 // The closure to apply to evac-failure objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
598
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
599 OopsInHeapRegionClosure* _evac_failure_closure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
600 // Set the field above.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
601 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
602 set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_closure) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
603 _evac_failure_closure = evac_failure_closure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
604 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
605
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
606 // Push "obj" on the scan stack.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
607 void push_on_evac_failure_scan_stack(oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
608 // Process scan stack entries until the stack is empty.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
609 void drain_evac_failure_scan_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
610 // 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
611 // prevent unnecessary recursion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
612 bool _drain_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
613
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
614 // Do any necessary initialization for evacuation-failure handling.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
615 // "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
616 // objects.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
617 void init_for_evac_failure(OopsInHeapRegionClosure* cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
618 // Do any necessary cleanup for evacuation-failure handling data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
619 // structures.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
620 void finalize_for_evac_failure();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
621
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
622 // An attempt to evacuate "obj" has failed; take necessary steps.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
623 void handle_evacuation_failure(oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
624 oop handle_evacuation_failure_par(OopsInHeapRegionClosure* cl, oop obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
625 void handle_evacuation_failure_common(oop obj, markOop m);
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
628 // Ensure that the relevant gc_alloc regions are set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
629 void get_gc_alloc_regions();
636
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
630 // 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
631 // 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
632 // 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
633 // that is half-full) GC alloc region, per GCAllocPurpose, for
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
634 // possible reuse during the next collection, provided
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
635 // _retain_gc_alloc_region[] indicates that it should be the
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
636 // case. Said regions are kept in the _retained_gc_alloc_regions[]
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
637 // 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
638 // regions, irrespective of what _retain_gc_alloc_region[]
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
639 // indicates.
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
640 void release_gc_alloc_regions(bool totally);
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
641 #ifndef PRODUCT
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
642 // Useful for debugging.
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
643 void print_gc_alloc_regions();
6c4cea9bfa11 6604422: G1: re-use half-promoted regions
tonyp
parents: 616
diff changeset
644 #endif // !PRODUCT
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
645
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
646 // ("Weak") Reference processing support
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
647 ReferenceProcessor* _ref_processor;
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 enum G1H_process_strong_roots_tasks {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
650 G1H_PS_mark_stack_oops_do,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
651 G1H_PS_refProcessor_oops_do,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
652 // Leave this one last.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
653 G1H_PS_NumElements
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
654 };
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 SubTasksDone* _process_strong_tasks;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
657
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
658 // List of regions which require zero filling.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
659 UncleanRegionList _unclean_region_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
660 bool _unclean_regions_coming;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
661
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
662 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
663 void set_refine_cte_cl_concurrency(bool concurrent);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
664
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
665 RefToScanQueue *task_queue(int i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
666
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 545
diff changeset
667 // 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
668 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
669
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
670 // A DirtyCardQueueSet that is used to hold cards that contain
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
671 // references into the current collection set. This is used to
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
672 // update the remembered sets of the regions in the collection
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
673 // set in the event of an evacuation failure.
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
674 DirtyCardQueueSet& into_cset_dirty_card_queue_set()
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
675 { return _into_cset_dirty_card_queue_set; }
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
676
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
677 // Create a G1CollectedHeap with the specified policy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
678 // Must call the initialize method afterwards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
679 // May not return if something goes wrong.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
680 G1CollectedHeap(G1CollectorPolicy* policy);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
681
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
682 // Initialize the G1CollectedHeap to have the initial and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
683 // maximum sizes, permanent generation, and remembered and barrier sets
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
684 // specified by the policy object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
685 jint initialize();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
686
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
687 void ref_processing_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
688
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
689 void set_par_threads(int t) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
690 SharedHeap::set_par_threads(t);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
691 _process_strong_tasks->set_par_threads(t);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
692 }
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 virtual CollectedHeap::Name kind() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
695 return CollectedHeap::G1CollectedHeap;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
696 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
697
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
698 // The current policy object for the collector.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
699 G1CollectorPolicy* g1_policy() const { return _g1_policy; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
700
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
701 // Adaptive size policy. No such thing for g1.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
702 virtual AdaptiveSizePolicy* size_policy() { return NULL; }
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 // The rem set and barrier set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
705 G1RemSet* g1_rem_set() const { return _g1_rem_set; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
706 ModRefBarrierSet* mr_bs() const { return _mr_bs; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
707
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
708 // The rem set iterator.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
709 HeapRegionRemSetIterator* rem_set_iterator(int i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
710 return _rem_set_iterator[i];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
711 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
712
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
713 HeapRegionRemSetIterator* rem_set_iterator() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
714 return _rem_set_iterator[0];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
715 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
716
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
717 unsigned get_gc_time_stamp() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
718 return _gc_time_stamp;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
719 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
720
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
721 void reset_gc_time_stamp() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
722 _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
723 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
724 }
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
725
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
726 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
727 ++_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
728 OrderAccess::fence();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
729 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
730
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
731 void iterate_dirty_card_closure(CardTableEntryClosure* cl,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
732 DirtyCardQueue* into_cset_dcq,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1656
diff changeset
733 bool concurrent, int worker_i);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
734
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
735 // The shared block offset table array.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
736 G1BlockOffsetSharedArray* bot_shared() const { return _bot_shared; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
738 // Reference Processing accessor
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739 ReferenceProcessor* ref_processor() { return _ref_processor; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
740
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
741 // Reserved (g1 only; super method includes perm), capacity and the used
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
742 // portion in bytes.
1092
ed52bcc32739 6880903: G1: G1 reports incorrect Runtime.maxMemory()
tonyp
parents: 1027
diff changeset
743 size_t g1_reserved_obj_bytes() const { return _g1_reserved.byte_size(); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
744 virtual size_t capacity() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
745 virtual size_t used() const;
846
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
746 // This should be called when we're not holding the heap lock. The
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
747 // result might be a bit inaccurate.
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
748 size_t used_unlocked() const;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
749 size_t recalculate_used() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
750 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
751 size_t recalculate_used_regions() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
752 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754 // These virtual functions do the actual allocation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755 virtual HeapWord* mem_allocate(size_t word_size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 bool is_noref,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757 bool is_tlab,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
758 bool* gc_overhead_limit_was_exceeded);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
759
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
760 // Some heaps may offer a contiguous region for shared non-blocking
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
761 // 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
762 // end fields defining the extent of the contiguous allocation region.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
763 // But G1CollectedHeap doesn't yet support this.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
764
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
765 // Return an estimate of the maximum allocation that could be performed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
766 // without triggering any collection or expansion activity. In a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
767 // generational collector, for example, this is probably the largest
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
768 // allocation that could be supported (without expansion) in the youngest
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
769 // generation. It is "unsafe" because no locks are taken; the result
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
770 // 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
771 // heuristic resizing decisions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
772 virtual size_t unsafe_max_alloc();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
773
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
774 virtual bool is_maximal_no_gc() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
775 return _g1_storage.uncommitted_size() == 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
776 }
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 // The total number of regions in the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
779 size_t n_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
780
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
781 // The number of regions that are completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
782 size_t max_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
783
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
784 // The number of regions that are completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
785 size_t free_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
786
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
787 // The number of regions that are not completely free.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
788 size_t used_regions() { return n_regions() - free_regions(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
789
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
790 // True iff the ZF thread should run.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
791 bool should_zf();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
792
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
793 // The number of regions available for "regular" expansion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
794 size_t expansion_regions() { return _expansion_regions; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
795
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
796 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
797 bool regions_accounted_for();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
798 bool print_region_accounting_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
799 void print_region_counts();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
800 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
801
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
802 HeapRegion* alloc_region_from_unclean_list(bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
803 HeapRegion* alloc_region_from_unclean_list_locked(bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
804
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
805 void put_region_on_unclean_list(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
806 void put_region_on_unclean_list_locked(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
807
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
808 void prepend_region_list_on_unclean_list(UncleanRegionList* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
809 void prepend_region_list_on_unclean_list_locked(UncleanRegionList* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
810
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
811 void set_unclean_regions_coming(bool b);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
812 void set_unclean_regions_coming_locked(bool b);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
813 // Wait for cleanup to be complete.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
814 void wait_for_cleanup_complete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
815 // 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
816 void wait_for_cleanup_complete_locked();
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 // Return the head of the unclean list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
819 HeapRegion* peek_unclean_region_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
820 // Remove and return the head of the unclean list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
821 HeapRegion* pop_unclean_region_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
822
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
823 // List of regions which are zero filled and ready for allocation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824 HeapRegion* _free_region_list;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
825 // Number of elements on the free list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
826 size_t _free_region_list_size;
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 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
829 // list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
830 bool move_cleaned_region_to_free_list_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
831 bool move_cleaned_region_to_free_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
832
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
833 void put_free_region_on_list_locked(HeapRegion* r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
834 void put_free_region_on_list(HeapRegion* r);
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 // Remove and return the head element of the free list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
837 HeapRegion* pop_free_region_list_locked();
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 // 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
840 // 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
841 // first try the unclean list, then the zero-filled list.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
842 HeapRegion* alloc_free_region_from_lists(bool zero_filled);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
843
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
844 // Verify the integrity of the region lists.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
845 void remove_allocated_regions_from_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
846 bool verify_region_lists();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
847 bool verify_region_lists_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
848 size_t unclean_region_list_length();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
849 size_t free_region_list_length();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
850
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
851 // Perform a collection of the heap; intended for use in implementing
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
852 // "System.gc". This probably implies as full a collection as the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
853 // "CollectedHeap" supports.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
854 virtual void collect(GCCause::Cause cause);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
855
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
856 // 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
857 void collect_locked(GCCause::Cause cause);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
859 // This interface assumes that it's being called by the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
860 // vm thread. It collects the heap assuming that the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
861 // heap lock is already held and that we are executing in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
862 // the context of the vm thread.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
863 virtual void collect_as_vm_thread(GCCause::Cause cause);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
864
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
865 // True iff a evacuation has failed in the most-recent collection.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
866 bool evacuation_failed() { return _evacuation_failed; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
867
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
868 // 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
869 // bytes freed (0 ==> didn't free it).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
870 size_t free_region_if_totally_empty(HeapRegion *hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
871 void free_region_if_totally_empty_work(HeapRegion *hr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
872 size_t& pre_used,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
873 size_t& cleared_h_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
874 size_t& freed_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
875 UncleanRegionList* list,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
876 bool par = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
877
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
878 // 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
879 // the relevant global variables.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
880 void finish_free_region_work(size_t pre_used,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
881 size_t cleared_h_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
882 size_t freed_regions,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
883 UncleanRegionList* list);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
884
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
885
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
886 // 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
887 virtual bool is_in(const void* p) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
888
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
889 // Return "TRUE" iff the given object address is within the collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
890 // set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
891 inline bool obj_in_cs(oop obj);
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 // Return "TRUE" iff the given object address is in the reserved
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
894 // region of g1 (excluding the permanent generation).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
895 bool is_in_g1_reserved(const void* p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
896 return _g1_reserved.contains(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
897 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
898
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
899 // Returns a MemRegion that corresponds to the space that has been
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
900 // committed in the heap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
901 MemRegion g1_committed() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 return _g1_committed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
903 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
904
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 846
diff changeset
905 NOT_PRODUCT(bool is_in_closed_subset(const void* p) const;)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
906
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
907 // Dirty card table entries covering a list of young regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
908 void dirtyCardsForYoungRegions(CardTableModRefBS* ct_bs, HeapRegion* list);
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 // 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
911 // a collection pause which used the card table to claim cards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
912 void cleanUpCardTable();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
913
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
914 // Iteration functions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
915
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
916 // Iterate over all the ref-containing fields of all objects, calling
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
917 // "cl.do_oop" on each.
678
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
918 virtual void oop_iterate(OopClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
919 oop_iterate(cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
920 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
921 void oop_iterate(OopClosure* cl, bool do_perm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
922
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
923 // Same as above, restricted to a memory region.
678
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
924 virtual void oop_iterate(MemRegion mr, OopClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
925 oop_iterate(mr, cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
926 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
927 void oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
928
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
929 // Iterate over all objects, calling "cl.do_object" on each.
678
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
930 virtual void object_iterate(ObjectClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
931 object_iterate(cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
932 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
933 virtual void safe_object_iterate(ObjectClosure* cl) {
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
934 object_iterate(cl, true);
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
935 }
4ac7d97e6101 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 677
diff changeset
936 void object_iterate(ObjectClosure* cl, bool do_perm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
937
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
938 // Iterate over all objects allocated since the last collection, calling
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
939 // "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
940 // to support this function, or else this call will fail.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
941 virtual void object_iterate_since_last_GC(ObjectClosure* cl);
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 // 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
944 virtual void space_iterate(SpaceClosure* cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
945
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
946 // Iterate over heap regions, in address order, terminating the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
947 // iteration early if the "doHeapRegion" method returns "true".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
948 void heap_region_iterate(HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
949
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
950 // 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
951 // is NULL), in address order, terminating early if the "doHeapRegion"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
952 // method returns "true".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
953 void heap_region_iterate_from(HeapRegion* r, HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
954
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
955 // As above but starting from the region at index idx.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
956 void heap_region_iterate_from(int idx, HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
957
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
958 HeapRegion* region_at(size_t idx);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
959
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
960 // 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
961 // of regions divided by the number of parallel threads times some
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
962 // overpartition factor, currently 4). Assumes that this will be called
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
963 // in parallel by ParallelGCThreads worker threads with discinct worker
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
964 // 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
965 // 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
966 // 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
967 // the iteration. Applies "blk->doHeapRegion" to each of the regions, by
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
968 // attempting to claim the first region in each chunk, and, if
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
969 // successful, applying the closure to each region in the chunk (and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
970 // 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
971 // chunk.) For now requires that "doHeapRegion" always returns "false",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
972 // i.e., that a closure never attempt to abort a traversal.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
973 void heap_region_par_iterate_chunked(HeapRegionClosure* blk,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
974 int worker,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
975 jint claim_value);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
976
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
977 // It resets all the region claim values to the default.
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
978 void reset_heap_region_claim_values();
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
979
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
980 #ifdef ASSERT
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
981 bool check_heap_region_claim_values(jint claim_value);
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
982 #endif // ASSERT
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 353
diff changeset
983
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
984 // Iterate over the regions (if any) in the current collection set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985 void collection_set_iterate(HeapRegionClosure* blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
987 // As above but starting from region r
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
988 void collection_set_iterate_from(HeapRegion* r, HeapRegionClosure *blk);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
989
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
990 // Returns the first (lowest address) compactible space in the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
991 virtual CompactibleSpace* first_compactible_space();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
992
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993 // A CollectedHeap will contain some number of spaces. This finds the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
994 // space containing a given address, or else returns NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
995 virtual Space* space_containing(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
996
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 // A G1CollectedHeap will contain some number of heap regions. This
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
998 // finds the region containing a given address, or else returns NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
999 HeapRegion* heap_region_containing(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1000
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1001 // 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
1002 // null-check), and unlike the above, may return an continuing humongous
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1003 // region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1004 HeapRegion* heap_region_containing_raw(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1005
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1006 // 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
1007 // each address in the (reserved) heap is a member of exactly
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1008 // 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
1009 // 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
1010 // block. (Blocks may be of different sizes.) Thus, blocks may
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1011 // represent Java objects, or they might be free blocks in a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012 // 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
1013 // distinguishable and the size of each is determinable.
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 the address of the start of the "block" that contains the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 // address "addr". We say "blocks" instead of "object" since some heaps
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1017 // 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
1018 // non-object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1019 virtual HeapWord* block_start(const void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1020
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1021 // 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
1022 // "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
1023 // of the active area of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1024 virtual size_t block_size(const HeapWord* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1025
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1026 // 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
1027 // the block is an object.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1028 virtual bool block_is_obj(const HeapWord* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1029
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1030 // Does this heap support heap inspection? (+PrintClassHistogram)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1031 virtual bool supports_heap_inspection() const { return true; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1032
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1033 // Section on thread-local allocation buffers (TLABs)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1034 // See CollectedHeap for semantics.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1035
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1036 virtual bool supports_tlab_allocation() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1037 virtual size_t tlab_capacity(Thread* thr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1038 virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1039 virtual HeapWord* allocate_new_tlab(size_t size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1040
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1041 // Can a compiler initialize a new object without store barriers?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1042 // This permission only extends from the creation of a new object
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1043 // via a TLAB up to the first subsequent safepoint. If such permission
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1044 // is granted for this heap type, the compiler promises to call
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1045 // defer_store_barrier() below on any slow path allocation of
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1046 // a new object for which such initializing store barriers will
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1047 // have been elided. G1, like CMS, allows this, but should be
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1048 // ready to provide a compensating write barrier as necessary
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1049 // if that storage came out of a non-young region. The efficiency
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1050 // of this implementation depends crucially on being able to
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1051 // answer very efficiently in constant time whether a piece of
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1052 // storage in the heap comes from a young region or not.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1053 // See ReduceInitialCardMarks.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1054 virtual bool can_elide_tlab_store_barriers() const {
1194
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1055 // 6920090: Temporarily disabled, because of lingering
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1056 // instabilities related to RICM with G1. In the
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1057 // interim, the option ReduceInitialCardMarksForG1
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1058 // below is left solely as a debugging device at least
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1059 // until 6920109 fixes the instabilities.
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1060 return ReduceInitialCardMarksForG1;
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1061 }
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1062
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1092
diff changeset
1063 virtual bool card_mark_must_follow_store() const {
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1092
diff changeset
1064 return true;
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1092
diff changeset
1065 }
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1092
diff changeset
1066
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1067 bool is_in_young(oop obj) {
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1068 HeapRegion* hr = heap_region_containing(obj);
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1069 return hr != NULL && hr->is_young();
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1070 }
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1071
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1072 // We don't need barriers for initializing stores to objects
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1073 // in the young gen: for the SATB pre-barrier, there is no
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1074 // pre-value that needs to be remembered; for the remembered-set
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1075 // update logging post-barrier, we don't maintain remembered set
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1076 // information for young gen objects. Note that non-generational
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1077 // G1 does not have any "young" objects, should not elide
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1078 // the rs logging barrier and so should always answer false below.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1079 // However, non-generational G1 (-XX:-G1Gen) appears to have
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1080 // bit-rotted so was not tested below.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1081 virtual bool can_elide_initializing_store_barrier(oop new_obj) {
1194
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1082 // Re 6920090, 6920109 above.
34fb2662f6c2 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 1166
diff changeset
1083 assert(ReduceInitialCardMarksForG1, "Else cannot be here");
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1084 assert(G1Gen || !is_in_young(new_obj),
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1085 "Non-generational G1 should never return true below");
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 942
diff changeset
1086 return is_in_young(new_obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1087 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1088
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1089 // Can a compiler elide a store barrier when it writes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1090 // a permanent oop into the heap? Applies when the compiler
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1091 // 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
1092 virtual bool can_elide_permanent_oop_store_barriers() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1093 // At least until perm gen collection is also G1-ified, at
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1094 // which point this should return false.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1095 return true;
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 virtual bool allocs_are_zero_filled();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1099
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1100 // The boundary between a "large" and "small" array of primitives, in
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1101 // words.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1102 virtual size_t large_typearray_limit();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1103
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1104 // Returns "true" iff the given word_size is "very large".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1105 static bool isHumongous(size_t word_size) {
1313
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1311
diff changeset
1106 // Note this has to be strictly greater-than as the TLABs
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1311
diff changeset
1107 // are capped at the humongous thresold and we want to
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1311
diff changeset
1108 // ensure that we don't try to allocate a TLAB as
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1311
diff changeset
1109 // humongous and that we don't allocate a humongous
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1311
diff changeset
1110 // object in a TLAB.
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1311
diff changeset
1111 return word_size > _humongous_object_threshold_in_words;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1112 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1113
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1114 // Update mod union table with the set of dirty cards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1115 void updateModUnion();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1116
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1117 // Set the mod union bits corresponding to the given memRegion. Note
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1118 // 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
1119 // bits.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1120 void markModUnionRange(MemRegion mr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1121
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1122 // 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
1123 void set_marking_complete() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1124 _mark_in_progress = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1125 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1126 void set_marking_started() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1127 _mark_in_progress = true;
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 mark_in_progress() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1130 return _mark_in_progress;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1131 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1132
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1133 // Print the maximum heap capacity.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1134 virtual size_t max_capacity() const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1135
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1136 virtual jlong millis_since_last_gc();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1137
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1138 // Perform any cleanup actions necessary before allowing a verification.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1139 virtual void prepare_for_verify();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1140
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1141 // Perform verification.
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1142
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1143 // use_prev_marking == true -> use "prev" marking information,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1144 // use_prev_marking == false -> use "next" marking information
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1145 // NOTE: Only the "prev" marking information is guaranteed to be
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1146 // consistent most of the time, so most calls to this should use
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1147 // use_prev_marking == true. Currently, there is only one case where
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1148 // this is called with use_prev_marking == false, which is to verify
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1149 // the "next" marking information at the end of remark.
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1150 void verify(bool allow_dirty, bool silent, bool use_prev_marking);
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1151
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1152 // Override; it uses the "prev" marking information
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1153 virtual void verify(bool allow_dirty, bool silent);
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1154 // Default behavior by calling print(tty);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1155 virtual void print() const;
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1156 // This calls print_on(st, PrintHeapAtGCExtended).
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1157 virtual void print_on(outputStream* st) const;
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1158 // If extended is true, it will print out information for all
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1159 // regions in the heap by calling print_on_extended(st).
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1160 virtual void print_on(outputStream* st, bool extended) const;
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1161 virtual void print_on_extended(outputStream* st) const;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1162
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163 virtual void print_gc_threads_on(outputStream* st) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1164 virtual void gc_threads_do(ThreadClosure* tc) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1165
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1166 // Override
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1167 void print_tracing_info() const;
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 // 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
1170 // number indicating the "arena" within the heap in which "addr" falls.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1171 // Or else returns 0.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1172 virtual int addr_to_arena_id(void* addr) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1173
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1174 // 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
1175 // asserted to be this type.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1176 static G1CollectedHeap* heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1177
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1178 void empty_young_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1179 bool should_set_young_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1180
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1181 void set_region_short_lived_locked(HeapRegion* hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1182 // add appropriate methods for any other surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1183
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1184 YoungList* young_list() { return _young_list; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1185
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1186 // debugging
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1187 bool check_young_list_well_formed() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1188 return _young_list->check_list_well_formed();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1189 }
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1190
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1191 bool check_young_list_empty(bool check_heap,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1192 bool check_sample = true);
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 // *** 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
1195 // many of these need to be public.
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 // The functions below are helper functions that a subclass of
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1198 // "CollectedHeap" can use in the implementation of its virtual
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1199 // functions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1200 // This performs a concurrent marking of the live objects in a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1201 // bitmap off to the side.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1202 void doConcurrentMark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1203
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1204 // This is called from the marksweep collector which then does
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1205 // a concurrent mark and verifies that the results agree with
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1206 // the stop the world marking.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1207 void checkConcurrentMark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1208 void do_sync_mark();
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 bool isMarkedPrev(oop obj) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1211 bool isMarkedNext(oop obj) const;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1212
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1213 // use_prev_marking == true -> use "prev" marking information,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1214 // use_prev_marking == false -> use "next" marking information
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1215 bool is_obj_dead_cond(const oop obj,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1216 const HeapRegion* hr,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1217 const bool use_prev_marking) const {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1218 if (use_prev_marking) {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1219 return is_obj_dead(obj, hr);
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1220 } else {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1221 return is_obj_ill(obj, hr);
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1222 }
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1223 }
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1224
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1225 // Determine if an object is dead, given the object and also
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1226 // the region to which the object belongs. An object is dead
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1227 // 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
1228 // is not marked.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1229
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1230 bool is_obj_dead(const oop obj, const HeapRegion* hr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1231 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1232 !hr->obj_allocated_since_prev_marking(obj) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1233 !isMarkedPrev(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1234 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1235
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1236 // This is used when copying an object to survivor space.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1237 // 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
1238 // If the object is allocated since the start of this mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1239 // cycle, then we mark the copy live.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1240 // If the object has been around since the previous mark
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1241 // phase, and hasn't been marked yet during this phase,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1242 // then we don't mark it, we just wait for the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1243 // current marking cycle to get to it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1244
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1245 // This function returns true when an object has been
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1246 // around since the previous marking and hasn't yet
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1247 // been marked during this marking.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1248
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1249 bool is_obj_ill(const oop obj, const HeapRegion* hr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1250 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1251 !hr->obj_allocated_since_next_marking(obj) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1252 !isMarkedNext(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1253 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1254
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1255 // Determine if an object is dead, given only the object itself.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1256 // This will find the region to which the object belongs and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1257 // then call the region version of the same function.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1258
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1259 // Added if it is in permanent gen it isn't dead.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1260 // Added if it is NULL it isn't dead.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1261
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1262 // use_prev_marking == true -> use "prev" marking information,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1263 // use_prev_marking == false -> use "next" marking information
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1264 bool is_obj_dead_cond(const oop obj,
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1265 const bool use_prev_marking) {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1266 if (use_prev_marking) {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1267 return is_obj_dead(obj);
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1268 } else {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1269 return is_obj_ill(obj);
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1270 }
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1271 }
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1272
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1273 bool is_obj_dead(const oop obj) {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1274 const HeapRegion* hr = heap_region_containing(obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1275 if (hr == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1276 if (Universe::heap()->is_in_permanent(obj))
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1277 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1278 else if (obj == NULL) return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1279 else return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1280 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1281 else return is_obj_dead(obj, hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1282 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1283
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1284 bool is_obj_ill(const oop obj) {
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
1285 const HeapRegion* hr = heap_region_containing(obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1286 if (hr == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1287 if (Universe::heap()->is_in_permanent(obj))
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1288 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1289 else if (obj == NULL) return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1290 else return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1291 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1292 else return is_obj_ill(obj, hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1293 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1294
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1295 // The following is just to alert the verification code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1296 // that a full collection has occurred and that the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1297 // remembered sets are no longer up to date.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1298 bool _full_collection;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1299 void set_full_collection() { _full_collection = true;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1300 void clear_full_collection() {_full_collection = false;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1301 bool full_collection() {return _full_collection;}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1302
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1303 ConcurrentMark* concurrent_mark() const { return _cm; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1304 ConcurrentG1Refine* concurrent_g1_refine() const { return _cg1r; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1305
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1306 // The dirty cards region list is used to record a subset of regions
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1307 // whose cards need clearing. The list if populated during the
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1308 // remembered set scanning and drained during the card table
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1309 // cleanup. Although the methods are reentrant, population/draining
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1310 // phases must not overlap. For synchronization purposes the last
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1311 // element on the list points to itself.
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1312 HeapRegion* _dirty_cards_region_list;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1313 void push_dirty_cards_region(HeapRegion* hr);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1314 HeapRegion* pop_dirty_cards_region();
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 678
diff changeset
1315
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1316 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1317 void stop_conc_gc_threads();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1318
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1319 // <NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1320
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1321 double predict_region_elapsed_time_ms(HeapRegion* hr, bool young);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1322 void check_if_region_is_too_expensive(double predicted_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1323 size_t pending_card_num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1324 size_t max_pending_card_num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1325 size_t cards_scanned();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1326
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1327 // </NEW PREDICTION>
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1328
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1329 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1330 size_t _max_heap_capacity;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1331
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1332 // debug_only(static void check_for_valid_allocation_state();)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1333
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1334 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1335 // 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
1336 // MemoryService). In productization, we can make this assert false
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1337 // 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
1338 static void g1_unimplemented();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1339
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1340 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1341
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1342 #define use_local_bitmaps 1
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1343 #define verify_local_bitmaps 0
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1344 #define oop_buffer_length 256
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1345
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1346 #ifndef PRODUCT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1347 class GCLabBitMap;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1348 class GCLabBitMapClosure: public BitMapClosure {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1349 private:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1350 ConcurrentMark* _cm;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1351 GCLabBitMap* _bitmap;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1352
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1353 public:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1354 GCLabBitMapClosure(ConcurrentMark* cm,
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1355 GCLabBitMap* bitmap) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1356 _cm = cm;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1357 _bitmap = bitmap;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1358 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1359
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1360 virtual bool do_bit(size_t offset);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1361 };
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1362 #endif // !PRODUCT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1363
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1364 class GCLabBitMap: public BitMap {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1365 private:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1366 ConcurrentMark* _cm;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1367
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1368 int _shifter;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1369 size_t _bitmap_word_covers_words;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1370
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1371 // beginning of the heap
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1372 HeapWord* _heap_start;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1373
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1374 // this is the actual start of the GCLab
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1375 HeapWord* _real_start_word;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1376
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1377 // this is the actual end of the GCLab
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1378 HeapWord* _real_end_word;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1379
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1380 // this is the first word, possibly located before the actual start
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1381 // of the GCLab, that corresponds to the first bit of the bitmap
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1382 HeapWord* _start_word;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1383
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1384 // size of a GCLab in words
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1385 size_t _gclab_word_size;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1386
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1387 static int shifter() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1388 return MinObjAlignment - 1;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1389 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1390
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1391 // how many heap words does a single bitmap word corresponds to?
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1392 static size_t bitmap_word_covers_words() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1393 return BitsPerWord << shifter();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1394 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1395
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1396 size_t gclab_word_size() const {
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1397 return _gclab_word_size;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1398 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1399
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1400 // Calculates actual GCLab size in words
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1401 size_t gclab_real_word_size() const {
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1402 return bitmap_size_in_bits(pointer_delta(_real_end_word, _start_word))
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1403 / BitsPerWord;
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1404 }
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1405
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1406 static size_t bitmap_size_in_bits(size_t gclab_word_size) {
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1407 size_t bits_in_bitmap = gclab_word_size >> shifter();
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1408 // We are going to ensure that the beginning of a word in this
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1409 // bitmap also corresponds to the beginning of a word in the
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1410 // global marking bitmap. To handle the case where a GCLab
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1411 // starts from the middle of the bitmap, we need to add enough
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1412 // space (i.e. up to a bitmap word) to ensure that we have
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1413 // enough bits in the bitmap.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1414 return bits_in_bitmap + BitsPerWord - 1;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1415 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1416 public:
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1417 GCLabBitMap(HeapWord* heap_start, size_t gclab_word_size)
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1418 : BitMap(bitmap_size_in_bits(gclab_word_size)),
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1419 _cm(G1CollectedHeap::heap()->concurrent_mark()),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1420 _shifter(shifter()),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1421 _bitmap_word_covers_words(bitmap_word_covers_words()),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1422 _heap_start(heap_start),
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1423 _gclab_word_size(gclab_word_size),
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1424 _real_start_word(NULL),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1425 _real_end_word(NULL),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1426 _start_word(NULL)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1427 {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1428 guarantee( size_in_words() >= bitmap_size_in_words(),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1429 "just making sure");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1430 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1431
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1432 inline unsigned heapWordToOffset(HeapWord* addr) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1433 unsigned offset = (unsigned) pointer_delta(addr, _start_word) >> _shifter;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1434 assert(offset < size(), "offset should be within bounds");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1435 return offset;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1436 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1437
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1438 inline HeapWord* offsetToHeapWord(size_t offset) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1439 HeapWord* addr = _start_word + (offset << _shifter);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1440 assert(_real_start_word <= addr && addr < _real_end_word, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1441 return addr;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1442 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1443
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1444 bool fields_well_formed() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1445 bool ret1 = (_real_start_word == NULL) &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1446 (_real_end_word == NULL) &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1447 (_start_word == NULL);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1448 if (ret1)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1449 return true;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1450
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1451 bool ret2 = _real_start_word >= _start_word &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1452 _start_word < _real_end_word &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1453 (_real_start_word + _gclab_word_size) == _real_end_word &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1454 (_start_word + _gclab_word_size + _bitmap_word_covers_words)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1455 > _real_end_word;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1456 return ret2;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1457 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1458
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1459 inline bool mark(HeapWord* addr) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1460 guarantee(use_local_bitmaps, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1461 assert(fields_well_formed(), "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1462
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1463 if (addr >= _real_start_word && addr < _real_end_word) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1464 assert(!isMarked(addr), "should not have already been marked");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1465
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1466 // first mark it on the bitmap
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1467 at_put(heapWordToOffset(addr), true);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1468
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1469 return true;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1470 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1471 return false;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1472 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1473 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1474
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1475 inline bool isMarked(HeapWord* addr) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1476 guarantee(use_local_bitmaps, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1477 assert(fields_well_formed(), "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1478
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1479 return at(heapWordToOffset(addr));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1480 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1481
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1482 void set_buffer(HeapWord* start) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1483 guarantee(use_local_bitmaps, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1484 clear();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1485
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1486 assert(start != NULL, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1487 _real_start_word = start;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1488 _real_end_word = start + _gclab_word_size;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1489
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1490 size_t diff =
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1491 pointer_delta(start, _heap_start) % _bitmap_word_covers_words;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1492 _start_word = start - diff;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1493
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1494 assert(fields_well_formed(), "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1495 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1496
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1497 #ifndef PRODUCT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1498 void verify() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1499 // verify that the marks have been propagated
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1500 GCLabBitMapClosure cl(_cm, this);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1501 iterate(&cl);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1502 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1503 #endif // PRODUCT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1504
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1505 void retire() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1506 guarantee(use_local_bitmaps, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1507 assert(fields_well_formed(), "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1508
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1509 if (_start_word != NULL) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1510 CMBitMap* mark_bitmap = _cm->nextMarkBitMap();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1511
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1512 // this means that the bitmap was set up for the GCLab
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1513 assert(_real_start_word != NULL && _real_end_word != NULL, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1514
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1515 mark_bitmap->mostly_disjoint_range_union(this,
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1516 0, // always start from the start of the bitmap
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1517 _start_word,
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1518 gclab_real_word_size());
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1519 _cm->grayRegionIfNecessary(MemRegion(_real_start_word, _real_end_word));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1520
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1521 #ifndef PRODUCT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1522 if (use_local_bitmaps && verify_local_bitmaps)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1523 verify();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1524 #endif // PRODUCT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1525 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1526 assert(_real_start_word == NULL && _real_end_word == NULL, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1527 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1528 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1529
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1530 size_t bitmap_size_in_words() const {
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1531 return (bitmap_size_in_bits(gclab_word_size()) + BitsPerWord - 1) / BitsPerWord;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1532 }
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1533
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1534 };
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1535
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1536 class G1ParGCAllocBuffer: public ParGCAllocBuffer {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1537 private:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1538 bool _retired;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1539 bool _during_marking;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1540 GCLabBitMap _bitmap;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1541
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1542 public:
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1543 G1ParGCAllocBuffer(size_t gclab_word_size) :
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1544 ParGCAllocBuffer(gclab_word_size),
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1545 _during_marking(G1CollectedHeap::heap()->mark_in_progress()),
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1546 _bitmap(G1CollectedHeap::heap()->reserved_region().start(), gclab_word_size),
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1547 _retired(false)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1548 { }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1549
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1550 inline bool mark(HeapWord* addr) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1551 guarantee(use_local_bitmaps, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1552 assert(_during_marking, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1553 return _bitmap.mark(addr);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1554 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1555
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1556 inline void set_buf(HeapWord* buf) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1557 if (use_local_bitmaps && _during_marking)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1558 _bitmap.set_buffer(buf);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1559 ParGCAllocBuffer::set_buf(buf);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1560 _retired = false;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1561 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1562
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1563 inline void retire(bool end_of_gc, bool retain) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1564 if (_retired)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1565 return;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1566 if (use_local_bitmaps && _during_marking) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1567 _bitmap.retire();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1568 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1569 ParGCAllocBuffer::retire(end_of_gc, retain);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1570 _retired = true;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1571 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1572 };
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1573
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1574 class G1ParScanThreadState : public StackObj {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1575 protected:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1576 G1CollectedHeap* _g1h;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1577 RefToScanQueue* _refs;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1578 DirtyCardQueue _dcq;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1579 CardTableModRefBS* _ct_bs;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1580 G1RemSet* _g1_rem;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1581
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1582 typedef GrowableArray<StarTask> OverflowQueue;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1583 OverflowQueue* _overflowed_refs;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1584
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1585 G1ParGCAllocBuffer _surviving_alloc_buffer;
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1586 G1ParGCAllocBuffer _tenured_alloc_buffer;
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1587 G1ParGCAllocBuffer* _alloc_buffers[GCAllocPurposeCount];
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1588 ageTable _age_table;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1589
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1590 size_t _alloc_buffer_waste;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1591 size_t _undo_waste;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1592
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1593 OopsInHeapRegionClosure* _evac_failure_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1594 G1ParScanHeapEvacClosure* _evac_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1595 G1ParScanPartialArrayClosure* _partial_scan_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1596
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1597 int _hash_seed;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1598 int _queue_num;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1599
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1552
diff changeset
1600 size_t _term_attempts;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1601 #if G1_DETAILED_STATS
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1602 int _pushes, _pops, _steals, _steal_attempts;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1603 int _overflow_pushes;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1604 #endif
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1605
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1606 double _start;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1607 double _start_strong_roots;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1608 double _strong_roots_time;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1609 double _start_term;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1610 double _term_time;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1611
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1612 // Map from young-age-index (0 == not young, 1 is youngest) to
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1613 // surviving words. base is what we get back from the malloc call
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1614 size_t* _surviving_young_words_base;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1615 // this points into the array, as we use the first few entries for padding
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1616 size_t* _surviving_young_words;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1617
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1618 #define PADDING_ELEM_NUM (64 / sizeof(size_t))
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1619
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1620 void add_to_alloc_buffer_waste(size_t waste) { _alloc_buffer_waste += waste; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1621
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1622 void add_to_undo_waste(size_t waste) { _undo_waste += waste; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1623
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1624 DirtyCardQueue& dirty_card_queue() { return _dcq; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1625 CardTableModRefBS* ctbs() { return _ct_bs; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1626
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1627 template <class T> void immediate_rs_update(HeapRegion* from, T* p, int tid) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1628 if (!from->is_survivor()) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1629 _g1_rem->par_write_ref(from, p, tid);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1630 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1631 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1632
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1633 template <class T> void deferred_rs_update(HeapRegion* from, T* p, int tid) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1634 // If the new value of the field points to the same region or
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1635 // is the to-space, we don't need to include it in the Rset updates.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1636 if (!from->is_in_reserved(oopDesc::load_decode_heap_oop(p)) && !from->is_survivor()) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1637 size_t card_index = ctbs()->index_for(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1638 // If the card hasn't been added to the buffer, do it.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1639 if (ctbs()->mark_card_deferred(card_index)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1640 dirty_card_queue().enqueue((jbyte*)ctbs()->byte_for_index(card_index));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1641 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1642 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1643 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1644
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1645 public:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1646 G1ParScanThreadState(G1CollectedHeap* g1h, int queue_num);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1647
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1648 ~G1ParScanThreadState() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1649 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1650 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1651
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1652 RefToScanQueue* refs() { return _refs; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1653 OverflowQueue* overflowed_refs() { return _overflowed_refs; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1654 ageTable* age_table() { return &_age_table; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1655
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1656 G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) {
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1657 return _alloc_buffers[purpose];
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1658 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1659
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1660 size_t alloc_buffer_waste() { return _alloc_buffer_waste; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1661 size_t undo_waste() { return _undo_waste; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1662
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1663 template <class T> void push_on_queue(T* ref) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1664 assert(ref != NULL, "invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1665 assert(has_partial_array_mask(ref) ||
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1666 _g1h->is_in_g1_reserved(oopDesc::load_decode_heap_oop(ref)), "invariant");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1667 #ifdef ASSERT
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1668 if (has_partial_array_mask(ref)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1669 oop p = clear_partial_array_mask(ref);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1670 // Verify that we point into the CS
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1671 assert(_g1h->obj_in_cs(p), "Should be in CS");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1672 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1673 #endif
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1674 if (!refs()->push(ref)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1675 overflowed_refs()->push(ref);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1676 IF_G1_DETAILED_STATS(note_overflow_push());
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1677 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1678 IF_G1_DETAILED_STATS(note_push());
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1679 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1680 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1681
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1682 void pop_from_queue(StarTask& ref) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1683 if (refs()->pop_local(ref)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1684 assert((oop*)ref != NULL, "pop_local() returned true");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1685 assert(UseCompressedOops || !ref.is_narrow(), "Error");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1686 assert(has_partial_array_mask((oop*)ref) ||
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1687 _g1h->is_in_g1_reserved(ref.is_narrow() ? oopDesc::load_decode_heap_oop((narrowOop*)ref)
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1688 : oopDesc::load_decode_heap_oop((oop*)ref)),
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1689 "invariant");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1690 IF_G1_DETAILED_STATS(note_pop());
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1691 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1692 StarTask null_task;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1693 ref = null_task;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1694 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1695 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1696
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1697 void pop_from_overflow_queue(StarTask& ref) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1698 StarTask new_ref = overflowed_refs()->pop();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1699 assert((oop*)new_ref != NULL, "pop() from a local non-empty stack");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1700 assert(UseCompressedOops || !new_ref.is_narrow(), "Error");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1701 assert(has_partial_array_mask((oop*)new_ref) ||
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1702 _g1h->is_in_g1_reserved(new_ref.is_narrow() ? oopDesc::load_decode_heap_oop((narrowOop*)new_ref)
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1703 : oopDesc::load_decode_heap_oop((oop*)new_ref)),
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1704 "invariant");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1705 ref = new_ref;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1706 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1707
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1708 int refs_to_scan() { return refs()->size(); }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1709 int overflowed_refs_to_scan() { return overflowed_refs()->length(); }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1710
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1711 template <class T> void update_rs(HeapRegion* from, T* p, int tid) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1712 if (G1DeferredRSUpdate) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1713 deferred_rs_update(from, p, tid);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1714 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1715 immediate_rs_update(from, p, tid);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1716 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1717 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1718
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1719 HeapWord* allocate_slow(GCAllocPurpose purpose, size_t word_sz) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1720
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1721 HeapWord* obj = NULL;
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1722 size_t gclab_word_size = _g1h->desired_plab_sz(purpose);
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1723 if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1724 G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose);
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1725 assert(gclab_word_size == alloc_buf->word_sz(),
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1726 "dynamic resizing is not supported");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1727 add_to_alloc_buffer_waste(alloc_buf->words_remaining());
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1728 alloc_buf->retire(false, false);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1729
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1730 HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1731 if (buf == NULL) return NULL; // Let caller handle allocation failure.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1732 // Otherwise.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1733 alloc_buf->set_buf(buf);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1734
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1735 obj = alloc_buf->allocate(word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1736 assert(obj != NULL, "buffer was definitely big enough...");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1737 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1738 obj = _g1h->par_allocate_during_gc(purpose, word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1739 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1740 return obj;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1741 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1742
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1743 HeapWord* allocate(GCAllocPurpose purpose, size_t word_sz) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1744 HeapWord* obj = alloc_buffer(purpose)->allocate(word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1745 if (obj != NULL) return obj;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1746 return allocate_slow(purpose, word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1747 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1748
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1749 void undo_allocation(GCAllocPurpose purpose, HeapWord* obj, size_t word_sz) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1750 if (alloc_buffer(purpose)->contains(obj)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1751 assert(alloc_buffer(purpose)->contains(obj + word_sz - 1),
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1752 "should contain whole object");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1753 alloc_buffer(purpose)->undo_allocation(obj, word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1754 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1755 CollectedHeap::fill_with_object(obj, word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1756 add_to_undo_waste(word_sz);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1757 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1758 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1759
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1760 void set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_cl) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1761 _evac_failure_cl = evac_failure_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1762 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1763 OopsInHeapRegionClosure* evac_failure_closure() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1764 return _evac_failure_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1765 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1766
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1767 void set_evac_closure(G1ParScanHeapEvacClosure* evac_cl) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1768 _evac_cl = evac_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1769 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1770
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1771 void set_partial_scan_closure(G1ParScanPartialArrayClosure* partial_scan_cl) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1772 _partial_scan_cl = partial_scan_cl;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1773 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1774
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1775 int* hash_seed() { return &_hash_seed; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1776 int queue_num() { return _queue_num; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1777
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1552
diff changeset
1778 size_t term_attempts() { return _term_attempts; }
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1552
diff changeset
1779 void note_term_attempt() { _term_attempts++; }
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1780
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1781 #if G1_DETAILED_STATS
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1782 int pushes() { return _pushes; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1783 int pops() { return _pops; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1784 int steals() { return _steals; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1785 int steal_attempts() { return _steal_attempts; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1786 int overflow_pushes() { return _overflow_pushes; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1787
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1788 void note_push() { _pushes++; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1789 void note_pop() { _pops++; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1790 void note_steal() { _steals++; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1791 void note_steal_attempt() { _steal_attempts++; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1792 void note_overflow_push() { _overflow_pushes++; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1793 #endif
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1794
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1795 void start_strong_roots() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1796 _start_strong_roots = os::elapsedTime();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1797 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1798 void end_strong_roots() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1799 _strong_roots_time += (os::elapsedTime() - _start_strong_roots);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1800 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1801 double strong_roots_time() { return _strong_roots_time; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1802
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1803 void start_term_time() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1804 note_term_attempt();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1805 _start_term = os::elapsedTime();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1806 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1807 void end_term_time() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1808 _term_time += (os::elapsedTime() - _start_term);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1809 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1810 double term_time() { return _term_time; }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1811
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1812 double elapsed() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1813 return os::elapsedTime() - _start;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1814 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1815
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1816 size_t* surviving_young_words() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1817 // We add on to hide entry 0 which accumulates surviving words for
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1818 // age -1 regions (i.e. non-young ones)
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1819 return _surviving_young_words;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1820 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1821
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1822 void retire_alloc_buffers() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1823 for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1824 size_t waste = _alloc_buffers[ap]->words_remaining();
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1825 add_to_alloc_buffer_waste(waste);
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1313
diff changeset
1826 _alloc_buffers[ap]->retire(true, false);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1827 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1828 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1829
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1830 private:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1831 template <class T> void deal_with_reference(T* ref_to_scan) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1832 if (has_partial_array_mask(ref_to_scan)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1833 _partial_scan_cl->do_oop_nv(ref_to_scan);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1834 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1835 // Note: we can use "raw" versions of "region_containing" because
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1836 // "obj_to_scan" is definitely in the heap, and is not in a
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1837 // humongous region.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1838 HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1839 _evac_cl->set_region(r);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1840 _evac_cl->do_oop_nv(ref_to_scan);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1841 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1842 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1843
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1844 public:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1845 void trim_queue() {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1846 // I've replicated the loop twice, first to drain the overflow
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1847 // queue, second to drain the task queue. This is better than
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1848 // having a single loop, which checks both conditions and, inside
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1849 // it, either pops the overflow queue or the task queue, as each
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1850 // loop is tighter. Also, the decision to drain the overflow queue
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1851 // first is not arbitrary, as the overflow queue is not visible
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1852 // to the other workers, whereas the task queue is. So, we want to
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1853 // drain the "invisible" entries first, while allowing the other
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1854 // workers to potentially steal the "visible" entries.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1855
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1856 while (refs_to_scan() > 0 || overflowed_refs_to_scan() > 0) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1857 while (overflowed_refs_to_scan() > 0) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1858 StarTask ref_to_scan;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1859 assert((oop*)ref_to_scan == NULL, "Constructed above");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1860 pop_from_overflow_queue(ref_to_scan);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1861 // We shouldn't have pushed it on the queue if it was not
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1862 // pointing into the CSet.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1863 assert((oop*)ref_to_scan != NULL, "Follows from inner loop invariant");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1864 if (ref_to_scan.is_narrow()) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1865 assert(UseCompressedOops, "Error");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1866 narrowOop* p = (narrowOop*)ref_to_scan;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1867 assert(!has_partial_array_mask(p) &&
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1868 _g1h->is_in_g1_reserved(oopDesc::load_decode_heap_oop(p)), "sanity");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1869 deal_with_reference(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1870 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1871 oop* p = (oop*)ref_to_scan;
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1872 assert((has_partial_array_mask(p) && _g1h->is_in_g1_reserved(clear_partial_array_mask(p))) ||
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1873 _g1h->is_in_g1_reserved(oopDesc::load_decode_heap_oop(p)), "sanity");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1874 deal_with_reference(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1875 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1876 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1877
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1878 while (refs_to_scan() > 0) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1879 StarTask ref_to_scan;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1880 assert((oop*)ref_to_scan == NULL, "Constructed above");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1881 pop_from_queue(ref_to_scan);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1882 if ((oop*)ref_to_scan != NULL) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1883 if (ref_to_scan.is_narrow()) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1884 assert(UseCompressedOops, "Error");
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1885 narrowOop* p = (narrowOop*)ref_to_scan;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1886 assert(!has_partial_array_mask(p) &&
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1887 _g1h->is_in_g1_reserved(oopDesc::load_decode_heap_oop(p)), "sanity");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1888 deal_with_reference(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1889 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1890 oop* p = (oop*)ref_to_scan;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1891 assert((has_partial_array_mask(p) && _g1h->obj_in_cs(clear_partial_array_mask(p))) ||
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1194
diff changeset
1892 _g1h->is_in_g1_reserved(oopDesc::load_decode_heap_oop(p)), "sanity");
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1893 deal_with_reference(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1894 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1895 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1896 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1897 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1898 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
1899 };