annotate src/share/vm/memory/genCollectedHeap.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 126ea7725993
children 8b10f48633dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1520
diff changeset
2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1520
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1520
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: 1520
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_genCollectedHeap.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 GenCollectedHeap* GenCollectedHeap::_gch;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // The set of potentially parallel tasks in strong root scanning.
a61af66fc99e Initial load
duke
parents:
diff changeset
32 enum GCH_process_strong_roots_tasks {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // We probably want to parallelize both of these internally, but for now...
a61af66fc99e Initial load
duke
parents:
diff changeset
34 GCH_PS_younger_gens,
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // Leave this one last.
a61af66fc99e Initial load
duke
parents:
diff changeset
36 GCH_PS_NumElements
a61af66fc99e Initial load
duke
parents:
diff changeset
37 };
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) :
a61af66fc99e Initial load
duke
parents:
diff changeset
40 SharedHeap(policy),
a61af66fc99e Initial load
duke
parents:
diff changeset
41 _gen_policy(policy),
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _gen_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)),
a61af66fc99e Initial load
duke
parents:
diff changeset
43 _full_collections_completed(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
44 {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 if (_gen_process_strong_tasks == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
46 !_gen_process_strong_tasks->valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 vm_exit_during_initialization("Failed necessary allocation.");
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49 assert(policy != NULL, "Sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _preloading_shared_classes = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 jint GenCollectedHeap::initialize() {
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 989
diff changeset
54 CollectedHeap::pre_initialize();
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 989
diff changeset
55
0
a61af66fc99e Initial load
duke
parents:
diff changeset
56 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _n_gens = gen_policy()->number_of_generations();
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // While there are no constraints in the GC code that HeapWordSize
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // be any particular value, there are multiple other areas in the
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // system which believe this to be true (e.g. oop->object_size in some
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // cases incorrectly returns the size in wordSize units rather than
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // HeapWordSize).
a61af66fc99e Initial load
duke
parents:
diff changeset
64 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // The heap must be at least as aligned as generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 size_t alignment = Generation::GenGrain;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _gen_specs = gen_policy()->generations();
a61af66fc99e Initial load
duke
parents:
diff changeset
70 PermanentGenerationSpec *perm_gen_spec =
a61af66fc99e Initial load
duke
parents:
diff changeset
71 collector_policy()->permanent_generation();
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Make sure the sizes are all aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 for (i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _gen_specs[i]->align(alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 perm_gen_spec->align(alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // If we are dumping the heap, then allocate a wasted block of address
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // space in order to push the heap to a lower address. This extra
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // address range allows for other (or larger) libraries to be loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // without them occupying the space required for the shared spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 if (DumpSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 uintx reserved = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 uintx block_size = 64*1024*1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 while (reserved < SharedDummyBlockSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 char* dummy = os::reserve_memory(block_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 reserved += block_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // Allocate space for the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 char* heap_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 size_t total_reserved = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 int n_covered_regions = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 ReservedSpace heap_rs(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 heap_address = allocate(alignment, perm_gen_spec, &total_reserved,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 &n_covered_regions, &heap_rs);
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 if (UseSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 if (!heap_rs.is_reserved() || heap_address != heap_rs.base()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 if (heap_rs.is_reserved()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 heap_rs.release();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 FileMapInfo* mapinfo = FileMapInfo::current_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
109 mapinfo->fail_continue("Unable to reserve shared region.");
a61af66fc99e Initial load
duke
parents:
diff changeset
110 allocate(alignment, perm_gen_spec, &total_reserved, &n_covered_regions,
a61af66fc99e Initial load
duke
parents:
diff changeset
111 &heap_rs);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 if (!heap_rs.is_reserved()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 vm_shutdown_during_initialization(
a61af66fc99e Initial load
duke
parents:
diff changeset
117 "Could not reserve enough space for object heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
118 return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 _reserved = MemRegion((HeapWord*)heap_rs.base(),
a61af66fc99e Initial load
duke
parents:
diff changeset
122 (HeapWord*)(heap_rs.base() + heap_rs.size()));
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // It is important to do this in a way such that concurrent readers can't
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // temporarily think somethings in the heap. (Seen this happen in asserts.)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 _reserved.set_word_size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 _reserved.set_start((HeapWord*)heap_rs.base());
a61af66fc99e Initial load
duke
parents:
diff changeset
128 size_t actual_heap_size = heap_rs.size() - perm_gen_spec->misc_data_size()
a61af66fc99e Initial load
duke
parents:
diff changeset
129 - perm_gen_spec->misc_code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
130 _reserved.set_end((HeapWord*)(heap_rs.base() + actual_heap_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _rem_set = collector_policy()->create_rem_set(_reserved, n_covered_regions);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 set_barrier_set(rem_set()->bs());
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 989
diff changeset
134
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _gch = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 for (i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 ReservedSpace this_rs = heap_rs.first_part(_gen_specs[i]->max_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
139 UseSharedSpaces, UseSharedSpaces);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 _gens[i] = _gen_specs[i]->init(this_rs, i, rem_set());
a61af66fc99e Initial load
duke
parents:
diff changeset
141 heap_rs = heap_rs.last_part(_gen_specs[i]->max_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _perm_gen = perm_gen_spec->init(heap_rs, PermSize, rem_set());
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 clear_incremental_collection_will_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 clear_last_incremental_collection_failed();
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // If we are running CMS, create the collector responsible
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // for collecting the CMS generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 if (collector_policy()->is_concurrent_mark_sweep_policy()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 bool success = create_cms_collector();
a61af66fc99e Initial load
duke
parents:
diff changeset
153 if (!success) return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 char* GenCollectedHeap::allocate(size_t alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 PermanentGenerationSpec* perm_gen_spec,
a61af66fc99e Initial load
duke
parents:
diff changeset
163 size_t* _total_reserved,
a61af66fc99e Initial load
duke
parents:
diff changeset
164 int* _n_covered_regions,
a61af66fc99e Initial load
duke
parents:
diff changeset
165 ReservedSpace* heap_rs){
a61af66fc99e Initial load
duke
parents:
diff changeset
166 const char overflow_msg[] = "The size of the object heap + VM data exceeds "
a61af66fc99e Initial load
duke
parents:
diff changeset
167 "the maximum representable size";
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Now figure out the total size.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 size_t total_reserved = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 int n_covered_regions = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 const size_t pageSize = UseLargePages ?
a61af66fc99e Initial load
duke
parents:
diff changeset
173 os::large_page_size() : os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 total_reserved += _gen_specs[i]->max_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (total_reserved < _gen_specs[i]->max_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 vm_exit_during_initialization(overflow_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 n_covered_regions += _gen_specs[i]->n_covered_regions();
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
1626
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
182 assert(total_reserved % pageSize == 0,
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
183 err_msg("Gen size; total_reserved=" SIZE_FORMAT ", pageSize="
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
184 SIZE_FORMAT, total_reserved, pageSize));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 total_reserved += perm_gen_spec->max_size();
1626
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
186 assert(total_reserved % pageSize == 0,
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
187 err_msg("Perm size; total_reserved=" SIZE_FORMAT ", pageSize="
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
188 SIZE_FORMAT ", perm gen max=" SIZE_FORMAT, total_reserved,
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
189 pageSize, perm_gen_spec->max_size()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 if (total_reserved < perm_gen_spec->max_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 vm_exit_during_initialization(overflow_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 n_covered_regions += perm_gen_spec->n_covered_regions();
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // Add the size of the data area which shares the same reserved area
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // as the heap, but which is not actually part of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 size_t s = perm_gen_spec->misc_data_size() + perm_gen_spec->misc_code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 total_reserved += s;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (total_reserved < s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 vm_exit_during_initialization(overflow_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 if (UseLargePages) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 assert(total_reserved != 0, "total_reserved cannot be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
207 total_reserved = round_to(total_reserved, os::large_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
208 if (total_reserved < os::large_page_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 vm_exit_during_initialization(overflow_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Calculate the address at which the heap must reside in order for
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // the shared data to be at the required address.
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 char* heap_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (UseSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Calculate the address of the first word beyond the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 FileMapInfo* mapinfo = FileMapInfo::current_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 int lr = CompactingPermGenGen::n_regions - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 size_t capacity = align_size_up(mapinfo->space_capacity(lr), alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 heap_address = mapinfo->region_base(lr) + capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Calculate the address of the first word of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 heap_address -= total_reserved;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 heap_address = NULL; // any address will do.
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
229 if (UseCompressedOops) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
230 heap_address = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
231 *_total_reserved = total_reserved;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
232 *_n_covered_regions = n_covered_regions;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
233 *heap_rs = ReservedHeapSpace(total_reserved, alignment,
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
234 UseLargePages, heap_address);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
235
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
236 if (heap_address != NULL && !heap_rs->is_reserved()) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
237 // Failed to reserve at specified address - the requested memory
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
238 // region is taken already, for example, by 'java' launcher.
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
239 // Try again to reserver heap higher.
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
240 heap_address = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
241 *heap_rs = ReservedHeapSpace(total_reserved, alignment,
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
242 UseLargePages, heap_address);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
243
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
244 if (heap_address != NULL && !heap_rs->is_reserved()) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
245 // Failed to reserve at specified address again - give up.
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
246 heap_address = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
247 assert(heap_address == NULL, "");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
248 *heap_rs = ReservedHeapSpace(total_reserved, alignment,
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
249 UseLargePages, heap_address);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
250 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
251 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
252 return heap_address;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
253 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 *_total_reserved = total_reserved;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 *_n_covered_regions = n_covered_regions;
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
258 *heap_rs = ReservedHeapSpace(total_reserved, alignment,
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
259 UseLargePages, heap_address);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 return heap_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 void GenCollectedHeap::post_initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 SharedHeap::post_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
267 TwoGenerationCollectorPolicy *policy =
a61af66fc99e Initial load
duke
parents:
diff changeset
268 (TwoGenerationCollectorPolicy *)collector_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 guarantee(policy->is_two_generation_policy(), "Illegal policy type");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 DefNewGeneration* def_new_gen = (DefNewGeneration*) get_gen(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 assert(def_new_gen->kind() == Generation::DefNew ||
a61af66fc99e Initial load
duke
parents:
diff changeset
272 def_new_gen->kind() == Generation::ParNew ||
a61af66fc99e Initial load
duke
parents:
diff changeset
273 def_new_gen->kind() == Generation::ASParNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
274 "Wrong generation kind");
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 Generation* old_gen = get_gen(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 assert(old_gen->kind() == Generation::ConcurrentMarkSweep ||
a61af66fc99e Initial load
duke
parents:
diff changeset
278 old_gen->kind() == Generation::ASConcurrentMarkSweep ||
a61af66fc99e Initial load
duke
parents:
diff changeset
279 old_gen->kind() == Generation::MarkSweepCompact,
a61af66fc99e Initial load
duke
parents:
diff changeset
280 "Wrong generation kind");
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 policy->initialize_size_policy(def_new_gen->eden()->capacity(),
a61af66fc99e Initial load
duke
parents:
diff changeset
283 old_gen->capacity(),
a61af66fc99e Initial load
duke
parents:
diff changeset
284 def_new_gen->from()->capacity());
a61af66fc99e Initial load
duke
parents:
diff changeset
285 policy->initialize_gc_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 void GenCollectedHeap::ref_processing_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 SharedHeap::ref_processing_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
290 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 _gens[i]->ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 size_t GenCollectedHeap::capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 res += _gens[i]->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 size_t GenCollectedHeap::used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 res += _gens[i]->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Save the "used_region" for generations level and lower,
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // and, if perm is true, for perm gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void GenCollectedHeap::save_used_regions(int level, bool perm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 assert(level < _n_gens, "Illegal level parameter");
a61af66fc99e Initial load
duke
parents:
diff changeset
315 for (int i = level; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 _gens[i]->save_used_region();
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (perm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 perm_gen()->save_used_region();
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 size_t GenCollectedHeap::max_capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 res += _gens[i]->max_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // Update the _full_collections_completed counter
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // at the end of a stop-world full GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 unsigned int GenCollectedHeap::update_full_collections_completed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
335 assert(_full_collections_completed <= _total_full_collections,
a61af66fc99e Initial load
duke
parents:
diff changeset
336 "Can't complete more collections than were started");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 _full_collections_completed = _total_full_collections;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 ml.notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
339 return _full_collections_completed;
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // Update the _full_collections_completed counter, as appropriate,
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // at the end of a concurrent GC cycle. Note the conditional update
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // below to allow this method to be called by a concurrent collector
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // without synchronizing in any manner with the VM thread (which
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // may already have initiated a STW full collection "concurrently").
a61af66fc99e Initial load
duke
parents:
diff changeset
347 unsigned int GenCollectedHeap::update_full_collections_completed(unsigned int count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 assert((_full_collections_completed <= _total_full_collections) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
350 (count <= _total_full_collections),
a61af66fc99e Initial load
duke
parents:
diff changeset
351 "Can't complete more collections than were started");
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (count > _full_collections_completed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 _full_collections_completed = count;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 ml.notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 return _full_collections_completed;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Override of memory state checking method in CollectedHeap:
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Some collectors (CMS for example) can't have badHeapWordVal written
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // in the first two words of an object. (For instance , in the case of
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // CMS these words hold state used to synchronize between certain
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // (concurrent) GC steps and direct allocating mutators.)
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // The skip_header_HeapWords() method below, allows us to skip
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // over the requisite number of HeapWord's. Note that (for
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // generational collectors) this means that those many words are
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // skipped in each object, irrespective of the generation in which
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // that object lives. The resultant loss of precision seems to be
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // harmless and the pain of avoiding that imprecision appears somewhat
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // higher than we are prepared to pay for such rudimentary debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // support.
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void GenCollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
375 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (CheckMemoryInitialization && ZapUnusedHeapArea) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // We are asked to check a size in HeapWords,
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // but the memory is mangled in juint words.
a61af66fc99e Initial load
duke
parents:
diff changeset
379 juint* start = (juint*) (addr + skip_header_HeapWords());
a61af66fc99e Initial load
duke
parents:
diff changeset
380 juint* end = (juint*) (addr + size);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 for (juint* slot = start; slot < end; slot += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 assert(*slot == badHeapWordVal,
a61af66fc99e Initial load
duke
parents:
diff changeset
383 "Found non badHeapWordValue in pre-allocation check");
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 HeapWord* GenCollectedHeap::attempt_allocation(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
390 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
391 bool first_only) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 HeapWord* res;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (_gens[i]->should_allocate(size, is_tlab)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 res = _gens[i]->allocate(size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 if (res != NULL) return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 else if (first_only) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
401 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 HeapWord* GenCollectedHeap::mem_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
405 bool is_large_noref,
a61af66fc99e Initial load
duke
parents:
diff changeset
406 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
407 bool* gc_overhead_limit_was_exceeded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
408 return collector_policy()->mem_allocate_work(size,
a61af66fc99e Initial load
duke
parents:
diff changeset
409 is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
410 gc_overhead_limit_was_exceeded);
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 bool GenCollectedHeap::must_clear_all_soft_refs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 return _gc_cause == GCCause::_last_ditch_collection;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
1520
bb843ebc7c55 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 1387
diff changeset
418 return UseConcMarkSweepGC &&
bb843ebc7c55 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 1387
diff changeset
419 ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
bb843ebc7c55 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 1387
diff changeset
420 (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 void GenCollectedHeap::do_collection(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
424 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
425 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
426 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
427 int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 bool prepared_for_verification = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 DEBUG_ONLY(Thread* my_thread = Thread::current();)
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
433 assert(my_thread->is_VM_thread() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
434 my_thread->is_ConcurrentGC_thread(),
a61af66fc99e Initial load
duke
parents:
diff changeset
435 "incorrect thread type capability");
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
436 assert(Heap_lock->is_locked(),
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
437 "the requesting thread should have the Heap_lock");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
438 guarantee(!is_gc_active(), "collection is not reentrant");
a61af66fc99e Initial load
duke
parents:
diff changeset
439 assert(max_level < n_gens(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if (GC_locker::check_active_before_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 return; // GC is disabled (e.g. JNI GetXXXCritical operation)
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
445 const bool do_clear_all_soft_refs = clear_all_soft_refs ||
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
446 collector_policy()->should_clear_all_soft_refs();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
447
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
448 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
449
0
a61af66fc99e Initial load
duke
parents:
diff changeset
450 const size_t perm_prev_used = perm_gen()->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 if (PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 Universe::print_heap_before_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 gclog_or_tty->print_cr("GC Cause: %s", GCCause::to_string(gc_cause()));
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 FlagSetting fl(_is_gc_active, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 bool complete = full && (max_level == (n_gens()-1));
a61af66fc99e Initial load
duke
parents:
diff changeset
463 const char* gc_cause_str = "GC ";
a61af66fc99e Initial load
duke
parents:
diff changeset
464 if (complete) {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 GCCause::Cause cause = gc_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 if (cause == GCCause::_java_lang_system_gc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 gc_cause_str = "Full GC (System) ";
a61af66fc99e Initial load
duke
parents:
diff changeset
468 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 gc_cause_str = "Full GC ";
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
474 TraceTime t(gc_cause_str, PrintGCDetails, false, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 gc_prologue(complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 increment_total_collections(complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 size_t gch_prev_used = used();
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 int starting_level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 if (full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // Search for the oldest generation which will collect all younger
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // generations, and start collection loop there.
a61af66fc99e Initial load
duke
parents:
diff changeset
485 for (int i = max_level; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 if (_gens[i]->full_collects_younger_generations()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 starting_level = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 bool must_restore_marks_for_biased_locking = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 int max_level_collected = starting_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 for (int i = starting_level; i <= max_level; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 if (_gens[i]->should_collect(full, size, is_tlab)) {
880
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
498 if (i == n_gens() - 1) { // a major collection is to happen
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
499 if (!complete) {
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
500 // The full_collections increment was missed above.
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
501 increment_total_full_collections();
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
502 }
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
503 pre_full_gc_dump(); // do any pre full gc dumps
880
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
504 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // Timer for individual generations. Last argument is false: no CR
a61af66fc99e Initial load
duke
parents:
diff changeset
506 TraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 TraceCollectorStats tcs(_gens[i]->counters());
a61af66fc99e Initial load
duke
parents:
diff changeset
508 TraceMemoryManagerStats tmms(_gens[i]->kind());
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 size_t prev_used = _gens[i]->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
511 _gens[i]->stat_record()->invocations++;
a61af66fc99e Initial load
duke
parents:
diff changeset
512 _gens[i]->stat_record()->accumulated_time.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
513
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
514 // Must be done anew before each collection because
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
515 // a previous collection will do mangling and will
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
516 // change top of some spaces.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
517 record_gen_tops_before_GC();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
518
0
a61af66fc99e Initial load
duke
parents:
diff changeset
519 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 gclog_or_tty->print("level=%d invoke=%d size=" SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
521 i,
a61af66fc99e Initial load
duke
parents:
diff changeset
522 _gens[i]->stat_record()->invocations,
a61af66fc99e Initial load
duke
parents:
diff changeset
523 size*HeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 if (VerifyBeforeGC && i >= VerifyGCLevel &&
a61af66fc99e Initial load
duke
parents:
diff changeset
527 total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 HandleMark hm; // Discard invalid handles created during verification
a61af66fc99e Initial load
duke
parents:
diff changeset
529 if (!prepared_for_verification) {
a61af66fc99e Initial load
duke
parents:
diff changeset
530 prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
531 prepared_for_verification = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533 gclog_or_tty->print(" VerifyBeforeGC:");
a61af66fc99e Initial load
duke
parents:
diff changeset
534 Universe::verify(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536 COMPILER2_PRESENT(DerivedPointerTable::clear());
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 if (!must_restore_marks_for_biased_locking &&
a61af66fc99e Initial load
duke
parents:
diff changeset
539 _gens[i]->performs_in_place_marking()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // We perform this mark word preservation work lazily
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // because it's only at this point that we know whether we
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // absolutely have to do it; we want to avoid doing it for
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // scavenge-only collections where it's unnecessary
a61af66fc99e Initial load
duke
parents:
diff changeset
544 must_restore_marks_for_biased_locking = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
545 BiasedLocking::preserve_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // Do collection work
a61af66fc99e Initial load
duke
parents:
diff changeset
549 {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // Note on ref discovery: For what appear to be historical reasons,
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // GCH enables and disabled (by enqueing) refs discovery.
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // In the future this should be moved into the generation's
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // collect method so that ref discovery and enqueueing concerns
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // are local to a generation. The collect method could return
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // an appropriate indication in the case that notification on
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // the ref lock was needed. This will make the treatment of
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // weak refs more uniform (and indeed remove such concerns
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // from GCH). XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 HandleMark hm; // Discard invalid handles created during gc
a61af66fc99e Initial load
duke
parents:
diff changeset
561 save_marks(); // save marks for all gens
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // We want to discover references, but not process them yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // This mode is disabled in process_discovered_references if the
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // generation does some collection work, or in
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // enqueue_discovered_references if the generation returns
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // without doing any work.
a61af66fc99e Initial load
duke
parents:
diff changeset
567 ReferenceProcessor* rp = _gens[i]->ref_processor();
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // If the discovery of ("weak") refs in this generation is
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // atomic wrt other collectors in this configuration, we
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // are guaranteed to have empty discovered ref lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 if (rp->discovery_is_atomic()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 rp->verify_no_references_recorded();
a61af66fc99e Initial load
duke
parents:
diff changeset
573 rp->enable_discovery();
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
574 rp->setup_policy(do_clear_all_soft_refs);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 } else {
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 269
diff changeset
576 // collect() below will enable discovery as appropriate
0
a61af66fc99e Initial load
duke
parents:
diff changeset
577 }
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
578 _gens[i]->collect(full, do_clear_all_soft_refs, size, is_tlab);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (!rp->enqueuing_is_done()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 rp->enqueue_discovered_references();
a61af66fc99e Initial load
duke
parents:
diff changeset
581 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
582 rp->set_enqueuing_is_done(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
584 rp->verify_no_references_recorded();
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 max_level_collected = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // Determine if allocation request was met.
a61af66fc99e Initial load
duke
parents:
diff changeset
589 if (size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
590 if (!is_tlab || _gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 if (size*HeapWordSize <= _gens[i]->unsafe_max_alloc_nogc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 _gens[i]->stat_record()->accumulated_time.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 update_gc_stats(i, full);
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 if (VerifyAfterGC && i >= VerifyGCLevel &&
a61af66fc99e Initial load
duke
parents:
diff changeset
604 total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 HandleMark hm; // Discard invalid handles created during verification
a61af66fc99e Initial load
duke
parents:
diff changeset
606 gclog_or_tty->print(" VerifyAfterGC:");
a61af66fc99e Initial load
duke
parents:
diff changeset
607 Universe::verify(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 gclog_or_tty->print(":");
a61af66fc99e Initial load
duke
parents:
diff changeset
612 _gens[i]->print_heap_change(prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // Update "complete" boolean wrt what actually transpired --
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // for instance, a promotion failure could have led to
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // a whole heap collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
620 complete = complete || (max_level_collected == n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
621
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
622 if (complete) { // We did a "major" collection
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
623 post_full_gc_dump(); // do any post full gc dumps
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
624 }
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
625
0
a61af66fc99e Initial load
duke
parents:
diff changeset
626 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 print_heap_change(gch_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Print perm gen info for full GC with PrintGCDetails flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
630 if (complete) {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 print_perm_heap_change(perm_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 for (int j = max_level_collected; j >= 0; j -= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // Adjust generation sizes.
a61af66fc99e Initial load
duke
parents:
diff changeset
637 _gens[j]->compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 if (complete) {
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // Ask the permanent generation to adjust size for full collections
a61af66fc99e Initial load
duke
parents:
diff changeset
642 perm()->compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
643 update_full_collections_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // Track memory usage and detect low memory after GC finishes
a61af66fc99e Initial load
duke
parents:
diff changeset
647 MemoryService::track_memory_usage();
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 gc_epilogue(complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 if (must_restore_marks_for_biased_locking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
652 BiasedLocking::restore_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 AdaptiveSizePolicy* sp = gen_policy()->size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
657 AdaptiveSizePolicyOutput(sp, total_collections());
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 if (PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 Universe::print_heap_after_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
663 #ifdef TRACESPINNING
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
664 ParallelTaskTerminator::print_termination_counts();
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
665 #endif
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
666
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 tty->print_cr("Stopping after GC #%d", ExitAfterGCNum);
a61af66fc99e Initial load
duke
parents:
diff changeset
669 vm_exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 HeapWord* GenCollectedHeap::satisfy_failed_allocation(size_t size, bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 return collector_policy()->satisfy_failed_allocation(size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 void GenCollectedHeap::set_par_threads(int t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 SharedHeap::set_par_threads(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 _gen_process_strong_tasks->set_par_threads(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682 class AssertIsPermClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
683 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
684 void do_oop(oop* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 assert((*p) == NULL || (*p)->is_perm(), "Referent should be perm.");
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
687 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 };
a61af66fc99e Initial load
duke
parents:
diff changeset
689 static AssertIsPermClosure assert_is_perm_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 void GenCollectedHeap::
a61af66fc99e Initial load
duke
parents:
diff changeset
692 gen_process_strong_roots(int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
693 bool younger_gens_as_roots,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
694 bool activate_scope,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 bool collecting_perm_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
696 SharedHeap::ScanningOption so,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
697 OopsInGenClosure* not_older_gens,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
698 bool do_code_roots,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
699 OopsInGenClosure* older_gens) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // General strong roots.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
701
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
702 if (!do_code_roots) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
703 SharedHeap::process_strong_roots(activate_scope, collecting_perm_gen, so,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
704 not_older_gens, NULL, older_gens);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
705 } else {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
706 bool do_code_marking = (activate_scope || nmethod::oops_do_marking_is_active());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
707 CodeBlobToOopClosure code_roots(not_older_gens, /*do_marking=*/ do_code_marking);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
708 SharedHeap::process_strong_roots(activate_scope, collecting_perm_gen, so,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
709 not_older_gens, &code_roots, older_gens);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
710 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 if (younger_gens_as_roots) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 for (int i = 0; i < level; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 not_older_gens->set_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 _gens[i]->oop_iterate(not_older_gens);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 not_older_gens->reset_generation();
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // When collection is parallel, all threads get to cooperate to do
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // older-gen scanning.
a61af66fc99e Initial load
duke
parents:
diff changeset
723 for (int i = level+1; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 older_gens->set_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
725 rem_set()->younger_refs_iterate(_gens[i], older_gens);
a61af66fc99e Initial load
duke
parents:
diff changeset
726 older_gens->reset_generation();
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 _gen_process_strong_tasks->all_tasks_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
733 CodeBlobClosure* code_roots,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
734 OopClosure* non_root_closure) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
735 SharedHeap::process_weak_roots(root_closure, code_roots, non_root_closure);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // "Local" "weak" refs
a61af66fc99e Initial load
duke
parents:
diff changeset
737 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 _gens[i]->ref_processor()->weak_oops_do(root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 #define GCH_SINCE_SAVE_MARKS_ITERATE_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
743 void GenCollectedHeap:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
744 oop_since_save_marks_iterate(int level, \
a61af66fc99e Initial load
duke
parents:
diff changeset
745 OopClosureType* cur, \
a61af66fc99e Initial load
duke
parents:
diff changeset
746 OopClosureType* older) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
747 _gens[level]->oop_since_save_marks_iterate##nv_suffix(cur); \
a61af66fc99e Initial load
duke
parents:
diff changeset
748 for (int i = level+1; i < n_gens(); i++) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
749 _gens[i]->oop_since_save_marks_iterate##nv_suffix(older); \
a61af66fc99e Initial load
duke
parents:
diff changeset
750 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
751 perm_gen()->oop_since_save_marks_iterate##nv_suffix(older); \
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 #undef GCH_SINCE_SAVE_MARKS_ITERATE_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 bool GenCollectedHeap::no_allocs_since_save_marks(int level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 for (int i = level; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 if (!_gens[i]->no_allocs_since_save_marks()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762 return perm_gen()->no_allocs_since_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 bool GenCollectedHeap::supports_inline_contig_alloc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
766 return _gens[0]->supports_inline_contig_alloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 HeapWord** GenCollectedHeap::top_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
770 return _gens[0]->top_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 HeapWord** GenCollectedHeap::end_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 return _gens[0]->end_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 size_t GenCollectedHeap::unsafe_max_alloc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 return _gens[0]->unsafe_max_alloc_nogc();
a61af66fc99e Initial load
duke
parents:
diff changeset
779 }
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // public collection interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 void GenCollectedHeap::collect(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 if (should_do_concurrent_full_gc(cause)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // mostly concurrent full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
787 collect_mostly_concurrent(cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 #else // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
789 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
790 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
791 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
792 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
793 if (cause == GCCause::_scavenge_alot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
794 // minor collection only
a61af66fc99e Initial load
duke
parents:
diff changeset
795 collect(cause, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
796 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // Stop-the-world full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
798 collect(cause, n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // Stop-the-world full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
802 collect(cause, n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
803 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
806
a61af66fc99e Initial load
duke
parents:
diff changeset
807 void GenCollectedHeap::collect(GCCause::Cause cause, int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // The caller doesn't have the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
809 assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
810 MutexLocker ml(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 collect_locked(cause, max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // This interface assumes that it's being called by the
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // vm thread. It collects the heap assuming that the
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // heap lock is already held and that we are executing in
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // the context of the vm thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
818 void GenCollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 assert(Thread::current()->is_VM_thread(), "Precondition#1");
a61af66fc99e Initial load
duke
parents:
diff changeset
820 assert(Heap_lock->is_locked(), "Precondition#2");
a61af66fc99e Initial load
duke
parents:
diff changeset
821 GCCauseSetter gcs(this, cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 switch (cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 case GCCause::_heap_inspection:
a61af66fc99e Initial load
duke
parents:
diff changeset
824 case GCCause::_heap_dump: {
a61af66fc99e Initial load
duke
parents:
diff changeset
825 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 do_full_collection(false, // don't clear all soft refs
a61af66fc99e Initial load
duke
parents:
diff changeset
827 n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
828 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830 default: // XXX FIX ME
a61af66fc99e Initial load
duke
parents:
diff changeset
831 ShouldNotReachHere(); // Unexpected use of this function
a61af66fc99e Initial load
duke
parents:
diff changeset
832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 void GenCollectedHeap::collect_locked(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // The caller has the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
837 assert(Heap_lock->owned_by_self(), "this thread should own the Heap_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
838 collect_locked(cause, n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // this is the private collection interface
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // The Heap_lock is expected to be held on entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 void GenCollectedHeap::collect_locked(GCCause::Cause cause, int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
845 if (_preloading_shared_classes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
846 warning("\nThe permanent generation is not large enough to preload "
a61af66fc99e Initial load
duke
parents:
diff changeset
847 "requested classes.\nUse -XX:PermSize= to increase the initial "
a61af66fc99e Initial load
duke
parents:
diff changeset
848 "size of the permanent generation.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
849 vm_exit(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // Read the GC count while holding the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
852 unsigned int gc_count_before = total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
853 unsigned int full_gc_count_before = total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
854 {
a61af66fc99e Initial load
duke
parents:
diff changeset
855 MutexUnlocker mu(Heap_lock); // give up heap lock, execute gets it back
a61af66fc99e Initial load
duke
parents:
diff changeset
856 VM_GenCollectFull op(gc_count_before, full_gc_count_before,
a61af66fc99e Initial load
duke
parents:
diff changeset
857 cause, max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
863 bool GenCollectedHeap::create_cms_collector() {
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 assert(((_gens[1]->kind() == Generation::ConcurrentMarkSweep) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
866 (_gens[1]->kind() == Generation::ASConcurrentMarkSweep)) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
867 _perm_gen->as_gen()->kind() == Generation::ConcurrentMarkSweep,
a61af66fc99e Initial load
duke
parents:
diff changeset
868 "Unexpected generation kinds");
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // Skip two header words in the block content verification
a61af66fc99e Initial load
duke
parents:
diff changeset
870 NOT_PRODUCT(_skip_header_HeapWords = CMSCollector::skip_header_HeapWords();)
a61af66fc99e Initial load
duke
parents:
diff changeset
871 CMSCollector* collector = new CMSCollector(
a61af66fc99e Initial load
duke
parents:
diff changeset
872 (ConcurrentMarkSweepGeneration*)_gens[1],
a61af66fc99e Initial load
duke
parents:
diff changeset
873 (ConcurrentMarkSweepGeneration*)_perm_gen->as_gen(),
a61af66fc99e Initial load
duke
parents:
diff changeset
874 _rem_set->as_CardTableRS(),
a61af66fc99e Initial load
duke
parents:
diff changeset
875 (ConcurrentMarkSweepPolicy*) collector_policy());
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 if (collector == NULL || !collector->completed_initialization()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
878 if (collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 delete collector; // Be nice in embedded situation
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881 vm_shutdown_during_initialization("Could not create CMS collector");
a61af66fc99e Initial load
duke
parents:
diff changeset
882 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
884 return true; // success
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 void GenCollectedHeap::collect_mostly_concurrent(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 assert(!Heap_lock->owned_by_self(), "Should not own Heap_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 MutexLocker ml(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Read the GC counts while holding the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
892 unsigned int full_gc_count_before = total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
893 unsigned int gc_count_before = total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
894 {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 MutexUnlocker mu(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 VM_GenCollectFullConcurrent op(gc_count_before, full_gc_count_before, cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
897 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
900 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
904 int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
905 int local_max_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
906 if (!incremental_collection_will_fail() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
907 gc_cause() == GCCause::_gc_locker) {
a61af66fc99e Initial load
duke
parents:
diff changeset
908 local_max_level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
909 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
910 local_max_level = max_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 do_collection(true /* full */,
a61af66fc99e Initial load
duke
parents:
diff changeset
914 clear_all_soft_refs /* clear_all_soft_refs */,
a61af66fc99e Initial load
duke
parents:
diff changeset
915 0 /* size */,
a61af66fc99e Initial load
duke
parents:
diff changeset
916 false /* is_tlab */,
a61af66fc99e Initial load
duke
parents:
diff changeset
917 local_max_level /* max_level */);
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // Hack XXX FIX ME !!!
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // A scavenge may not have been attempted, or may have
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // been attempted and failed, because the old gen was too full
a61af66fc99e Initial load
duke
parents:
diff changeset
921 if (local_max_level == 0 && gc_cause() == GCCause::_gc_locker &&
a61af66fc99e Initial load
duke
parents:
diff changeset
922 incremental_collection_will_fail()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
923 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
924 gclog_or_tty->print_cr("GC locker: Trying a full collection "
a61af66fc99e Initial load
duke
parents:
diff changeset
925 "because scavenge failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // This time allow the old gen to be collected as well
a61af66fc99e Initial load
duke
parents:
diff changeset
928 do_collection(true /* full */,
a61af66fc99e Initial load
duke
parents:
diff changeset
929 clear_all_soft_refs /* clear_all_soft_refs */,
a61af66fc99e Initial load
duke
parents:
diff changeset
930 0 /* size */,
a61af66fc99e Initial load
duke
parents:
diff changeset
931 false /* is_tlab */,
a61af66fc99e Initial load
duke
parents:
diff changeset
932 n_gens() - 1 /* max_level */);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 }
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 // Returns "TRUE" iff "p" points into the allocated area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
937 bool GenCollectedHeap::is_in(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
938 #ifndef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
939 guarantee(VerifyBeforeGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
940 VerifyDuringGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
941 VerifyBeforeExit ||
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 989
diff changeset
942 PrintAssembly ||
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 989
diff changeset
943 tty->count() != 0 || // already printing
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1626
diff changeset
944 VerifyAfterGC ||
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1626
diff changeset
945 VMError::fatal_error_in_progress(), "too expensive");
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1626
diff changeset
946
0
a61af66fc99e Initial load
duke
parents:
diff changeset
947 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // This might be sped up with a cache of the last generation that
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // answered yes.
a61af66fc99e Initial load
duke
parents:
diff changeset
950 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 if (_gens[i]->is_in(p)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953 if (_perm_gen->as_gen()->is_in(p)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
955 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 }
a61af66fc99e Initial load
duke
parents:
diff changeset
957
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // Returns "TRUE" iff "p" points into the allocated area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
959 bool GenCollectedHeap::is_in_youngest(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
960 return _gens[0]->is_in(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
962
a61af66fc99e Initial load
duke
parents:
diff changeset
963 void GenCollectedHeap::oop_iterate(OopClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
964 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
965 _gens[i]->oop_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
967 }
a61af66fc99e Initial load
duke
parents:
diff changeset
968
a61af66fc99e Initial load
duke
parents:
diff changeset
969 void GenCollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
970 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
971 _gens[i]->oop_iterate(mr, cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
973 }
a61af66fc99e Initial load
duke
parents:
diff changeset
974
a61af66fc99e Initial load
duke
parents:
diff changeset
975 void GenCollectedHeap::object_iterate(ObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
976 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
977 _gens[i]->object_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979 perm_gen()->object_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
980 }
a61af66fc99e Initial load
duke
parents:
diff changeset
981
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
982 void GenCollectedHeap::safe_object_iterate(ObjectClosure* cl) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
983 for (int i = 0; i < _n_gens; i++) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
984 _gens[i]->safe_object_iterate(cl);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
985 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
986 perm_gen()->safe_object_iterate(cl);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
987 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
988
0
a61af66fc99e Initial load
duke
parents:
diff changeset
989 void GenCollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
990 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
991 _gens[i]->object_iterate_since_last_GC(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
992 }
a61af66fc99e Initial load
duke
parents:
diff changeset
993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 Space* GenCollectedHeap::space_containing(const void* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
996 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
997 Space* res = _gens[i]->space_containing(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
998 if (res != NULL) return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 Space* res = perm_gen()->space_containing(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 if (res != NULL) return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 assert(false, "Could not find containing space");
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 HeapWord* GenCollectedHeap::block_start(const void* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 assert(is_in_reserved(addr), "block_start of address outside of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 if (_gens[i]->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 assert(_gens[i]->is_in(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 "addr should be in allocated part of generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 return _gens[i]->block_start(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 if (perm_gen()->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 assert(perm_gen()->is_in(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 "addr should be in allocated part of perm gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 return perm_gen()->block_start(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 assert(false, "Some generation should contain the address");
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1025
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 size_t GenCollectedHeap::block_size(const HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 assert(is_in_reserved(addr), "block_size of address outside of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 if (_gens[i]->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 assert(_gens[i]->is_in(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 "addr should be in allocated part of generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 return _gens[i]->block_size(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 if (perm_gen()->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 assert(perm_gen()->is_in(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 "addr should be in allocated part of perm gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 return perm_gen()->block_size(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 assert(false, "Some generation should contain the address");
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 bool GenCollectedHeap::block_is_obj(const HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 assert(is_in_reserved(addr), "block_is_obj of address outside of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 assert(block_start(addr) == addr, "addr must be a block start");
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 if (_gens[i]->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 return _gens[i]->block_is_obj(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 if (perm_gen()->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 return perm_gen()->block_is_obj(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 assert(false, "Some generation should contain the address");
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 bool GenCollectedHeap::supports_tlab_allocation() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 for (int i = 0; i < _n_gens; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 if (_gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 size_t GenCollectedHeap::tlab_capacity(Thread* thr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 size_t result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 for (int i = 0; i < _n_gens; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 if (_gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 result += _gens[i]->tlab_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 size_t GenCollectedHeap::unsafe_max_tlab_alloc(Thread* thr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 size_t result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 for (int i = 0; i < _n_gens; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (_gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 result += _gens[i]->unsafe_max_tlab_alloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1087
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 HeapWord* GenCollectedHeap::allocate_new_tlab(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 bool gc_overhead_limit_was_exceeded;
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 HeapWord* result = mem_allocate(size /* size */,
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 false /* is_large_noref */,
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 true /* is_tlab */,
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 &gc_overhead_limit_was_exceeded);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // Requires "*prev_ptr" to be non-NULL. Deletes and a block of minimal size
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // from the list headed by "*prev_ptr".
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 static ScratchBlock *removeSmallestScratch(ScratchBlock **prev_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 bool first = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 size_t min_size = 0; // "first" makes this conceptually infinite.
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 ScratchBlock **smallest_ptr, *smallest;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 ScratchBlock *cur = *prev_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 while (cur) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 assert(*prev_ptr == cur, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 if (first || cur->num_words < min_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 smallest_ptr = prev_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 smallest = cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 min_size = smallest->num_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 first = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 prev_ptr = &cur->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 cur = cur->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 smallest = *smallest_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 *smallest_ptr = smallest->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 return smallest;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // Sort the scratch block list headed by res into decreasing size order,
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 // and set "res" to the result.
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 static void sort_scratch_list(ScratchBlock*& list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 ScratchBlock* sorted = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 ScratchBlock* unsorted = list;
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 while (unsorted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 ScratchBlock *smallest = removeSmallestScratch(&unsorted);
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 smallest->next = sorted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 sorted = smallest;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 list = sorted;
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 ScratchBlock* GenCollectedHeap::gather_scratch(Generation* requestor,
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 size_t max_alloc_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 ScratchBlock* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 _gens[i]->contribute_scratch(res, requestor, max_alloc_words);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 sort_scratch_list(res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1143 void GenCollectedHeap::release_scratch() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1144 for (int i = 0; i < _n_gens; i++) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1145 _gens[i]->reset_scratch();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1146 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1147 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1148
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 size_t GenCollectedHeap::large_typearray_limit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 return gen_policy()->large_typearray_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 class GenPrepareForVerifyClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 gen->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 void GenCollectedHeap::prepare_for_verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 ensure_parsability(false); // no need to retire TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 GenPrepareForVerifyClosure blk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 generation_iterate(&blk, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 perm_gen()->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 void GenCollectedHeap::generation_iterate(GenClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 bool old_to_young) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 if (old_to_young) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 for (int i = _n_gens-1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 cl->do_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 cl->do_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 void GenCollectedHeap::space_iterate(SpaceClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 _gens[i]->space_iterate(cl, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 perm_gen()->space_iterate(cl, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 bool GenCollectedHeap::is_maximal_no_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 for (int i = 0; i < _n_gens; i++) { // skip perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 if (!_gens[i]->is_maximal_no_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 void GenCollectedHeap::save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 _gens[i]->save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 perm_gen()->save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 void GenCollectedHeap::compute_new_generation_sizes(int collectedGen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 for (int i = 0; i <= collectedGen; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 _gens[i]->compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 GenCollectedHeap* GenCollectedHeap::heap() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 assert(_gch != NULL, "Uninitialized access to GenCollectedHeap::heap()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 assert(_gch->kind() == CollectedHeap::GenCollectedHeap, "not a generational heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 return _gch;
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 void GenCollectedHeap::prepare_for_compaction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 Generation* scanning_gen = _gens[_n_gens-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // Start by compacting into same gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 CompactPoint cp(scanning_gen, NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 while (scanning_gen != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 scanning_gen->prepare_for_compaction(&cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 scanning_gen = prev_gen(scanning_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 GCStats* GenCollectedHeap::gc_stats(int level) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 return _gens[level]->gc_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1229
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 647
diff changeset
1230 void GenCollectedHeap::verify(bool allow_dirty, bool silent, bool option /* ignored */) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 if (!silent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 gclog_or_tty->print("permgen ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 perm_gen()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 for (int i = _n_gens-1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 Generation* g = _gens[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 if (!silent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 gclog_or_tty->print(g->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 g->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 if (!silent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 gclog_or_tty->print("remset ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 rem_set()->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 if (!silent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 gclog_or_tty->print("ref_proc ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 ReferenceProcessor::verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 void GenCollectedHeap::print() const { print_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 void GenCollectedHeap::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 _gens[i]->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 perm_gen()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1260
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 void GenCollectedHeap::gc_threads_do(ThreadClosure* tc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 if (workers() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 workers()->threads_do(tc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 ConcurrentMarkSweepThread::threads_do(tc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1271
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 void GenCollectedHeap::print_gc_threads_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 if (UseParNewGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 workers()->print_worker_threads_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 ConcurrentMarkSweepThread::print_all_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1282
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 void GenCollectedHeap::print_tracing_info() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 if (TraceGen0Time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 get_gen(0)->print_summary_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 if (TraceGen1Time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 get_gen(1)->print_summary_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 void GenCollectedHeap::print_heap_change(size_t prev_used) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 gclog_or_tty->print(" " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 "->" SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 "(" SIZE_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 prev_used, used(), capacity());
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 gclog_or_tty->print(" " SIZE_FORMAT "K"
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 "->" SIZE_FORMAT "K"
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 "(" SIZE_FORMAT "K)",
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 prev_used / K, used() / K, capacity() / K);
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1305
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 //New method to print perm gen info with PrintGCDetails flag
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 void GenCollectedHeap::print_perm_heap_change(size_t perm_prev_used) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 gclog_or_tty->print(", [%s :", perm_gen()->short_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 perm_gen()->print_heap_change(perm_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 gclog_or_tty->print("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1312
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 class GenGCPrologueClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 bool _full;
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 gen->gc_prologue(_full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 GenGCPrologueClosure(bool full) : _full(full) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 void GenCollectedHeap::gc_prologue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
1325
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 always_do_update_barrier = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // Fill TLAB's and such
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 CollectedHeap::accumulate_statistics_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 ensure_parsability(true); // retire TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
1330
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 // Call allocation profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 AllocationProfiler::iterate_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 // Walk generations
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 GenGCPrologueClosure blk(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 generation_iterate(&blk, false); // not old-to-young.
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 perm_gen()->gc_prologue(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1338
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 class GenGCEpilogueClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 bool _full;
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 gen->gc_epilogue(_full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 GenGCEpilogueClosure(bool full) : _full(full) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 void GenCollectedHeap::gc_epilogue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 // Remember if a partial collection of the heap failed, and
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 // we did a complete collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 if (full && incremental_collection_will_fail()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 set_last_incremental_collection_failed();
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 clear_last_incremental_collection_failed();
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // Clear the flag, if set; the generation gc_epilogues will set the
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 // flag again if the condition persists despite the collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 clear_incremental_collection_will_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 assert(DerivedPointerTable::is_empty(), "derived pointer present");
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 size_t actual_gap = pointer_delta((HeapWord*) (max_uintx-3), *(end_addr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 guarantee(actual_gap > (size_t)FastAllocateSizeLimit, "inline allocation wraps");
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 #endif /* COMPILER2 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1366
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 resize_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
1368
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 GenGCEpilogueClosure blk(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 generation_iterate(&blk, false); // not old-to-young.
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 perm_gen()->gc_epilogue(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1372
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 always_do_update_barrier = UseConcMarkSweepGC;
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1375
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1376 #ifndef PRODUCT
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1377 class GenGCSaveTopsBeforeGCClosure: public GenCollectedHeap::GenClosure {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1378 private:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1379 public:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1380 void do_generation(Generation* gen) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1381 gen->record_spaces_top();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1382 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1383 };
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1384
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1385 void GenCollectedHeap::record_gen_tops_before_GC() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1386 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1387 GenGCSaveTopsBeforeGCClosure blk;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1388 generation_iterate(&blk, false); // not old-to-young.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1389 perm_gen()->record_spaces_top();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1390 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1391 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1392 #endif // not PRODUCT
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1393
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 class GenEnsureParsabilityClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 gen->ensure_parsability();
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1400
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 void GenCollectedHeap::ensure_parsability(bool retire_tlabs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 CollectedHeap::ensure_parsability(retire_tlabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 GenEnsureParsabilityClosure ep_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 generation_iterate(&ep_cl, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 perm_gen()->ensure_parsability();
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1407
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 oop GenCollectedHeap::handle_failed_promotion(Generation* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 oop obj,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1410 size_t obj_size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 HeapWord* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // First give each higher generation a chance to allocate the promoted object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 Generation* allocator = next_gen(gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 if (allocator != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 result = allocator->allocate(obj_size, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 } while (result == NULL && (allocator = next_gen(allocator)) != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 if (result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // Then give gen and higher generations a chance to expand and allocate the
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 // object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 result = gen->expand_and_allocate(obj_size, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 } while (result == NULL && (gen = next_gen(gen)) != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 if (result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 Copy::aligned_disjoint_words((HeapWord*)obj, result, obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 return oop(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 class GenTimeOfLastGCClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 jlong _time; // in ms
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 jlong _now; // in ms
a61af66fc99e Initial load
duke
parents:
diff changeset
1439
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 GenTimeOfLastGCClosure(jlong now) : _time(now), _now(now) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1442
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 jlong time() { return _time; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1444
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 _time = MIN2(_time, gen->time_of_last_gc(_now));
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1449
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 jlong GenCollectedHeap::millis_since_last_gc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 jlong now = os::javaTimeMillis();
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 GenTimeOfLastGCClosure tolgc_cl(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 // iterate over generations getting the oldest
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 // time that a generation was collected
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 generation_iterate(&tolgc_cl, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 tolgc_cl.do_generation(perm_gen());
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // XXX Despite the assert above, since javaTimeMillis()
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 // doesnot guarantee monotonically increasing return
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 // values (note, i didn't say "strictly monotonic"),
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 // we need to guard against getting back a time
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 // later than now. This should be fixed by basing
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 // on someting like gethrtime() which guarantees
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 // monotonicity. Note that cond_wait() is susceptible
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 // to a similar problem, because its interface is
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 // based on absolute time in the form of the
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 // system time's notion of UCT. See also 4506635
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // for yet another problem of similar nature. XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 jlong retVal = now - tolgc_cl.time();
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 if (retVal < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 NOT_PRODUCT(warning("time warp: %d", retVal);)
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 return retVal;
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 }