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

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents c18cbe5936b8
children 8b10f48633dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
diff changeset
2 * Copyright (c) 2000, 2009, 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: 989
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
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: 989
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_sharedHeap.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 SharedHeap* SharedHeap::_sh;
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // The set of potentially parallel tasks in strong root scanning.
a61af66fc99e Initial load
duke
parents:
diff changeset
31 enum SH_process_strong_roots_tasks {
a61af66fc99e Initial load
duke
parents:
diff changeset
32 SH_PS_Universe_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
33 SH_PS_JNIHandles_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
34 SH_PS_ObjectSynchronizer_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
35 SH_PS_FlatProfiler_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 SH_PS_Management_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
37 SH_PS_SystemDictionary_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 SH_PS_jvmti_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 SH_PS_vmSymbols_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 SH_PS_SymbolTable_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 SH_PS_StringTable_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 SH_PS_CodeCache_oops_do,
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Leave this one last.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 SH_PS_NumElements
a61af66fc99e Initial load
duke
parents:
diff changeset
45 };
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 SharedHeap::SharedHeap(CollectorPolicy* policy_) :
a61af66fc99e Initial load
duke
parents:
diff changeset
48 CollectedHeap(),
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _collector_policy(policy_),
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _perm_gen(NULL), _rem_set(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _strong_roots_parity(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _process_strong_tasks(new SubTasksDone(SH_PS_NumElements)),
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _workers(NULL), _n_par_threads(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
54 {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 vm_exit_during_initialization("Failed necessary allocation.");
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _sh = this; // ch is static, should be set only once.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 if ((UseParNewGC ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
60 (UseConcMarkSweepGC && CMSParallelRemarkEnabled) ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
61 UseG1GC) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ParallelGCThreads > 0) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
63 _workers = new WorkGang("Parallel GC Threads", ParallelGCThreads,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
64 /* are_GC_task_threads */true,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
65 /* are_ConcurrentGC_threads */false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 if (_workers == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 vm_exit_during_initialization("Failed necessary allocation.");
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 }
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
72 bool SharedHeap::heap_lock_held_for_gc() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
73 Thread* t = Thread::current();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
74 return Heap_lock->owned_by_self()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
75 || ( (t->is_GC_task_thread() || t->is_VM_thread())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
76 && _thread_holds_heap_lock_for_gc);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
77 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 void SharedHeap::set_par_threads(int t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _n_par_threads = t;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _process_strong_tasks->set_par_threads(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 class AssertIsPermClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
86 virtual void do_oop(oop* p) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 assert((*p) == NULL || (*p)->is_perm(), "Referent should be perm.");
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
89 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90 };
a61af66fc99e Initial load
duke
parents:
diff changeset
91 static AssertIsPermClosure assert_is_perm_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 void SharedHeap::change_strong_roots_parity() {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Also set the new collection parity.
a61af66fc99e Initial load
duke
parents:
diff changeset
95 assert(_strong_roots_parity >= 0 && _strong_roots_parity <= 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
96 "Not in range.");
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _strong_roots_parity++;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (_strong_roots_parity == 3) _strong_roots_parity = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 assert(_strong_roots_parity >= 1 && _strong_roots_parity <= 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 "Not in range.");
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
103 SharedHeap::StrongRootsScope::StrongRootsScope(SharedHeap* outer, bool activate)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
104 : MarkScope(activate)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
105 {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
106 if (_active) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
107 outer->change_strong_roots_parity();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
108 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
109 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
110
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
111 SharedHeap::StrongRootsScope::~StrongRootsScope() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
112 // nothing particular
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
113 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
114
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
115 void SharedHeap::process_strong_roots(bool activate_scope,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
116 bool collecting_perm_gen,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117 ScanningOption so,
a61af66fc99e Initial load
duke
parents:
diff changeset
118 OopClosure* roots,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
119 CodeBlobClosure* code_roots,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 OopsInGenClosure* perm_blk) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
121 StrongRootsScope srs(this, activate_scope);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // General strong roots.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
123 assert(_strong_roots_parity != 0, "must have called prologue code");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (!_process_strong_tasks->is_task_claimed(SH_PS_Universe_oops_do)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 Universe::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 ReferenceProcessor::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Consider perm-gen discovered lists to be strong.
a61af66fc99e Initial load
duke
parents:
diff changeset
128 perm_gen()->ref_processor()->weak_oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Global (strong) JNI handles
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if (!_process_strong_tasks->is_task_claimed(SH_PS_JNIHandles_oops_do))
a61af66fc99e Initial load
duke
parents:
diff changeset
132 JNIHandles::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // All threads execute this; the individual threads are task groups.
a61af66fc99e Initial load
duke
parents:
diff changeset
134 if (ParallelGCThreads > 0) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
135 Threads::possibly_parallel_oops_do(roots, code_roots);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 } else {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
137 Threads::oops_do(roots, code_roots);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if (!_process_strong_tasks-> is_task_claimed(SH_PS_ObjectSynchronizer_oops_do))
a61af66fc99e Initial load
duke
parents:
diff changeset
140 ObjectSynchronizer::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 if (!_process_strong_tasks->is_task_claimed(SH_PS_FlatProfiler_oops_do))
a61af66fc99e Initial load
duke
parents:
diff changeset
142 FlatProfiler::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (!_process_strong_tasks->is_task_claimed(SH_PS_Management_oops_do))
a61af66fc99e Initial load
duke
parents:
diff changeset
144 Management::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (!_process_strong_tasks->is_task_claimed(SH_PS_jvmti_oops_do))
a61af66fc99e Initial load
duke
parents:
diff changeset
146 JvmtiExport::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (!_process_strong_tasks->is_task_claimed(SH_PS_SystemDictionary_oops_do)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 if (so & SO_AllClasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 SystemDictionary::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
152 if (so & SO_SystemClasses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 SystemDictionary::always_strong_oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 if (!_process_strong_tasks->is_task_claimed(SH_PS_SymbolTable_oops_do)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 if (so & SO_Symbols) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 SymbolTable::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Verify if the symbol table contents are in the perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
162 NOT_PRODUCT(SymbolTable::oops_do(&assert_is_perm_closure));
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (!_process_strong_tasks->is_task_claimed(SH_PS_StringTable_oops_do)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 if (so & SO_Strings) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 StringTable::oops_do(roots);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Verify if the string table contents are in the perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
170 NOT_PRODUCT(StringTable::oops_do(&assert_is_perm_closure));
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (!_process_strong_tasks->is_task_claimed(SH_PS_CodeCache_oops_do)) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
174 if (so & SO_CodeCache) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
175 // (Currently, CMSCollector uses this to do intermediate-strength collections.)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
176 assert(collecting_perm_gen, "scanning all of code cache");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
177 assert(code_roots != NULL, "must supply closure for code cache");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
178 if (code_roots != NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
179 CodeCache::blobs_do(code_roots);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
180 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
181 } else if (so & (SO_SystemClasses|SO_AllClasses)) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
182 if (!collecting_perm_gen) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
183 // If we are collecting from class statics, but we are not going to
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
184 // visit all of the CodeCache, collect from the non-perm roots if any.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
185 // This makes the code cache function temporarily as a source of strong
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
186 // roots for oops, until the next major collection.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
187 //
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
188 // If collecting_perm_gen is true, we require that this phase will call
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
189 // CodeCache::do_unloading. This will kill off nmethods with expired
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
190 // weak references, such as stale invokedynamic targets.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
191 CodeCache::scavenge_root_nmethods_do(code_roots);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
192 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
193 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Verify if the code cache contents are in the perm gen
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
195 NOT_PRODUCT(CodeBlobToOopClosure assert_code_is_perm(&assert_is_perm_closure, /*do_marking=*/ false));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
196 NOT_PRODUCT(CodeCache::asserted_non_scavengable_nmethods_do(&assert_code_is_perm));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Roots that should point only into permanent generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 OopClosure* blk = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 if (collecting_perm_gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 blk = roots;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 debug_only(blk = &assert_is_perm_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (blk != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 if (!_process_strong_tasks->is_task_claimed(SH_PS_vmSymbols_oops_do))
a61af66fc99e Initial load
duke
parents:
diff changeset
209 vmSymbols::oops_do(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (!collecting_perm_gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // All threads perform this; coordination is handled internally.
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 rem_set()->younger_refs_iterate(perm_gen(), perm_blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218 _process_strong_tasks->all_tasks_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 class AlwaysTrueClosure: public BoolObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
223 void do_object(oop p) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 bool do_object_b(oop p) { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 };
a61af66fc99e Initial load
duke
parents:
diff changeset
226 static AlwaysTrueClosure always_true;
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 class SkipAdjustingSharedStrings: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 OopClosure* _clo;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
231 SkipAdjustingSharedStrings(OopClosure* clo) : _clo(clo) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
232
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
233 virtual void do_oop(oop* p) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 oop o = (*p);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 if (!o->is_shared_readwrite()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 _clo->do_oop(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
239 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 };
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Unmarked shared Strings in the StringTable (which got there due to
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // being in the constant pools of as-yet unloaded shared classes) were
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // not marked and therefore did not have their mark words preserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // These entries are also deliberately not purged from the string
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // table during unloading of unmarked strings. If an identity hash
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // code was computed for any of these objects, it will not have been
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // cleared to zero during the forwarding process or by the
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // RecursiveAdjustSharedObjectClosure, and will be confused by the
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // adjusting process as a forwarding pointer. We need to skip
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // forwarding StringTable entries which contain unmarked shared
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Strings. Actually, since shared strings won't be moving, we can
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // just skip adjusting any shared entries in the string table.
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 void SharedHeap::process_weak_roots(OopClosure* root_closure,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
256 CodeBlobClosure* code_roots,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 OopClosure* non_root_closure) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Global (weak) JNI handles
a61af66fc99e Initial load
duke
parents:
diff changeset
259 JNIHandles::weak_oops_do(&always_true, root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
260
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
261 CodeCache::blobs_do(code_roots);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 SymbolTable::oops_do(root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (UseSharedSpaces && !DumpSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 SkipAdjustingSharedStrings skip_closure(root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 StringTable::oops_do(&skip_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 StringTable::oops_do(root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 void SharedHeap::set_barrier_set(BarrierSet* bs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 _barrier_set = bs;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Cached barrier set for fast access in oops
a61af66fc99e Initial load
duke
parents:
diff changeset
274 oopDesc::set_bs(bs);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void SharedHeap::post_initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 ref_processing_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 void SharedHeap::ref_processing_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 perm_gen()->ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Some utilities.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
286 void SharedHeap::print_size_transition(outputStream* out,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
287 size_t bytes_before,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
288 size_t bytes_after,
a61af66fc99e Initial load
duke
parents:
diff changeset
289 size_t capacity) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
290 out->print(" %d%s->%d%s(%d%s)",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
291 byte_size_in_proper_unit(bytes_before),
a61af66fc99e Initial load
duke
parents:
diff changeset
292 proper_unit_for_byte_size(bytes_before),
a61af66fc99e Initial load
duke
parents:
diff changeset
293 byte_size_in_proper_unit(bytes_after),
a61af66fc99e Initial load
duke
parents:
diff changeset
294 proper_unit_for_byte_size(bytes_after),
a61af66fc99e Initial load
duke
parents:
diff changeset
295 byte_size_in_proper_unit(capacity),
a61af66fc99e Initial load
duke
parents:
diff changeset
296 proper_unit_for_byte_size(capacity));
a61af66fc99e Initial load
duke
parents:
diff changeset
297 }