annotate src/share/vm/memory/genCollectedHeap.cpp @ 10241:d17700c82d7d

8006088: Incompatible heap size flags accepted by VM Summary: Make processing of minimum, initial and maximum heap size more intiutive by removing previous limitations on allowed values, and make error reporting consistent. Further, fix errors in ergonomic heap sizing. Reviewed-by: johnc, jwilhelm, tamao
author tschatzl
date Mon, 06 May 2013 17:19:42 +0200
parents b06ac540229e
children f2110083203d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4728
diff changeset
2 * Copyright (c) 2000, 2012, 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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
26 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
27 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
28 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
29 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
30 #include "gc_implementation/shared/collectorCounters.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
31 #include "gc_implementation/shared/vmGCOperations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
32 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
33 #include "memory/filemap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
34 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
35 #include "memory/genCollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
36 #include "memory/genOopClosures.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
37 #include "memory/generation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
38 #include "memory/generationSpec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
39 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
40 #include "memory/sharedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
41 #include "memory/space.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
42 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
43 #include "oops/oop.inline2.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
44 #include "runtime/aprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
45 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
46 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
47 #include "runtime/handles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
48 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
49 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
50 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
51 #include "services/memoryService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
52 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
53 #include "utilities/workgroup.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
54 #include "utilities/macros.hpp"
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
55 #if INCLUDE_ALL_GCS
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
56 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
57 #include "gc_implementation/concurrentMarkSweep/vmCMSOperations.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
58 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 GenCollectedHeap* GenCollectedHeap::_gch;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // The set of potentially parallel tasks in strong root scanning.
a61af66fc99e Initial load
duke
parents:
diff changeset
64 enum GCH_process_strong_roots_tasks {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // We probably want to parallelize both of these internally, but for now...
a61af66fc99e Initial load
duke
parents:
diff changeset
66 GCH_PS_younger_gens,
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // Leave this one last.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 GCH_PS_NumElements
a61af66fc99e Initial load
duke
parents:
diff changeset
69 };
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) :
a61af66fc99e Initial load
duke
parents:
diff changeset
72 SharedHeap(policy),
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _gen_policy(policy),
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _gen_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)),
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _full_collections_completed(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
76 {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (_gen_process_strong_tasks == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
78 !_gen_process_strong_tasks->valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 vm_exit_during_initialization("Failed necessary allocation.");
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 assert(policy != NULL, "Sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 jint GenCollectedHeap::initialize() {
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 989
diff changeset
85 CollectedHeap::pre_initialize();
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 989
diff changeset
86
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _n_gens = gen_policy()->number_of_generations();
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // While there are no constraints in the GC code that HeapWordSize
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // be any particular value, there are multiple other areas in the
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // system which believe this to be true (e.g. oop->object_size in some
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // cases incorrectly returns the size in wordSize units rather than
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // HeapWordSize).
a61af66fc99e Initial load
duke
parents:
diff changeset
95 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // The heap must be at least as aligned as generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 size_t alignment = Generation::GenGrain;
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 _gen_specs = gen_policy()->generations();
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Make sure the sizes are all aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 for (i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _gen_specs[i]->align(alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Allocate space for the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 char* heap_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 size_t total_reserved = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 int n_covered_regions = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 ReservedSpace heap_rs(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
113
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
114 heap_address = allocate(alignment, &total_reserved,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 &n_covered_regions, &heap_rs);
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 if (!heap_rs.is_reserved()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 vm_shutdown_during_initialization(
a61af66fc99e Initial load
duke
parents:
diff changeset
119 "Could not reserve enough space for object heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
120 return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 _reserved = MemRegion((HeapWord*)heap_rs.base(),
a61af66fc99e Initial load
duke
parents:
diff changeset
124 (HeapWord*)(heap_rs.base() + heap_rs.size()));
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // It is important to do this in a way such that concurrent readers can't
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // temporarily think somethings in the heap. (Seen this happen in asserts.)
a61af66fc99e Initial load
duke
parents:
diff changeset
128 _reserved.set_word_size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 _reserved.set_start((HeapWord*)heap_rs.base());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
130 size_t actual_heap_size = heap_rs.size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _reserved.set_end((HeapWord*)(heap_rs.base() + actual_heap_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _rem_set = collector_policy()->create_rem_set(_reserved, n_covered_regions);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 set_barrier_set(rem_set()->bs());
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 989
diff changeset
135
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _gch = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 for (i = 0; i < _n_gens; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
139 ReservedSpace this_rs = heap_rs.first_part(_gen_specs[i]->max_size(), false, false);
0
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 }
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
143 clear_incremental_collection_failed();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
145 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // If we are running CMS, create the collector responsible
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // for collecting the CMS generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (collector_policy()->is_concurrent_mark_sweep_policy()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 bool success = create_cms_collector();
a61af66fc99e Initial load
duke
parents:
diff changeset
150 if (!success) return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
152 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 char* GenCollectedHeap::allocate(size_t alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 size_t* _total_reserved,
a61af66fc99e Initial load
duke
parents:
diff changeset
160 int* _n_covered_regions,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 ReservedSpace* heap_rs){
a61af66fc99e Initial load
duke
parents:
diff changeset
162 const char overflow_msg[] = "The size of the object heap + VM data exceeds "
a61af66fc99e Initial load
duke
parents:
diff changeset
163 "the maximum representable size";
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Now figure out the total size.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 size_t total_reserved = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 int n_covered_regions = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 const size_t pageSize = UseLargePages ?
a61af66fc99e Initial load
duke
parents:
diff changeset
169 os::large_page_size() : os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 total_reserved += _gen_specs[i]->max_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (total_reserved < _gen_specs[i]->max_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 vm_exit_during_initialization(overflow_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 n_covered_regions += _gen_specs[i]->n_covered_regions();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
1626
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
178 assert(total_reserved % pageSize == 0,
1a11430e0326 6888573: class data sharing does not always disable large pages
jcoomes
parents: 1552
diff changeset
179 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
180 SIZE_FORMAT, total_reserved, pageSize));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
182 // Needed until the cardtable is fixed to have the right number
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
183 // of covered regions.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
184 n_covered_regions += 2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (UseLargePages) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 assert(total_reserved != 0, "total_reserved cannot be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
188 total_reserved = round_to(total_reserved, os::large_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (total_reserved < os::large_page_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 vm_exit_during_initialization(overflow_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
194 *_total_reserved = total_reserved;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 615
diff changeset
195 *_n_covered_regions = n_covered_regions;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
196 *heap_rs = Universe::reserve_heap(total_reserved, alignment);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
197 return heap_rs->base();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void GenCollectedHeap::post_initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 SharedHeap::post_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
203 TwoGenerationCollectorPolicy *policy =
a61af66fc99e Initial load
duke
parents:
diff changeset
204 (TwoGenerationCollectorPolicy *)collector_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
205 guarantee(policy->is_two_generation_policy(), "Illegal policy type");
a61af66fc99e Initial load
duke
parents:
diff changeset
206 DefNewGeneration* def_new_gen = (DefNewGeneration*) get_gen(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 assert(def_new_gen->kind() == Generation::DefNew ||
a61af66fc99e Initial load
duke
parents:
diff changeset
208 def_new_gen->kind() == Generation::ParNew ||
a61af66fc99e Initial load
duke
parents:
diff changeset
209 def_new_gen->kind() == Generation::ASParNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
210 "Wrong generation kind");
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Generation* old_gen = get_gen(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert(old_gen->kind() == Generation::ConcurrentMarkSweep ||
a61af66fc99e Initial load
duke
parents:
diff changeset
214 old_gen->kind() == Generation::ASConcurrentMarkSweep ||
a61af66fc99e Initial load
duke
parents:
diff changeset
215 old_gen->kind() == Generation::MarkSweepCompact,
a61af66fc99e Initial load
duke
parents:
diff changeset
216 "Wrong generation kind");
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 policy->initialize_size_policy(def_new_gen->eden()->capacity(),
a61af66fc99e Initial load
duke
parents:
diff changeset
219 old_gen->capacity(),
a61af66fc99e Initial load
duke
parents:
diff changeset
220 def_new_gen->from()->capacity());
a61af66fc99e Initial load
duke
parents:
diff changeset
221 policy->initialize_gc_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void GenCollectedHeap::ref_processing_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 SharedHeap::ref_processing_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
226 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 _gens[i]->ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 size_t GenCollectedHeap::capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 res += _gens[i]->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 size_t GenCollectedHeap::used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 res += _gens[i]->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
247 // Save the "used_region" for generations level and lower.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
248 void GenCollectedHeap::save_used_regions(int level) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 assert(level < _n_gens, "Illegal level parameter");
a61af66fc99e Initial load
duke
parents:
diff changeset
250 for (int i = level; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 _gens[i]->save_used_region();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 size_t GenCollectedHeap::max_capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 res += _gens[i]->max_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Update the _full_collections_completed counter
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // at the end of a stop-world full GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 unsigned int GenCollectedHeap::update_full_collections_completed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 assert(_full_collections_completed <= _total_full_collections,
a61af66fc99e Initial load
duke
parents:
diff changeset
268 "Can't complete more collections than were started");
a61af66fc99e Initial load
duke
parents:
diff changeset
269 _full_collections_completed = _total_full_collections;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 ml.notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
271 return _full_collections_completed;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Update the _full_collections_completed counter, as appropriate,
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // at the end of a concurrent GC cycle. Note the conditional update
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // below to allow this method to be called by a concurrent collector
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // without synchronizing in any manner with the VM thread (which
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // may already have initiated a STW full collection "concurrently").
a61af66fc99e Initial load
duke
parents:
diff changeset
279 unsigned int GenCollectedHeap::update_full_collections_completed(unsigned int count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 assert((_full_collections_completed <= _total_full_collections) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
282 (count <= _total_full_collections),
a61af66fc99e Initial load
duke
parents:
diff changeset
283 "Can't complete more collections than were started");
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (count > _full_collections_completed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _full_collections_completed = count;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 ml.notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 return _full_collections_completed;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // Override of memory state checking method in CollectedHeap:
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Some collectors (CMS for example) can't have badHeapWordVal written
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // in the first two words of an object. (For instance , in the case of
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // CMS these words hold state used to synchronize between certain
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // (concurrent) GC steps and direct allocating mutators.)
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // The skip_header_HeapWords() method below, allows us to skip
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // over the requisite number of HeapWord's. Note that (for
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // generational collectors) this means that those many words are
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // skipped in each object, irrespective of the generation in which
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // that object lives. The resultant loss of precision seems to be
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // harmless and the pain of avoiding that imprecision appears somewhat
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // higher than we are prepared to pay for such rudimentary debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // support.
a61af66fc99e Initial load
duke
parents:
diff changeset
306 void GenCollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
307 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (CheckMemoryInitialization && ZapUnusedHeapArea) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // We are asked to check a size in HeapWords,
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // but the memory is mangled in juint words.
a61af66fc99e Initial load
duke
parents:
diff changeset
311 juint* start = (juint*) (addr + skip_header_HeapWords());
a61af66fc99e Initial load
duke
parents:
diff changeset
312 juint* end = (juint*) (addr + size);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 for (juint* slot = start; slot < end; slot += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 assert(*slot == badHeapWordVal,
a61af66fc99e Initial load
duke
parents:
diff changeset
315 "Found non badHeapWordValue in pre-allocation check");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 HeapWord* GenCollectedHeap::attempt_allocation(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
322 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
323 bool first_only) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 HeapWord* res;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 if (_gens[i]->should_allocate(size, is_tlab)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 res = _gens[i]->allocate(size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if (res != NULL) return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 else if (first_only) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
333 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 HeapWord* GenCollectedHeap::mem_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
337 bool* gc_overhead_limit_was_exceeded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 return collector_policy()->mem_allocate_work(size,
3774
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 3772
diff changeset
339 false /* is_tlab */,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
340 gc_overhead_limit_was_exceeded);
a61af66fc99e Initial load
duke
parents:
diff changeset
341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 bool GenCollectedHeap::must_clear_all_soft_refs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 return _gc_cause == GCCause::_last_ditch_collection;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
1520
bb843ebc7c55 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 1387
diff changeset
348 return UseConcMarkSweepGC &&
bb843ebc7c55 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 1387
diff changeset
349 ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
bb843ebc7c55 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 1387
diff changeset
350 (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 void GenCollectedHeap::do_collection(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
354 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
355 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
356 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
357 int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 bool prepared_for_verification = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 DEBUG_ONLY(Thread* my_thread = Thread::current();)
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
363 assert(my_thread->is_VM_thread() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
364 my_thread->is_ConcurrentGC_thread(),
a61af66fc99e Initial load
duke
parents:
diff changeset
365 "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
366 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
367 "the requesting thread should have the Heap_lock");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368 guarantee(!is_gc_active(), "collection is not reentrant");
a61af66fc99e Initial load
duke
parents:
diff changeset
369 assert(max_level < n_gens(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 if (GC_locker::check_active_before_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 return; // GC is disabled (e.g. JNI GetXXXCritical operation)
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
375 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
376 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
377
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
378 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
379
10183
868d87ed63c8 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 10179
diff changeset
380 const size_t metadata_prev_used = MetaspaceAux::allocated_used_bytes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
381
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4728
diff changeset
382 print_heap_before_gc();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 FlagSetting fl(_is_gc_active, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 bool complete = full && (max_level == (n_gens()-1));
6064
9d679effd28c 7166894: Add gc cause to GC logging for all collectors
brutisso
parents: 6008
diff changeset
388 const char* gc_cause_prefix = complete ? "Full GC" : "GC";
0
a61af66fc99e Initial load
duke
parents:
diff changeset
389 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
a61af66fc99e Initial load
duke
parents:
diff changeset
390 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
6064
9d679effd28c 7166894: Add gc cause to GC logging for all collectors
brutisso
parents: 6008
diff changeset
391 TraceTime t(GCCauseString(gc_cause_prefix, gc_cause()), PrintGCDetails, false, gclog_or_tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 gc_prologue(complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
394 increment_total_collections(complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 size_t gch_prev_used = used();
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 int starting_level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Search for the oldest generation which will collect all younger
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // generations, and start collection loop there.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 for (int i = max_level; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 if (_gens[i]->full_collects_younger_generations()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 starting_level = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410 bool must_restore_marks_for_biased_locking = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 int max_level_collected = starting_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 for (int i = starting_level; i <= max_level; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 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
415 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
416 if (!complete) {
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
417 // The full_collections increment was missed above.
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
418 increment_total_full_collections();
2b4230d1e589 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 457
diff changeset
419 }
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
420 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
421 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Timer for individual generations. Last argument is false: no CR
a61af66fc99e Initial load
duke
parents:
diff changeset
423 TraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 TraceCollectorStats tcs(_gens[i]->counters());
3356
78542e2b5e35 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 2426
diff changeset
425 TraceMemoryManagerStats tmms(_gens[i]->kind(),gc_cause());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 size_t prev_used = _gens[i]->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
428 _gens[i]->stat_record()->invocations++;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 _gens[i]->stat_record()->accumulated_time.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
430
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
431 // 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
432 // 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
433 // change top of some spaces.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
434 record_gen_tops_before_GC();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
435
0
a61af66fc99e Initial load
duke
parents:
diff changeset
436 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 gclog_or_tty->print("level=%d invoke=%d size=" SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
438 i,
a61af66fc99e Initial load
duke
parents:
diff changeset
439 _gens[i]->stat_record()->invocations,
a61af66fc99e Initial load
duke
parents:
diff changeset
440 size*HeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 if (VerifyBeforeGC && i >= VerifyGCLevel &&
a61af66fc99e Initial load
duke
parents:
diff changeset
444 total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 HandleMark hm; // Discard invalid handles created during verification
a61af66fc99e Initial load
duke
parents:
diff changeset
446 if (!prepared_for_verification) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 prepared_for_verification = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
449 }
10186
b06ac540229e 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 10183
diff changeset
450 Universe::verify(" VerifyBeforeGC:");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452 COMPILER2_PRESENT(DerivedPointerTable::clear());
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (!must_restore_marks_for_biased_locking &&
a61af66fc99e Initial load
duke
parents:
diff changeset
455 _gens[i]->performs_in_place_marking()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // We perform this mark word preservation work lazily
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // because it's only at this point that we know whether we
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // absolutely have to do it; we want to avoid doing it for
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // scavenge-only collections where it's unnecessary
a61af66fc99e Initial load
duke
parents:
diff changeset
460 must_restore_marks_for_biased_locking = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 BiasedLocking::preserve_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Do collection work
a61af66fc99e Initial load
duke
parents:
diff changeset
465 {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Note on ref discovery: For what appear to be historical reasons,
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // GCH enables and disabled (by enqueing) refs discovery.
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // In the future this should be moved into the generation's
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // collect method so that ref discovery and enqueueing concerns
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // are local to a generation. The collect method could return
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // an appropriate indication in the case that notification on
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // the ref lock was needed. This will make the treatment of
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // weak refs more uniform (and indeed remove such concerns
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // from GCH). XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 HandleMark hm; // Discard invalid handles created during gc
a61af66fc99e Initial load
duke
parents:
diff changeset
477 save_marks(); // save marks for all gens
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // We want to discover references, but not process them yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // This mode is disabled in process_discovered_references if the
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // generation does some collection work, or in
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // enqueue_discovered_references if the generation returns
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // without doing any work.
a61af66fc99e Initial load
duke
parents:
diff changeset
483 ReferenceProcessor* rp = _gens[i]->ref_processor();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // If the discovery of ("weak") refs in this generation is
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // atomic wrt other collectors in this configuration, we
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // are guaranteed to have empty discovered ref lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
487 if (rp->discovery_is_atomic()) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3915
diff changeset
488 rp->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
489 rp->setup_policy(do_clear_all_soft_refs);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490 } else {
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 269
diff changeset
491 // collect() below will enable discovery as appropriate
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1170
diff changeset
493 _gens[i]->collect(full, do_clear_all_soft_refs, size, is_tlab);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
494 if (!rp->enqueuing_is_done()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 rp->enqueue_discovered_references();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 rp->set_enqueuing_is_done(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 rp->verify_no_references_recorded();
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 max_level_collected = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // Determine if allocation request was met.
a61af66fc99e Initial load
duke
parents:
diff changeset
504 if (size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
505 if (!is_tlab || _gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 if (size*HeapWordSize <= _gens[i]->unsafe_max_alloc_nogc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 _gens[i]->stat_record()->accumulated_time.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 update_gc_stats(i, full);
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 if (VerifyAfterGC && i >= VerifyGCLevel &&
a61af66fc99e Initial load
duke
parents:
diff changeset
519 total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 HandleMark hm; // Discard invalid handles created during verification
10186
b06ac540229e 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 10183
diff changeset
521 Universe::verify(" VerifyAfterGC:");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
522 }
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 gclog_or_tty->print(":");
a61af66fc99e Initial load
duke
parents:
diff changeset
526 _gens[i]->print_heap_change(prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // Update "complete" boolean wrt what actually transpired --
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // for instance, a promotion failure could have led to
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // a whole heap collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
534 complete = complete || (max_level_collected == n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
535
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
536 if (complete) { // We did a "major" collection
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
537 post_full_gc_dump(); // do any post full gc dumps
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
538 }
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
539
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
541 print_heap_change(gch_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
542
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
543 // Print metaspace info for full GC with PrintGCDetails flag.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 if (complete) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
545 MetaspaceAux::print_metaspace_change(metadata_prev_used);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 for (int j = max_level_collected; j >= 0; j -= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // Adjust generation sizes.
a61af66fc99e Initial load
duke
parents:
diff changeset
551 _gens[j]->compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (complete) {
8784
79af1312fc2c 8005602: NPG: classunloading does not happen while CMS GC with -XX:+CMSClassUnloadingEnabled is used
mgerdin
parents: 8001
diff changeset
555 // Delete metaspaces for unloaded class loaders and clean up loader_data graph
79af1312fc2c 8005602: NPG: classunloading does not happen while CMS GC with -XX:+CMSClassUnloadingEnabled is used
mgerdin
parents: 8001
diff changeset
556 ClassLoaderDataGraph::purge();
10183
868d87ed63c8 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 10179
diff changeset
557 MetaspaceAux::verify_metrics();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
558 // Resize the metaspace capacity after full collections
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
559 MetaspaceGC::compute_new_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560 update_full_collections_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Track memory usage and detect low memory after GC finishes
a61af66fc99e Initial load
duke
parents:
diff changeset
564 MemoryService::track_memory_usage();
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 gc_epilogue(complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 if (must_restore_marks_for_biased_locking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 BiasedLocking::restore_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 AdaptiveSizePolicy* sp = gen_policy()->size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
574 AdaptiveSizePolicyOutput(sp, total_collections());
a61af66fc99e Initial load
duke
parents:
diff changeset
575
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4728
diff changeset
576 print_heap_after_gc();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
577
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
578 #ifdef TRACESPINNING
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
579 ParallelTaskTerminator::print_termination_counts();
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 517
diff changeset
580 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 HeapWord* GenCollectedHeap::satisfy_failed_allocation(size_t size, bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 return collector_policy()->satisfy_failed_allocation(size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4712
diff changeset
587 void GenCollectedHeap::set_par_threads(uint t) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
588 SharedHeap::set_par_threads(t);
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1681
diff changeset
589 _gen_process_strong_tasks->set_n_threads(t);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 void GenCollectedHeap::
a61af66fc99e Initial load
duke
parents:
diff changeset
593 gen_process_strong_roots(int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
594 bool younger_gens_as_roots,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
595 bool activate_scope,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
596 bool is_scavenging,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
597 SharedHeap::ScanningOption so,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
598 OopsInGenClosure* not_older_gens,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
599 bool do_code_roots,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
600 OopsInGenClosure* older_gens,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
601 KlassClosure* klass_closure) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // General strong roots.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
603
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
604 if (!do_code_roots) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
605 SharedHeap::process_strong_roots(activate_scope, is_scavenging, so,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
606 not_older_gens, NULL, klass_closure);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
607 } else {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
608 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
609 CodeBlobToOopClosure code_roots(not_older_gens, /*do_marking=*/ do_code_marking);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
610 SharedHeap::process_strong_roots(activate_scope, is_scavenging, so,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
611 not_older_gens, &code_roots, klass_closure);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 881
diff changeset
612 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 if (younger_gens_as_roots) {
a61af66fc99e Initial load
duke
parents:
diff changeset
615 if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
616 for (int i = 0; i < level; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
617 not_older_gens->set_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 _gens[i]->oop_iterate(not_older_gens);
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620 not_older_gens->reset_generation();
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // When collection is parallel, all threads get to cooperate to do
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // older-gen scanning.
a61af66fc99e Initial load
duke
parents:
diff changeset
625 for (int i = level+1; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 older_gens->set_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
627 rem_set()->younger_refs_iterate(_gens[i], older_gens);
a61af66fc99e Initial load
duke
parents:
diff changeset
628 older_gens->reset_generation();
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 _gen_process_strong_tasks->all_tasks_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure,
10179
a08c80e9e1e5 8012687: Remove unused is_root checks and closures
stefank
parents: 9076
diff changeset
635 CodeBlobClosure* code_roots) {
a08c80e9e1e5 8012687: Remove unused is_root checks and closures
stefank
parents: 9076
diff changeset
636 SharedHeap::process_weak_roots(root_closure, code_roots);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // "Local" "weak" refs
a61af66fc99e Initial load
duke
parents:
diff changeset
638 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
639 _gens[i]->ref_processor()->weak_oops_do(root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 #define GCH_SINCE_SAVE_MARKS_ITERATE_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
644 void GenCollectedHeap:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
645 oop_since_save_marks_iterate(int level, \
a61af66fc99e Initial load
duke
parents:
diff changeset
646 OopClosureType* cur, \
a61af66fc99e Initial load
duke
parents:
diff changeset
647 OopClosureType* older) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
648 _gens[level]->oop_since_save_marks_iterate##nv_suffix(cur); \
a61af66fc99e Initial load
duke
parents:
diff changeset
649 for (int i = level+1; i < n_gens(); i++) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
650 _gens[i]->oop_since_save_marks_iterate##nv_suffix(older); \
a61af66fc99e Initial load
duke
parents:
diff changeset
651 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 #undef GCH_SINCE_SAVE_MARKS_ITERATE_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 bool GenCollectedHeap::no_allocs_since_save_marks(int level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
659 for (int i = level; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 if (!_gens[i]->no_allocs_since_save_marks()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
662 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 bool GenCollectedHeap::supports_inline_contig_alloc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 return _gens[0]->supports_inline_contig_alloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 HeapWord** GenCollectedHeap::top_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 return _gens[0]->top_addr();
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::end_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 return _gens[0]->end_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 size_t GenCollectedHeap::unsafe_max_alloc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 return _gens[0]->unsafe_max_alloc_nogc();
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // public collection interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 void GenCollectedHeap::collect(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 if (should_do_concurrent_full_gc(cause)) {
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
685 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // mostly concurrent full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
687 collect_mostly_concurrent(cause);
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
688 #else // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
689 ShouldNotReachHere();
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
690 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
691 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
692 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
693 if (cause == GCCause::_scavenge_alot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // minor collection only
a61af66fc99e Initial load
duke
parents:
diff changeset
695 collect(cause, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // Stop-the-world full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
698 collect(cause, n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // Stop-the-world full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
702 collect(cause, n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
703 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 void GenCollectedHeap::collect(GCCause::Cause cause, int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // The caller doesn't have the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
709 assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
710 MutexLocker ml(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
711 collect_locked(cause, max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 }
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 void GenCollectedHeap::collect_locked(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // The caller has the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
716 assert(Heap_lock->owned_by_self(), "this thread should own the Heap_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
717 collect_locked(cause, n_gens() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
718 }
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // this is the private collection interface
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // The Heap_lock is expected to be held on entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 void GenCollectedHeap::collect_locked(GCCause::Cause cause, int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // Read the GC count while holding the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
725 unsigned int gc_count_before = total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
726 unsigned int full_gc_count_before = total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
727 {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 MutexUnlocker mu(Heap_lock); // give up heap lock, execute gets it back
a61af66fc99e Initial load
duke
parents:
diff changeset
729 VM_GenCollectFull op(gc_count_before, full_gc_count_before,
a61af66fc99e Initial load
duke
parents:
diff changeset
730 cause, max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
731 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
734
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
735 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
736 bool GenCollectedHeap::create_cms_collector() {
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 assert(((_gens[1]->kind() == Generation::ConcurrentMarkSweep) ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
739 (_gens[1]->kind() == Generation::ASConcurrentMarkSweep)),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
740 "Unexpected generation kinds");
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // Skip two header words in the block content verification
a61af66fc99e Initial load
duke
parents:
diff changeset
742 NOT_PRODUCT(_skip_header_HeapWords = CMSCollector::skip_header_HeapWords();)
a61af66fc99e Initial load
duke
parents:
diff changeset
743 CMSCollector* collector = new CMSCollector(
a61af66fc99e Initial load
duke
parents:
diff changeset
744 (ConcurrentMarkSweepGeneration*)_gens[1],
a61af66fc99e Initial load
duke
parents:
diff changeset
745 _rem_set->as_CardTableRS(),
a61af66fc99e Initial load
duke
parents:
diff changeset
746 (ConcurrentMarkSweepPolicy*) collector_policy());
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 if (collector == NULL || !collector->completed_initialization()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
749 if (collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 delete collector; // Be nice in embedded situation
a61af66fc99e Initial load
duke
parents:
diff changeset
751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
752 vm_shutdown_during_initialization("Could not create CMS collector");
a61af66fc99e Initial load
duke
parents:
diff changeset
753 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755 return true; // success
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 void GenCollectedHeap::collect_mostly_concurrent(GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 assert(!Heap_lock->owned_by_self(), "Should not own Heap_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 MutexLocker ml(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // Read the GC counts while holding the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
763 unsigned int full_gc_count_before = total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
764 unsigned int gc_count_before = total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
765 {
a61af66fc99e Initial load
duke
parents:
diff changeset
766 MutexUnlocker mu(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 VM_GenCollectFullConcurrent op(gc_count_before, full_gc_count_before, cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
771 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
772
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
773 void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
774 do_full_collection(clear_all_soft_refs, _n_gens - 1);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
775 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
778 int max_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
779 int local_max_level;
1994
6cd6d394f280 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 1972
diff changeset
780 if (!incremental_collection_will_fail(false /* don't consult_young */) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
781 gc_cause() == GCCause::_gc_locker) {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 local_max_level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 local_max_level = max_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 do_collection(true /* full */,
a61af66fc99e Initial load
duke
parents:
diff changeset
788 clear_all_soft_refs /* clear_all_soft_refs */,
a61af66fc99e Initial load
duke
parents:
diff changeset
789 0 /* size */,
a61af66fc99e Initial load
duke
parents:
diff changeset
790 false /* is_tlab */,
a61af66fc99e Initial load
duke
parents:
diff changeset
791 local_max_level /* max_level */);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // Hack XXX FIX ME !!!
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // A scavenge may not have been attempted, or may have
a61af66fc99e Initial load
duke
parents:
diff changeset
794 // been attempted and failed, because the old gen was too full
a61af66fc99e Initial load
duke
parents:
diff changeset
795 if (local_max_level == 0 && gc_cause() == GCCause::_gc_locker &&
1994
6cd6d394f280 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 1972
diff changeset
796 incremental_collection_will_fail(false /* don't consult_young */)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
797 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
798 gclog_or_tty->print_cr("GC locker: Trying a full collection "
a61af66fc99e Initial load
duke
parents:
diff changeset
799 "because scavenge failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // This time allow the old gen to be collected as well
a61af66fc99e Initial load
duke
parents:
diff changeset
802 do_collection(true /* full */,
a61af66fc99e Initial load
duke
parents:
diff changeset
803 clear_all_soft_refs /* clear_all_soft_refs */,
a61af66fc99e Initial load
duke
parents:
diff changeset
804 0 /* size */,
a61af66fc99e Initial load
duke
parents:
diff changeset
805 false /* is_tlab */,
a61af66fc99e Initial load
duke
parents:
diff changeset
806 n_gens() - 1 /* max_level */);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
810 bool GenCollectedHeap::is_in_young(oop p) {
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
811 bool result = ((HeapWord*)p) < _gens[_n_gens - 1]->reserved().start();
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
812 assert(result == _gens[0]->is_in_reserved(p),
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
813 err_msg("incorrect test - result=%d, p=" PTR_FORMAT, result, (void*)p));
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
814 return result;
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
815 }
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
816
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4073
diff changeset
817 // Returns "TRUE" iff "p" points into the committed areas of the heap.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
818 bool GenCollectedHeap::is_in(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 #ifndef ASSERT
9071
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
820 guarantee(VerifyBeforeGC ||
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
821 VerifyDuringGC ||
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
822 VerifyBeforeExit ||
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
823 VerifyDuringStartup ||
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
824 PrintAssembly ||
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
825 tty->count() != 0 || // already printing
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8784
diff changeset
826 VerifyAfterGC ||
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1626
diff changeset
827 VMError::fatal_error_in_progress(), "too expensive");
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1626
diff changeset
828
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // This might be sped up with a cache of the last generation that
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // answered yes.
a61af66fc99e Initial load
duke
parents:
diff changeset
832 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
833 if (_gens[i]->is_in(p)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
836 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
839 #ifdef ASSERT
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
840 // Don't implement this by using is_in_young(). This method is used
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
841 // in some cases to check that is_in_young() is correct.
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
842 bool GenCollectedHeap::is_in_partial_collection(const void* p) {
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
843 assert(is_in_reserved(p) || p == NULL,
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
844 "Does not work if address is non-null and outside of the heap");
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
845 return p < _gens[_n_gens - 2]->reserved().end() && p != NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
846 }
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
847 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
849 void GenCollectedHeap::oop_iterate(ExtendedOopClosure* cl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
850 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 _gens[i]->oop_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
855 void GenCollectedHeap::oop_iterate(MemRegion mr, ExtendedOopClosure* cl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 _gens[i]->oop_iterate(mr, cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 void GenCollectedHeap::object_iterate(ObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
863 _gens[i]->object_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
866
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
867 void GenCollectedHeap::safe_object_iterate(ObjectClosure* cl) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
868 for (int i = 0; i < _n_gens; i++) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
869 _gens[i]->safe_object_iterate(cl);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
870 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
871 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 457
diff changeset
872
0
a61af66fc99e Initial load
duke
parents:
diff changeset
873 void GenCollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
875 _gens[i]->object_iterate_since_last_GC(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 Space* GenCollectedHeap::space_containing(const void* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 Space* res = _gens[i]->space_containing(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 if (res != NULL) return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
885 assert(false, "Could not find containing space");
a61af66fc99e Initial load
duke
parents:
diff changeset
886 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 HeapWord* GenCollectedHeap::block_start(const void* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
891 assert(is_in_reserved(addr), "block_start of address outside of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
892 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 if (_gens[i]->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
894 assert(_gens[i]->is_in(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
895 "addr should be in allocated part of generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
896 return _gens[i]->block_start(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 assert(false, "Some generation should contain the address");
a61af66fc99e Initial load
duke
parents:
diff changeset
900 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 size_t GenCollectedHeap::block_size(const HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 assert(is_in_reserved(addr), "block_size of address outside of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
905 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 if (_gens[i]->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
907 assert(_gens[i]->is_in(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
908 "addr should be in allocated part of generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
909 return _gens[i]->block_size(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912 assert(false, "Some generation should contain the address");
a61af66fc99e Initial load
duke
parents:
diff changeset
913 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 bool GenCollectedHeap::block_is_obj(const HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
917 assert(is_in_reserved(addr), "block_is_obj of address outside of heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
918 assert(block_start(addr) == addr, "addr must be a block start");
a61af66fc99e Initial load
duke
parents:
diff changeset
919 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 if (_gens[i]->is_in_reserved(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 return _gens[i]->block_is_obj(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924 assert(false, "Some generation should contain the address");
a61af66fc99e Initial load
duke
parents:
diff changeset
925 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928 bool GenCollectedHeap::supports_tlab_allocation() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
929 for (int i = 0; i < _n_gens; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (_gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 size_t GenCollectedHeap::tlab_capacity(Thread* thr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
938 size_t result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
939 for (int i = 0; i < _n_gens; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
940 if (_gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 result += _gens[i]->tlab_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
944 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 size_t GenCollectedHeap::unsafe_max_tlab_alloc(Thread* thr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 size_t result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
949 for (int i = 0; i < _n_gens; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
950 if (_gens[i]->supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 result += _gens[i]->unsafe_max_tlab_alloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
954 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957 HeapWord* GenCollectedHeap::allocate_new_tlab(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
958 bool gc_overhead_limit_was_exceeded;
3774
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 3772
diff changeset
959 return collector_policy()->mem_allocate_work(size /* size */,
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 3772
diff changeset
960 true /* is_tlab */,
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 3772
diff changeset
961 &gc_overhead_limit_was_exceeded);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 // Requires "*prev_ptr" to be non-NULL. Deletes and a block of minimal size
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // from the list headed by "*prev_ptr".
a61af66fc99e Initial load
duke
parents:
diff changeset
966 static ScratchBlock *removeSmallestScratch(ScratchBlock **prev_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 bool first = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
968 size_t min_size = 0; // "first" makes this conceptually infinite.
a61af66fc99e Initial load
duke
parents:
diff changeset
969 ScratchBlock **smallest_ptr, *smallest;
a61af66fc99e Initial load
duke
parents:
diff changeset
970 ScratchBlock *cur = *prev_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
971 while (cur) {
a61af66fc99e Initial load
duke
parents:
diff changeset
972 assert(*prev_ptr == cur, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
973 if (first || cur->num_words < min_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 smallest_ptr = prev_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
975 smallest = cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
976 min_size = smallest->num_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
977 first = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979 prev_ptr = &cur->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
980 cur = cur->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
982 smallest = *smallest_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
983 *smallest_ptr = smallest->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
984 return smallest;
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // Sort the scratch block list headed by res into decreasing size order,
a61af66fc99e Initial load
duke
parents:
diff changeset
988 // and set "res" to the result.
a61af66fc99e Initial load
duke
parents:
diff changeset
989 static void sort_scratch_list(ScratchBlock*& list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
990 ScratchBlock* sorted = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
991 ScratchBlock* unsorted = list;
a61af66fc99e Initial load
duke
parents:
diff changeset
992 while (unsorted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 ScratchBlock *smallest = removeSmallestScratch(&unsorted);
a61af66fc99e Initial load
duke
parents:
diff changeset
994 smallest->next = sorted;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 sorted = smallest;
a61af66fc99e Initial load
duke
parents:
diff changeset
996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
997 list = sorted;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
999
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 ScratchBlock* GenCollectedHeap::gather_scratch(Generation* requestor,
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 size_t max_alloc_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 ScratchBlock* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 _gens[i]->contribute_scratch(res, requestor, max_alloc_words);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 sort_scratch_list(res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1010 void GenCollectedHeap::release_scratch() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1011 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
1012 _gens[i]->reset_scratch();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1013 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1014 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1015
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 class GenPrepareForVerifyClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 gen->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 void GenCollectedHeap::prepare_for_verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 ensure_parsability(false); // no need to retire TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 GenPrepareForVerifyClosure blk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 generation_iterate(&blk, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 void GenCollectedHeap::generation_iterate(GenClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 bool old_to_young) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 if (old_to_young) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 for (int i = _n_gens-1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 cl->do_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 cl->do_generation(_gens[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 void GenCollectedHeap::space_iterate(SpaceClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 _gens[i]->space_iterate(cl, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 bool GenCollectedHeap::is_maximal_no_gc() const {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
1049 for (int i = 0; i < _n_gens; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 if (!_gens[i]->is_maximal_no_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1056
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 void GenCollectedHeap::save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 _gens[i]->save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 void GenCollectedHeap::compute_new_generation_sizes(int collectedGen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 for (int i = 0; i <= collectedGen; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 _gens[i]->compute_new_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 GenCollectedHeap* GenCollectedHeap::heap() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 assert(_gch != NULL, "Uninitialized access to GenCollectedHeap::heap()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 assert(_gch->kind() == CollectedHeap::GenCollectedHeap, "not a generational heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 return _gch;
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 void GenCollectedHeap::prepare_for_compaction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 Generation* scanning_gen = _gens[_n_gens-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Start by compacting into same gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 CompactPoint cp(scanning_gen, NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 while (scanning_gen != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 scanning_gen->prepare_for_compaction(&cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 scanning_gen = prev_gen(scanning_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 GCStats* GenCollectedHeap::gc_stats(int level) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 return _gens[level]->gc_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4872
diff changeset
1090 void GenCollectedHeap::verify(bool silent, VerifyOption option /* ignored */) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 for (int i = _n_gens-1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 Generation* g = _gens[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 if (!silent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 gclog_or_tty->print(g->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 gclog_or_tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4872
diff changeset
1097 g->verify();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 if (!silent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 gclog_or_tty->print("remset ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 rem_set()->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 void GenCollectedHeap::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 _gens[i]->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
1109 MetaspaceAux::print_on(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 void GenCollectedHeap::gc_threads_do(ThreadClosure* tc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 if (workers() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 workers()->threads_do(tc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
1116 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 ConcurrentMarkSweepThread::threads_do(tc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
1120 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 void GenCollectedHeap::print_gc_threads_on(outputStream* st) const {
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
1124 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 if (UseParNewGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 workers()->print_worker_threads_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 ConcurrentMarkSweepThread::print_all_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6865
diff changeset
1131 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1133
9076
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1134 void GenCollectedHeap::print_on_error(outputStream* st) const {
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1135 this->CollectedHeap::print_on_error(st);
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1136
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1137 #if INCLUDE_ALL_GCS
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1138 if (UseConcMarkSweepGC) {
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1139 st->cr();
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1140 CMSCollector::print_on_error(st);
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1141 }
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1142 #endif // INCLUDE_ALL_GCS
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1143 }
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9071
diff changeset
1144
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 void GenCollectedHeap::print_tracing_info() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 if (TraceGen0Time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 get_gen(0)->print_summary_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 if (TraceGen1Time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 get_gen(1)->print_summary_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 void GenCollectedHeap::print_heap_change(size_t prev_used) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 gclog_or_tty->print(" " SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 "->" SIZE_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 "(" SIZE_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 prev_used, used(), capacity());
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 gclog_or_tty->print(" " SIZE_FORMAT "K"
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 "->" SIZE_FORMAT "K"
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 "(" SIZE_FORMAT "K)",
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 prev_used / K, used() / K, capacity() / K);
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 class GenGCPrologueClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 bool _full;
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 gen->gc_prologue(_full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 GenGCPrologueClosure(bool full) : _full(full) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 void GenCollectedHeap::gc_prologue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
1180
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 always_do_update_barrier = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // Fill TLAB's and such
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 CollectedHeap::accumulate_statistics_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 ensure_parsability(true); // retire TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // Call allocation profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 AllocationProfiler::iterate_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // Walk generations
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 GenGCPrologueClosure blk(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 generation_iterate(&blk, false); // not old-to-young.
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 class GenGCEpilogueClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 bool _full;
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 gen->gc_epilogue(_full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 GenGCEpilogueClosure(bool full) : _full(full) {};
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::gc_epilogue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 assert(DerivedPointerTable::is_empty(), "derived pointer present");
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 size_t actual_gap = pointer_delta((HeapWord*) (max_uintx-3), *(end_addr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 guarantee(actual_gap > (size_t)FastAllocateSizeLimit, "inline allocation wraps");
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 #endif /* COMPILER2 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1209
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 resize_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 GenGCEpilogueClosure blk(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 generation_iterate(&blk, false); // not old-to-young.
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
3799
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3774
diff changeset
1215 if (!CleanChunkPoolAsync) {
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3774
diff changeset
1216 Chunk::clean_chunk_pool();
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3774
diff changeset
1217 }
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3774
diff changeset
1218
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
1219 MetaspaceCounters::update_performance_counters();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6109
diff changeset
1220
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 always_do_update_barrier = UseConcMarkSweepGC;
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1224 #ifndef PRODUCT
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1225 class GenGCSaveTopsBeforeGCClosure: public GenCollectedHeap::GenClosure {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1226 private:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1227 public:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1228 void do_generation(Generation* gen) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1229 gen->record_spaces_top();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1230 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1231 };
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1232
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1233 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
1234 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1235 GenGCSaveTopsBeforeGCClosure blk;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1236 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
1237 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1238 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1239 #endif // not PRODUCT
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1240
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 class GenEnsureParsabilityClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 gen->ensure_parsability();
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 void GenCollectedHeap::ensure_parsability(bool retire_tlabs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 CollectedHeap::ensure_parsability(retire_tlabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 GenEnsureParsabilityClosure ep_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 generation_iterate(&ep_cl, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1253
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 oop GenCollectedHeap::handle_failed_promotion(Generation* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 oop obj,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1256 size_t obj_size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 HeapWord* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 // First give each higher generation a chance to allocate the promoted object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 Generation* allocator = next_gen(gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 if (allocator != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 result = allocator->allocate(obj_size, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 } while (result == NULL && (allocator = next_gen(allocator)) != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 if (result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // Then give gen and higher generations a chance to expand and allocate the
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 // object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 result = gen->expand_and_allocate(obj_size, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 } while (result == NULL && (gen = next_gen(gen)) != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1275
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 if (result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 Copy::aligned_disjoint_words((HeapWord*)obj, result, obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 return oop(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 class GenTimeOfLastGCClosure: public GenCollectedHeap::GenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 jlong _time; // in ms
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 jlong _now; // in ms
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 GenTimeOfLastGCClosure(jlong now) : _time(now), _now(now) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 jlong time() { return _time; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 void do_generation(Generation* gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 _time = MIN2(_time, gen->time_of_last_gc(_now));
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 jlong GenCollectedHeap::millis_since_last_gc() {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1297 // We need a monotonically non-deccreasing time in ms but
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1298 // os::javaTimeMillis() does not guarantee monotonicity.
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1299 jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 GenTimeOfLastGCClosure tolgc_cl(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 // iterate over generations getting the oldest
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // time that a generation was collected
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 generation_iterate(&tolgc_cl, false);
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1304
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1305 // javaTimeNanos() is guaranteed to be monotonically non-decreasing
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1306 // provided the underlying platform provides such a time source
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1307 // (and it is bug free). So we still have to guard against getting
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1308 // back a time later than 'now'.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 jlong retVal = now - tolgc_cl.time();
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 if (retVal < 0) {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
1311 NOT_PRODUCT(warning("time warp: "INT64_FORMAT, retVal);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 return retVal;
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 }