annotate src/share/vm/memory/genCollectedHeap.cpp @ 20543:e7d0505c8a30

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