Mercurial > hg > graal-compiler
annotate src/share/vm/memory/universe.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 | e9ff18c4ace7 |
children | 9eecf81a02fb 0ac62b4d6507 |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
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:
1507
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 # include "incls/_precompiled.incl" | |
26 # include "incls/_universe.cpp.incl" | |
27 | |
28 // Known objects | |
29 klassOop Universe::_boolArrayKlassObj = NULL; | |
30 klassOop Universe::_byteArrayKlassObj = NULL; | |
31 klassOop Universe::_charArrayKlassObj = NULL; | |
32 klassOop Universe::_intArrayKlassObj = NULL; | |
33 klassOop Universe::_shortArrayKlassObj = NULL; | |
34 klassOop Universe::_longArrayKlassObj = NULL; | |
35 klassOop Universe::_singleArrayKlassObj = NULL; | |
36 klassOop Universe::_doubleArrayKlassObj = NULL; | |
37 klassOop Universe::_typeArrayKlassObjs[T_VOID+1] = { NULL /*, NULL...*/ }; | |
38 klassOop Universe::_objectArrayKlassObj = NULL; | |
39 klassOop Universe::_symbolKlassObj = NULL; | |
40 klassOop Universe::_methodKlassObj = NULL; | |
41 klassOop Universe::_constMethodKlassObj = NULL; | |
42 klassOop Universe::_methodDataKlassObj = NULL; | |
43 klassOop Universe::_klassKlassObj = NULL; | |
44 klassOop Universe::_arrayKlassKlassObj = NULL; | |
45 klassOop Universe::_objArrayKlassKlassObj = NULL; | |
46 klassOop Universe::_typeArrayKlassKlassObj = NULL; | |
47 klassOop Universe::_instanceKlassKlassObj = NULL; | |
48 klassOop Universe::_constantPoolKlassObj = NULL; | |
49 klassOop Universe::_constantPoolCacheKlassObj = NULL; | |
50 klassOop Universe::_compiledICHolderKlassObj = NULL; | |
51 klassOop Universe::_systemObjArrayKlassObj = NULL; | |
481
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
52 oop Universe::_int_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
53 oop Universe::_float_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
54 oop Universe::_double_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
55 oop Universe::_byte_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
56 oop Universe::_bool_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
57 oop Universe::_char_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
58 oop Universe::_long_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
59 oop Universe::_short_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
60 oop Universe::_void_mirror = NULL; |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
61 oop Universe::_mirrors[T_VOID+1] = { NULL /*, NULL...*/ }; |
0 | 62 oop Universe::_main_thread_group = NULL; |
63 oop Universe::_system_thread_group = NULL; | |
64 typeArrayOop Universe::_the_empty_byte_array = NULL; | |
65 typeArrayOop Universe::_the_empty_short_array = NULL; | |
66 typeArrayOop Universe::_the_empty_int_array = NULL; | |
67 objArrayOop Universe::_the_empty_system_obj_array = NULL; | |
68 objArrayOop Universe::_the_empty_class_klass_array = NULL; | |
69 objArrayOop Universe::_the_array_interfaces_array = NULL; | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
70 oop Universe::_the_null_string = NULL; |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
71 oop Universe::_the_min_jint_string = NULL; |
0 | 72 LatestMethodOopCache* Universe::_finalizer_register_cache = NULL; |
73 LatestMethodOopCache* Universe::_loader_addClass_cache = NULL; | |
74 ActiveMethodOopsCache* Universe::_reflect_invoke_cache = NULL; | |
75 oop Universe::_out_of_memory_error_java_heap = NULL; | |
76 oop Universe::_out_of_memory_error_perm_gen = NULL; | |
77 oop Universe::_out_of_memory_error_array_size = NULL; | |
78 oop Universe::_out_of_memory_error_gc_overhead_limit = NULL; | |
79 objArrayOop Universe::_preallocated_out_of_memory_error_array = NULL; | |
80 volatile jint Universe::_preallocated_out_of_memory_error_avail_count = 0; | |
81 bool Universe::_verify_in_progress = false; | |
82 oop Universe::_null_ptr_exception_instance = NULL; | |
83 oop Universe::_arithmetic_exception_instance = NULL; | |
84 oop Universe::_virtual_machine_error_instance = NULL; | |
85 oop Universe::_vm_exception = NULL; | |
86 oop Universe::_emptySymbol = NULL; | |
87 | |
88 // These variables are guarded by FullGCALot_lock. | |
89 debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;) | |
90 debug_only(int Universe::_fullgc_alot_dummy_next = 0;) | |
91 | |
92 | |
93 // Heap | |
94 int Universe::_verify_count = 0; | |
95 | |
96 int Universe::_base_vtable_size = 0; | |
97 bool Universe::_bootstrapping = false; | |
98 bool Universe::_fully_initialized = false; | |
99 | |
100 size_t Universe::_heap_capacity_at_last_gc; | |
453
c96030fff130
6684579: SoftReference processing can be made more efficient
ysr
parents:
356
diff
changeset
|
101 size_t Universe::_heap_used_at_last_gc = 0; |
0 | 102 |
103 CollectedHeap* Universe::_collectedHeap = NULL; | |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
104 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
105 NarrowOopStruct Universe::_narrow_oop = { NULL, 0, true }; |
0 | 106 |
107 | |
108 void Universe::basic_type_classes_do(void f(klassOop)) { | |
109 f(boolArrayKlassObj()); | |
110 f(byteArrayKlassObj()); | |
111 f(charArrayKlassObj()); | |
112 f(intArrayKlassObj()); | |
113 f(shortArrayKlassObj()); | |
114 f(longArrayKlassObj()); | |
115 f(singleArrayKlassObj()); | |
116 f(doubleArrayKlassObj()); | |
117 } | |
118 | |
119 | |
120 void Universe::system_classes_do(void f(klassOop)) { | |
121 f(symbolKlassObj()); | |
122 f(methodKlassObj()); | |
123 f(constMethodKlassObj()); | |
124 f(methodDataKlassObj()); | |
125 f(klassKlassObj()); | |
126 f(arrayKlassKlassObj()); | |
127 f(objArrayKlassKlassObj()); | |
128 f(typeArrayKlassKlassObj()); | |
129 f(instanceKlassKlassObj()); | |
130 f(constantPoolKlassObj()); | |
131 f(systemObjArrayKlassObj()); | |
132 } | |
133 | |
134 void Universe::oops_do(OopClosure* f, bool do_all) { | |
135 | |
136 f->do_oop((oop*) &_int_mirror); | |
137 f->do_oop((oop*) &_float_mirror); | |
138 f->do_oop((oop*) &_double_mirror); | |
139 f->do_oop((oop*) &_byte_mirror); | |
140 f->do_oop((oop*) &_bool_mirror); | |
141 f->do_oop((oop*) &_char_mirror); | |
142 f->do_oop((oop*) &_long_mirror); | |
143 f->do_oop((oop*) &_short_mirror); | |
144 f->do_oop((oop*) &_void_mirror); | |
145 | |
146 // It's important to iterate over these guys even if they are null, | |
147 // since that's how shared heaps are restored. | |
148 for (int i = T_BOOLEAN; i < T_VOID+1; i++) { | |
149 f->do_oop((oop*) &_mirrors[i]); | |
150 } | |
151 assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking"); | |
152 | |
153 // %%% Consider moving those "shared oops" over here with the others. | |
154 f->do_oop((oop*)&_boolArrayKlassObj); | |
155 f->do_oop((oop*)&_byteArrayKlassObj); | |
156 f->do_oop((oop*)&_charArrayKlassObj); | |
157 f->do_oop((oop*)&_intArrayKlassObj); | |
158 f->do_oop((oop*)&_shortArrayKlassObj); | |
159 f->do_oop((oop*)&_longArrayKlassObj); | |
160 f->do_oop((oop*)&_singleArrayKlassObj); | |
161 f->do_oop((oop*)&_doubleArrayKlassObj); | |
162 f->do_oop((oop*)&_objectArrayKlassObj); | |
163 { | |
164 for (int i = 0; i < T_VOID+1; i++) { | |
165 if (_typeArrayKlassObjs[i] != NULL) { | |
166 assert(i >= T_BOOLEAN, "checking"); | |
167 f->do_oop((oop*)&_typeArrayKlassObjs[i]); | |
168 } else if (do_all) { | |
169 f->do_oop((oop*)&_typeArrayKlassObjs[i]); | |
170 } | |
171 } | |
172 } | |
173 f->do_oop((oop*)&_symbolKlassObj); | |
174 f->do_oop((oop*)&_methodKlassObj); | |
175 f->do_oop((oop*)&_constMethodKlassObj); | |
176 f->do_oop((oop*)&_methodDataKlassObj); | |
177 f->do_oop((oop*)&_klassKlassObj); | |
178 f->do_oop((oop*)&_arrayKlassKlassObj); | |
179 f->do_oop((oop*)&_objArrayKlassKlassObj); | |
180 f->do_oop((oop*)&_typeArrayKlassKlassObj); | |
181 f->do_oop((oop*)&_instanceKlassKlassObj); | |
182 f->do_oop((oop*)&_constantPoolKlassObj); | |
183 f->do_oop((oop*)&_constantPoolCacheKlassObj); | |
184 f->do_oop((oop*)&_compiledICHolderKlassObj); | |
185 f->do_oop((oop*)&_systemObjArrayKlassObj); | |
186 f->do_oop((oop*)&_the_empty_byte_array); | |
187 f->do_oop((oop*)&_the_empty_short_array); | |
188 f->do_oop((oop*)&_the_empty_int_array); | |
189 f->do_oop((oop*)&_the_empty_system_obj_array); | |
190 f->do_oop((oop*)&_the_empty_class_klass_array); | |
191 f->do_oop((oop*)&_the_array_interfaces_array); | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
192 f->do_oop((oop*)&_the_null_string); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
193 f->do_oop((oop*)&_the_min_jint_string); |
0 | 194 _finalizer_register_cache->oops_do(f); |
195 _loader_addClass_cache->oops_do(f); | |
196 _reflect_invoke_cache->oops_do(f); | |
197 f->do_oop((oop*)&_out_of_memory_error_java_heap); | |
198 f->do_oop((oop*)&_out_of_memory_error_perm_gen); | |
199 f->do_oop((oop*)&_out_of_memory_error_array_size); | |
200 f->do_oop((oop*)&_out_of_memory_error_gc_overhead_limit); | |
201 if (_preallocated_out_of_memory_error_array != (oop)NULL) { // NULL when DumpSharedSpaces | |
202 f->do_oop((oop*)&_preallocated_out_of_memory_error_array); | |
203 } | |
204 f->do_oop((oop*)&_null_ptr_exception_instance); | |
205 f->do_oop((oop*)&_arithmetic_exception_instance); | |
206 f->do_oop((oop*)&_virtual_machine_error_instance); | |
207 f->do_oop((oop*)&_main_thread_group); | |
208 f->do_oop((oop*)&_system_thread_group); | |
209 f->do_oop((oop*)&_vm_exception); | |
210 f->do_oop((oop*)&_emptySymbol); | |
211 debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);) | |
212 } | |
213 | |
214 | |
215 void Universe::check_alignment(uintx size, uintx alignment, const char* name) { | |
216 if (size < alignment || size % alignment != 0) { | |
217 ResourceMark rm; | |
218 stringStream st; | |
219 st.print("Size of %s (%ld bytes) must be aligned to %ld bytes", name, size, alignment); | |
220 char* error = st.as_string(); | |
221 vm_exit_during_initialization(error); | |
222 } | |
223 } | |
224 | |
225 | |
226 void Universe::genesis(TRAPS) { | |
227 ResourceMark rm; | |
228 { FlagSetting fs(_bootstrapping, true); | |
229 | |
230 { MutexLocker mc(Compile_lock); | |
231 | |
232 // determine base vtable size; without that we cannot create the array klasses | |
233 compute_base_vtable_size(); | |
234 | |
235 if (!UseSharedSpaces) { | |
236 _klassKlassObj = klassKlass::create_klass(CHECK); | |
237 _arrayKlassKlassObj = arrayKlassKlass::create_klass(CHECK); | |
238 | |
239 _objArrayKlassKlassObj = objArrayKlassKlass::create_klass(CHECK); | |
240 _instanceKlassKlassObj = instanceKlassKlass::create_klass(CHECK); | |
241 _typeArrayKlassKlassObj = typeArrayKlassKlass::create_klass(CHECK); | |
242 | |
243 _symbolKlassObj = symbolKlass::create_klass(CHECK); | |
244 | |
245 _emptySymbol = oopFactory::new_symbol("", CHECK); | |
246 | |
247 _boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK); | |
248 _charArrayKlassObj = typeArrayKlass::create_klass(T_CHAR, sizeof(jchar), CHECK); | |
249 _singleArrayKlassObj = typeArrayKlass::create_klass(T_FLOAT, sizeof(jfloat), CHECK); | |
250 _doubleArrayKlassObj = typeArrayKlass::create_klass(T_DOUBLE, sizeof(jdouble), CHECK); | |
251 _byteArrayKlassObj = typeArrayKlass::create_klass(T_BYTE, sizeof(jbyte), CHECK); | |
252 _shortArrayKlassObj = typeArrayKlass::create_klass(T_SHORT, sizeof(jshort), CHECK); | |
253 _intArrayKlassObj = typeArrayKlass::create_klass(T_INT, sizeof(jint), CHECK); | |
254 _longArrayKlassObj = typeArrayKlass::create_klass(T_LONG, sizeof(jlong), CHECK); | |
255 | |
256 _typeArrayKlassObjs[T_BOOLEAN] = _boolArrayKlassObj; | |
257 _typeArrayKlassObjs[T_CHAR] = _charArrayKlassObj; | |
258 _typeArrayKlassObjs[T_FLOAT] = _singleArrayKlassObj; | |
259 _typeArrayKlassObjs[T_DOUBLE] = _doubleArrayKlassObj; | |
260 _typeArrayKlassObjs[T_BYTE] = _byteArrayKlassObj; | |
261 _typeArrayKlassObjs[T_SHORT] = _shortArrayKlassObj; | |
262 _typeArrayKlassObjs[T_INT] = _intArrayKlassObj; | |
263 _typeArrayKlassObjs[T_LONG] = _longArrayKlassObj; | |
264 | |
481
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
265 _methodKlassObj = methodKlass::create_klass(CHECK); |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
266 _constMethodKlassObj = constMethodKlass::create_klass(CHECK); |
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
267 _methodDataKlassObj = methodDataKlass::create_klass(CHECK); |
0 | 268 _constantPoolKlassObj = constantPoolKlass::create_klass(CHECK); |
269 _constantPoolCacheKlassObj = constantPoolCacheKlass::create_klass(CHECK); | |
270 | |
271 _compiledICHolderKlassObj = compiledICHolderKlass::create_klass(CHECK); | |
272 _systemObjArrayKlassObj = objArrayKlassKlass::cast(objArrayKlassKlassObj())->allocate_system_objArray_klass(CHECK); | |
273 | |
481
7d7a7c599c17
6578152: fill_region_with_object has usability and safety issues
jcoomes
parents:
453
diff
changeset
|
274 _the_empty_byte_array = oopFactory::new_permanent_byteArray(0, CHECK); |
0 | 275 _the_empty_short_array = oopFactory::new_permanent_shortArray(0, CHECK); |
276 _the_empty_int_array = oopFactory::new_permanent_intArray(0, CHECK); | |
277 _the_empty_system_obj_array = oopFactory::new_system_objArray(0, CHECK); | |
278 | |
279 _the_array_interfaces_array = oopFactory::new_system_objArray(2, CHECK); | |
280 _vm_exception = oopFactory::new_symbol("vm exception holder", CHECK); | |
281 } else { | |
282 FileMapInfo *mapinfo = FileMapInfo::current_info(); | |
283 char* buffer = mapinfo->region_base(CompactingPermGenGen::md); | |
284 void** vtbl_list = (void**)buffer; | |
285 init_self_patching_vtbl_list(vtbl_list, | |
286 CompactingPermGenGen::vtbl_list_size); | |
287 } | |
288 } | |
289 | |
290 vmSymbols::initialize(CHECK); | |
291 | |
292 SystemDictionary::initialize(CHECK); | |
293 | |
1142 | 294 klassOop ok = SystemDictionary::Object_klass(); |
0 | 295 |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
296 _the_null_string = StringTable::intern("null", CHECK); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
297 _the_min_jint_string = StringTable::intern("-2147483648", CHECK); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
1057
diff
changeset
|
298 |
0 | 299 if (UseSharedSpaces) { |
300 // Verify shared interfaces array. | |
301 assert(_the_array_interfaces_array->obj_at(0) == | |
1142 | 302 SystemDictionary::Cloneable_klass(), "u3"); |
0 | 303 assert(_the_array_interfaces_array->obj_at(1) == |
1142 | 304 SystemDictionary::Serializable_klass(), "u3"); |
0 | 305 |
306 // Verify element klass for system obj array klass | |
307 assert(objArrayKlass::cast(_systemObjArrayKlassObj)->element_klass() == ok, "u1"); | |
308 assert(objArrayKlass::cast(_systemObjArrayKlassObj)->bottom_klass() == ok, "u2"); | |
309 | |
310 // Verify super class for the classes created above | |
311 assert(Klass::cast(boolArrayKlassObj() )->super() == ok, "u3"); | |
312 assert(Klass::cast(charArrayKlassObj() )->super() == ok, "u3"); | |
313 assert(Klass::cast(singleArrayKlassObj() )->super() == ok, "u3"); | |
314 assert(Klass::cast(doubleArrayKlassObj() )->super() == ok, "u3"); | |
315 assert(Klass::cast(byteArrayKlassObj() )->super() == ok, "u3"); | |
316 assert(Klass::cast(shortArrayKlassObj() )->super() == ok, "u3"); | |
317 assert(Klass::cast(intArrayKlassObj() )->super() == ok, "u3"); | |
318 assert(Klass::cast(longArrayKlassObj() )->super() == ok, "u3"); | |
319 assert(Klass::cast(constantPoolKlassObj() )->super() == ok, "u3"); | |
320 assert(Klass::cast(systemObjArrayKlassObj())->super() == ok, "u3"); | |
321 } else { | |
322 // Set up shared interfaces array. (Do this before supers are set up.) | |
1142 | 323 _the_array_interfaces_array->obj_at_put(0, SystemDictionary::Cloneable_klass()); |
324 _the_array_interfaces_array->obj_at_put(1, SystemDictionary::Serializable_klass()); | |
0 | 325 |
326 // Set element klass for system obj array klass | |
327 objArrayKlass::cast(_systemObjArrayKlassObj)->set_element_klass(ok); | |
328 objArrayKlass::cast(_systemObjArrayKlassObj)->set_bottom_klass(ok); | |
329 | |
330 // Set super class for the classes created above | |
331 Klass::cast(boolArrayKlassObj() )->initialize_supers(ok, CHECK); | |
332 Klass::cast(charArrayKlassObj() )->initialize_supers(ok, CHECK); | |
333 Klass::cast(singleArrayKlassObj() )->initialize_supers(ok, CHECK); | |
334 Klass::cast(doubleArrayKlassObj() )->initialize_supers(ok, CHECK); | |
335 Klass::cast(byteArrayKlassObj() )->initialize_supers(ok, CHECK); | |
336 Klass::cast(shortArrayKlassObj() )->initialize_supers(ok, CHECK); | |
337 Klass::cast(intArrayKlassObj() )->initialize_supers(ok, CHECK); | |
338 Klass::cast(longArrayKlassObj() )->initialize_supers(ok, CHECK); | |
339 Klass::cast(constantPoolKlassObj() )->initialize_supers(ok, CHECK); | |
340 Klass::cast(systemObjArrayKlassObj())->initialize_supers(ok, CHECK); | |
341 Klass::cast(boolArrayKlassObj() )->set_super(ok); | |
342 Klass::cast(charArrayKlassObj() )->set_super(ok); | |
343 Klass::cast(singleArrayKlassObj() )->set_super(ok); | |
344 Klass::cast(doubleArrayKlassObj() )->set_super(ok); | |
345 Klass::cast(byteArrayKlassObj() )->set_super(ok); | |
346 Klass::cast(shortArrayKlassObj() )->set_super(ok); | |
347 Klass::cast(intArrayKlassObj() )->set_super(ok); | |
348 Klass::cast(longArrayKlassObj() )->set_super(ok); | |
349 Klass::cast(constantPoolKlassObj() )->set_super(ok); | |
350 Klass::cast(systemObjArrayKlassObj())->set_super(ok); | |
351 } | |
352 | |
353 Klass::cast(boolArrayKlassObj() )->append_to_sibling_list(); | |
354 Klass::cast(charArrayKlassObj() )->append_to_sibling_list(); | |
355 Klass::cast(singleArrayKlassObj() )->append_to_sibling_list(); | |
356 Klass::cast(doubleArrayKlassObj() )->append_to_sibling_list(); | |
357 Klass::cast(byteArrayKlassObj() )->append_to_sibling_list(); | |
358 Klass::cast(shortArrayKlassObj() )->append_to_sibling_list(); | |
359 Klass::cast(intArrayKlassObj() )->append_to_sibling_list(); | |
360 Klass::cast(longArrayKlassObj() )->append_to_sibling_list(); | |
361 Klass::cast(constantPoolKlassObj() )->append_to_sibling_list(); | |
362 Klass::cast(systemObjArrayKlassObj())->append_to_sibling_list(); | |
363 } // end of core bootstrapping | |
364 | |
365 // Initialize _objectArrayKlass after core bootstraping to make | |
366 // sure the super class is set up properly for _objectArrayKlass. | |
367 _objectArrayKlassObj = instanceKlass:: | |
1142 | 368 cast(SystemDictionary::Object_klass())->array_klass(1, CHECK); |
0 | 369 // Add the class to the class hierarchy manually to make sure that |
370 // its vtable is initialized after core bootstrapping is completed. | |
371 Klass::cast(_objectArrayKlassObj)->append_to_sibling_list(); | |
372 | |
373 // Compute is_jdk version flags. | |
374 // Only 1.3 or later has the java.lang.Shutdown class. | |
375 // Only 1.4 or later has the java.lang.CharSequence interface. | |
376 // Only 1.5 or later has the java.lang.management.MemoryUsage class. | |
242 | 377 if (JDK_Version::is_partially_initialized()) { |
378 uint8_t jdk_version; | |
379 klassOop k = SystemDictionary::resolve_or_null( | |
380 vmSymbolHandles::java_lang_management_MemoryUsage(), THREAD); | |
0 | 381 CLEAR_PENDING_EXCEPTION; // ignore exceptions |
382 if (k == NULL) { | |
242 | 383 k = SystemDictionary::resolve_or_null( |
384 vmSymbolHandles::java_lang_CharSequence(), THREAD); | |
0 | 385 CLEAR_PENDING_EXCEPTION; // ignore exceptions |
386 if (k == NULL) { | |
242 | 387 k = SystemDictionary::resolve_or_null( |
388 vmSymbolHandles::java_lang_Shutdown(), THREAD); | |
0 | 389 CLEAR_PENDING_EXCEPTION; // ignore exceptions |
390 if (k == NULL) { | |
242 | 391 jdk_version = 2; |
0 | 392 } else { |
242 | 393 jdk_version = 3; |
0 | 394 } |
395 } else { | |
242 | 396 jdk_version = 4; |
0 | 397 } |
398 } else { | |
242 | 399 jdk_version = 5; |
0 | 400 } |
242 | 401 JDK_Version::fully_initialize(jdk_version); |
0 | 402 } |
403 | |
404 #ifdef ASSERT | |
405 if (FullGCALot) { | |
406 // Allocate an array of dummy objects. | |
407 // We'd like these to be at the bottom of the old generation, | |
408 // so that when we free one and then collect, | |
409 // (almost) the whole heap moves | |
410 // and we find out if we actually update all the oops correctly. | |
411 // But we can't allocate directly in the old generation, | |
412 // so we allocate wherever, and hope that the first collection | |
413 // moves these objects to the bottom of the old generation. | |
414 // We can allocate directly in the permanent generation, so we do. | |
415 int size; | |
416 if (UseConcMarkSweepGC) { | |
417 warning("Using +FullGCALot with concurrent mark sweep gc " | |
418 "will not force all objects to relocate"); | |
419 size = FullGCALotDummies; | |
420 } else { | |
421 size = FullGCALotDummies * 2; | |
422 } | |
423 objArrayOop naked_array = oopFactory::new_system_objArray(size, CHECK); | |
424 objArrayHandle dummy_array(THREAD, naked_array); | |
425 int i = 0; | |
426 while (i < size) { | |
427 if (!UseConcMarkSweepGC) { | |
428 // Allocate dummy in old generation | |
1142 | 429 oop dummy = instanceKlass::cast(SystemDictionary::Object_klass())->allocate_instance(CHECK); |
0 | 430 dummy_array->obj_at_put(i++, dummy); |
431 } | |
432 // Allocate dummy in permanent generation | |
1142 | 433 oop dummy = instanceKlass::cast(SystemDictionary::Object_klass())->allocate_permanent_instance(CHECK); |
0 | 434 dummy_array->obj_at_put(i++, dummy); |
435 } | |
436 { | |
437 // Only modify the global variable inside the mutex. | |
438 // If we had a race to here, the other dummy_array instances | |
439 // and their elements just get dropped on the floor, which is fine. | |
440 MutexLocker ml(FullGCALot_lock); | |
441 if (_fullgc_alot_dummy_array == NULL) { | |
442 _fullgc_alot_dummy_array = dummy_array(); | |
443 } | |
444 } | |
445 assert(i == _fullgc_alot_dummy_array->length(), "just checking"); | |
446 } | |
447 #endif | |
448 } | |
449 | |
450 | |
451 static inline void add_vtable(void** list, int* n, Klass* o, int count) { | |
452 list[(*n)++] = *(void**)&o->vtbl_value(); | |
453 guarantee((*n) <= count, "vtable list too small."); | |
454 } | |
455 | |
456 | |
457 void Universe::init_self_patching_vtbl_list(void** list, int count) { | |
458 int n = 0; | |
459 { klassKlass o; add_vtable(list, &n, &o, count); } | |
460 { arrayKlassKlass o; add_vtable(list, &n, &o, count); } | |
461 { objArrayKlassKlass o; add_vtable(list, &n, &o, count); } | |
462 { instanceKlassKlass o; add_vtable(list, &n, &o, count); } | |
463 { instanceKlass o; add_vtable(list, &n, &o, count); } | |
464 { instanceRefKlass o; add_vtable(list, &n, &o, count); } | |
465 { typeArrayKlassKlass o; add_vtable(list, &n, &o, count); } | |
466 { symbolKlass o; add_vtable(list, &n, &o, count); } | |
467 { typeArrayKlass o; add_vtable(list, &n, &o, count); } | |
468 { methodKlass o; add_vtable(list, &n, &o, count); } | |
469 { constMethodKlass o; add_vtable(list, &n, &o, count); } | |
470 { constantPoolKlass o; add_vtable(list, &n, &o, count); } | |
471 { constantPoolCacheKlass o; add_vtable(list, &n, &o, count); } | |
472 { objArrayKlass o; add_vtable(list, &n, &o, count); } | |
473 { methodDataKlass o; add_vtable(list, &n, &o, count); } | |
474 { compiledICHolderKlass o; add_vtable(list, &n, &o, count); } | |
475 } | |
476 | |
477 | |
478 class FixupMirrorClosure: public ObjectClosure { | |
479 public: | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
480 virtual void do_object(oop obj) { |
0 | 481 if (obj->is_klass()) { |
482 EXCEPTION_MARK; | |
483 KlassHandle k(THREAD, klassOop(obj)); | |
484 // We will never reach the CATCH below since Exceptions::_throw will cause | |
485 // the VM to exit if an exception is thrown during initialization | |
486 java_lang_Class::create_mirror(k, CATCH); | |
487 // This call unconditionally creates a new mirror for k, | |
488 // and links in k's component_mirror field if k is an array. | |
489 // If k is an objArray, k's element type must already have | |
490 // a mirror. In other words, this closure must process | |
491 // the component type of an objArray k before it processes k. | |
492 // This works because the permgen iterator presents arrays | |
493 // and their component types in order of creation. | |
494 } | |
495 } | |
496 }; | |
497 | |
498 void Universe::initialize_basic_type_mirrors(TRAPS) { | |
499 if (UseSharedSpaces) { | |
500 assert(_int_mirror != NULL, "already loaded"); | |
501 assert(_void_mirror == _mirrors[T_VOID], "consistently loaded"); | |
502 } else { | |
503 | |
504 assert(_int_mirror==NULL, "basic type mirrors already initialized"); | |
505 _int_mirror = | |
506 java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK); | |
507 _float_mirror = | |
508 java_lang_Class::create_basic_type_mirror("float", T_FLOAT, CHECK); | |
509 _double_mirror = | |
510 java_lang_Class::create_basic_type_mirror("double", T_DOUBLE, CHECK); | |
511 _byte_mirror = | |
512 java_lang_Class::create_basic_type_mirror("byte", T_BYTE, CHECK); | |
513 _bool_mirror = | |
514 java_lang_Class::create_basic_type_mirror("boolean",T_BOOLEAN, CHECK); | |
515 _char_mirror = | |
516 java_lang_Class::create_basic_type_mirror("char", T_CHAR, CHECK); | |
517 _long_mirror = | |
518 java_lang_Class::create_basic_type_mirror("long", T_LONG, CHECK); | |
519 _short_mirror = | |
520 java_lang_Class::create_basic_type_mirror("short", T_SHORT, CHECK); | |
521 _void_mirror = | |
522 java_lang_Class::create_basic_type_mirror("void", T_VOID, CHECK); | |
523 | |
524 _mirrors[T_INT] = _int_mirror; | |
525 _mirrors[T_FLOAT] = _float_mirror; | |
526 _mirrors[T_DOUBLE] = _double_mirror; | |
527 _mirrors[T_BYTE] = _byte_mirror; | |
528 _mirrors[T_BOOLEAN] = _bool_mirror; | |
529 _mirrors[T_CHAR] = _char_mirror; | |
530 _mirrors[T_LONG] = _long_mirror; | |
531 _mirrors[T_SHORT] = _short_mirror; | |
532 _mirrors[T_VOID] = _void_mirror; | |
533 //_mirrors[T_OBJECT] = instanceKlass::cast(_object_klass)->java_mirror(); | |
534 //_mirrors[T_ARRAY] = instanceKlass::cast(_object_klass)->java_mirror(); | |
535 } | |
536 } | |
537 | |
538 void Universe::fixup_mirrors(TRAPS) { | |
539 // Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly, | |
540 // but we cannot do that for classes created before java.lang.Class is loaded. Here we simply | |
541 // walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note | |
542 // that the number of objects allocated at this point is very small. | |
1142 | 543 assert(SystemDictionary::Class_klass_loaded(), "java.lang.Class should be loaded"); |
0 | 544 FixupMirrorClosure blk; |
545 Universe::heap()->permanent_object_iterate(&blk); | |
546 } | |
547 | |
548 | |
549 static bool has_run_finalizers_on_exit = false; | |
550 | |
551 void Universe::run_finalizers_on_exit() { | |
552 if (has_run_finalizers_on_exit) return; | |
553 has_run_finalizers_on_exit = true; | |
554 | |
555 // Called on VM exit. This ought to be run in a separate thread. | |
556 if (TraceReferenceGC) tty->print_cr("Callback to run finalizers on exit"); | |
557 { | |
558 PRESERVE_EXCEPTION_MARK; | |
1142 | 559 KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass()); |
0 | 560 JavaValue result(T_VOID); |
561 JavaCalls::call_static( | |
562 &result, | |
563 finalizer_klass, | |
564 vmSymbolHandles::run_finalizers_on_exit_name(), | |
565 vmSymbolHandles::void_method_signature(), | |
566 THREAD | |
567 ); | |
568 // Ignore any pending exceptions | |
569 CLEAR_PENDING_EXCEPTION; | |
570 } | |
571 } | |
572 | |
573 | |
574 // initialize_vtable could cause gc if | |
575 // 1) we specified true to initialize_vtable and | |
576 // 2) this ran after gc was enabled | |
577 // In case those ever change we use handles for oops | |
578 void Universe::reinitialize_vtable_of(KlassHandle k_h, TRAPS) { | |
579 // init vtable of k and all subclasses | |
580 Klass* ko = k_h()->klass_part(); | |
581 klassVtable* vt = ko->vtable(); | |
582 if (vt) vt->initialize_vtable(false, CHECK); | |
583 if (ko->oop_is_instance()) { | |
584 instanceKlass* ik = (instanceKlass*)ko; | |
585 for (KlassHandle s_h(THREAD, ik->subklass()); s_h() != NULL; s_h = (THREAD, s_h()->klass_part()->next_sibling())) { | |
586 reinitialize_vtable_of(s_h, CHECK); | |
587 } | |
588 } | |
589 } | |
590 | |
591 | |
592 void initialize_itable_for_klass(klassOop k, TRAPS) { | |
593 instanceKlass::cast(k)->itable()->initialize_itable(false, CHECK); | |
594 } | |
595 | |
596 | |
597 void Universe::reinitialize_itables(TRAPS) { | |
598 SystemDictionary::classes_do(initialize_itable_for_klass, CHECK); | |
599 | |
600 } | |
601 | |
602 | |
603 bool Universe::on_page_boundary(void* addr) { | |
604 return ((uintptr_t) addr) % os::vm_page_size() == 0; | |
605 } | |
606 | |
607 | |
608 bool Universe::should_fill_in_stack_trace(Handle throwable) { | |
609 // never attempt to fill in the stack trace of preallocated errors that do not have | |
610 // backtrace. These errors are kept alive forever and may be "re-used" when all | |
611 // preallocated errors with backtrace have been consumed. Also need to avoid | |
612 // a potential loop which could happen if an out of memory occurs when attempting | |
613 // to allocate the backtrace. | |
614 return ((throwable() != Universe::_out_of_memory_error_java_heap) && | |
615 (throwable() != Universe::_out_of_memory_error_perm_gen) && | |
616 (throwable() != Universe::_out_of_memory_error_array_size) && | |
617 (throwable() != Universe::_out_of_memory_error_gc_overhead_limit)); | |
618 } | |
619 | |
620 | |
621 oop Universe::gen_out_of_memory_error(oop default_err) { | |
622 // generate an out of memory error: | |
623 // - if there is a preallocated error with backtrace available then return it wth | |
624 // a filled in stack trace. | |
625 // - if there are no preallocated errors with backtrace available then return | |
626 // an error without backtrace. | |
627 int next; | |
628 if (_preallocated_out_of_memory_error_avail_count > 0) { | |
629 next = (int)Atomic::add(-1, &_preallocated_out_of_memory_error_avail_count); | |
630 assert(next < (int)PreallocatedOutOfMemoryErrorCount, "avail count is corrupt"); | |
631 } else { | |
632 next = -1; | |
633 } | |
634 if (next < 0) { | |
635 // all preallocated errors have been used. | |
636 // return default | |
637 return default_err; | |
638 } else { | |
639 // get the error object at the slot and set set it to NULL so that the | |
640 // array isn't keeping it alive anymore. | |
641 oop exc = preallocated_out_of_memory_errors()->obj_at(next); | |
642 assert(exc != NULL, "slot has been used already"); | |
643 preallocated_out_of_memory_errors()->obj_at_put(next, NULL); | |
644 | |
645 // use the message from the default error | |
646 oop msg = java_lang_Throwable::message(default_err); | |
647 assert(msg != NULL, "no message"); | |
648 java_lang_Throwable::set_message(exc, msg); | |
649 | |
650 // populate the stack trace and return it. | |
651 java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(exc); | |
652 return exc; | |
653 } | |
654 } | |
655 | |
656 static intptr_t non_oop_bits = 0; | |
657 | |
658 void* Universe::non_oop_word() { | |
659 // Neither the high bits nor the low bits of this value is allowed | |
660 // to look like (respectively) the high or low bits of a real oop. | |
661 // | |
662 // High and low are CPU-specific notions, but low always includes | |
663 // the low-order bit. Since oops are always aligned at least mod 4, | |
664 // setting the low-order bit will ensure that the low half of the | |
665 // word will never look like that of a real oop. | |
666 // | |
667 // Using the OS-supplied non-memory-address word (usually 0 or -1) | |
668 // will take care of the high bits, however many there are. | |
669 | |
670 if (non_oop_bits == 0) { | |
671 non_oop_bits = (intptr_t)os::non_memory_address_word() | 1; | |
672 } | |
673 | |
674 return (void*)non_oop_bits; | |
675 } | |
676 | |
677 jint universe_init() { | |
678 assert(!Universe::_fully_initialized, "called after initialize_vtables"); | |
679 guarantee(1 << LogHeapWordSize == sizeof(HeapWord), | |
680 "LogHeapWordSize is incorrect."); | |
681 guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?"); | |
682 guarantee(sizeof(oop) % sizeof(HeapWord) == 0, | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
683 "oop size is not not a multiple of HeapWord size"); |
0 | 684 TraceTime timer("Genesis", TraceStartupTime); |
685 GC_locker::lock(); // do not allow gc during bootstrapping | |
686 JavaClasses::compute_hard_coded_offsets(); | |
687 | |
688 // Get map info from shared archive file. | |
689 if (DumpSharedSpaces) | |
690 UseSharedSpaces = false; | |
691 | |
692 FileMapInfo* mapinfo = NULL; | |
693 if (UseSharedSpaces) { | |
694 mapinfo = NEW_C_HEAP_OBJ(FileMapInfo); | |
695 memset(mapinfo, 0, sizeof(FileMapInfo)); | |
696 | |
697 // Open the shared archive file, read and validate the header. If | |
698 // initialization files, shared spaces [UseSharedSpaces] are | |
699 // disabled and the file is closed. | |
700 | |
701 if (mapinfo->initialize()) { | |
702 FileMapInfo::set_current_info(mapinfo); | |
703 } else { | |
704 assert(!mapinfo->is_open() && !UseSharedSpaces, | |
705 "archive file not closed or shared spaces not disabled."); | |
706 } | |
707 } | |
708 | |
709 jint status = Universe::initialize_heap(); | |
710 if (status != JNI_OK) { | |
711 return status; | |
712 } | |
713 | |
714 // We have a heap so create the methodOop caches before | |
715 // CompactingPermGenGen::initialize_oops() tries to populate them. | |
716 Universe::_finalizer_register_cache = new LatestMethodOopCache(); | |
717 Universe::_loader_addClass_cache = new LatestMethodOopCache(); | |
718 Universe::_reflect_invoke_cache = new ActiveMethodOopsCache(); | |
719 | |
720 if (UseSharedSpaces) { | |
721 | |
722 // Read the data structures supporting the shared spaces (shared | |
723 // system dictionary, symbol table, etc.). After that, access to | |
724 // the file (other than the mapped regions) is no longer needed, and | |
725 // the file is closed. Closing the file does not affect the | |
726 // currently mapped regions. | |
727 | |
728 CompactingPermGenGen::initialize_oops(); | |
729 mapinfo->close(); | |
730 | |
731 } else { | |
732 SymbolTable::create_table(); | |
733 StringTable::create_table(); | |
734 ClassLoader::create_package_info_table(); | |
735 } | |
736 | |
737 return JNI_OK; | |
738 } | |
739 | |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
740 // Choose the heap base address and oop encoding mode |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
741 // when compressed oops are used: |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
742 // Unscaled - Use 32-bits oops without encoding when |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
743 // NarrowOopHeapBaseMin + heap_size < 4Gb |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
744 // ZeroBased - Use zero based compressed oops with encoding when |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
745 // NarrowOopHeapBaseMin + heap_size < 32Gb |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
746 // HeapBased - Use compressed oops with heap base + encoding. |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
747 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
748 // 4Gb |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
749 static const uint64_t NarrowOopHeapMax = (uint64_t(max_juint) + 1); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
750 // 32Gb |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1507
diff
changeset
|
751 // OopEncodingHeapMax == NarrowOopHeapMax << LogMinObjAlignmentInBytes; |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
752 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
753 char* Universe::preferred_heap_base(size_t heap_size, NARROW_OOP_MODE mode) { |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
754 size_t base = 0; |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
755 #ifdef _LP64 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
756 if (UseCompressedOops) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
757 assert(mode == UnscaledNarrowOop || |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
758 mode == ZeroBasedNarrowOop || |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
759 mode == HeapBasedNarrowOop, "mode is invalid"); |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
760 const size_t total_size = heap_size + HeapBaseMinAddress; |
922
1a81ea4b45d4
6869822: assert(Universe::narrow_oop_shift() == 0,"use unscaled narrow oop")
kvn
parents:
845
diff
changeset
|
761 // Return specified base for the first request. |
1a81ea4b45d4
6869822: assert(Universe::narrow_oop_shift() == 0,"use unscaled narrow oop")
kvn
parents:
845
diff
changeset
|
762 if (!FLAG_IS_DEFAULT(HeapBaseMinAddress) && (mode == UnscaledNarrowOop)) { |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
763 base = HeapBaseMinAddress; |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
764 } else if (total_size <= OopEncodingHeapMax && (mode != HeapBasedNarrowOop)) { |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
765 if (total_size <= NarrowOopHeapMax && (mode == UnscaledNarrowOop) && |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
766 (Universe::narrow_oop_shift() == 0)) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
767 // Use 32-bits oops without encoding and |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
768 // place heap's top on the 4Gb boundary |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
769 base = (NarrowOopHeapMax - heap_size); |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
770 } else { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
771 // Can't reserve with NarrowOopShift == 0 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
772 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
773 if (mode == UnscaledNarrowOop || |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
774 mode == ZeroBasedNarrowOop && total_size <= NarrowOopHeapMax) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
775 // Use zero based compressed oops with encoding and |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
776 // place heap's top on the 32Gb boundary in case |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
777 // total_size > 4Gb or failed to reserve below 4Gb. |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
778 base = (OopEncodingHeapMax - heap_size); |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
779 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
780 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
781 } else { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
782 // Can't reserve below 32Gb. |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
783 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
784 } |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
785 // Set narrow_oop_base and narrow_oop_use_implicit_null_checks |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
786 // used in ReservedHeapSpace() constructors. |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
787 // The final values will be set in initialize_heap() below. |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
788 if (base != 0 && (base + heap_size) <= OopEncodingHeapMax) { |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
789 // Use zero based compressed oops |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
790 Universe::set_narrow_oop_base(NULL); |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
791 // Don't need guard page for implicit checks in indexed |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
792 // addressing mode with zero based Compressed Oops. |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
793 Universe::set_narrow_oop_use_implicit_null_checks(true); |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
794 } else { |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
795 // Set to a non-NULL value so the ReservedSpace ctor computes |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
796 // the correct no-access prefix. |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
797 // The final value will be set in initialize_heap() below. |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
798 Universe::set_narrow_oop_base((address)NarrowOopHeapMax); |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
799 #ifdef _WIN64 |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
800 if (UseLargePages) { |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
801 // Cannot allocate guard pages for implicit checks in indexed |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
802 // addressing mode when large pages are specified on windows. |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
803 Universe::set_narrow_oop_use_implicit_null_checks(false); |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
804 } |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
805 #endif // _WIN64 |
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
806 } |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
807 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
808 #endif |
1057
f334aec453a1
6896084: VM does not reserve protected page below heap for compressed oops implicit null checks
kvn
parents:
922
diff
changeset
|
809 return (char*)base; // also return NULL (don't care) for 32-bit VM |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
810 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
811 |
0 | 812 jint Universe::initialize_heap() { |
813 | |
814 if (UseParallelGC) { | |
815 #ifndef SERIALGC | |
816 Universe::_collectedHeap = new ParallelScavengeHeap(); | |
817 #else // SERIALGC | |
818 fatal("UseParallelGC not supported in java kernel vm."); | |
819 #endif // SERIALGC | |
820 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
821 } else if (UseG1GC) { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
822 #ifndef SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
823 G1CollectorPolicy* g1p = new G1CollectorPolicy_BestRegionsFirst(); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
824 G1CollectedHeap* g1h = new G1CollectedHeap(g1p); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
825 Universe::_collectedHeap = g1h; |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
826 #else // SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
827 fatal("UseG1GC not supported in java kernel vm."); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
828 #endif // SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
829 |
0 | 830 } else { |
831 GenCollectorPolicy *gc_policy; | |
832 | |
833 if (UseSerialGC) { | |
834 gc_policy = new MarkSweepPolicy(); | |
835 } else if (UseConcMarkSweepGC) { | |
836 #ifndef SERIALGC | |
837 if (UseAdaptiveSizePolicy) { | |
838 gc_policy = new ASConcurrentMarkSweepPolicy(); | |
839 } else { | |
840 gc_policy = new ConcurrentMarkSweepPolicy(); | |
841 } | |
842 #else // SERIALGC | |
843 fatal("UseConcMarkSweepGC not supported in java kernel vm."); | |
844 #endif // SERIALGC | |
845 } else { // default old generation | |
846 gc_policy = new MarkSweepPolicy(); | |
847 } | |
848 | |
849 Universe::_collectedHeap = new GenCollectedHeap(gc_policy); | |
850 } | |
851 | |
852 jint status = Universe::heap()->initialize(); | |
853 if (status != JNI_OK) { | |
854 return status; | |
855 } | |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
856 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
857 #ifdef _LP64 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
858 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
859 // Subtract a page because something can get allocated at heap base. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
860 // This also makes implicit null checking work, because the |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
861 // memory+1 page below heap_base needs to cause a signal. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
862 // See needs_explicit_null_check. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
863 // Only set the heap base for compressed oops because it indicates |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
864 // compressed oops for pstack code. |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
865 if (PrintCompressedOopsMode) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
866 tty->cr(); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
867 tty->print("heap address: "PTR_FORMAT, Universe::heap()->base()); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
868 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
869 if ((uint64_t)Universe::heap()->reserved_region().end() > OopEncodingHeapMax) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
870 // Can't reserve heap below 32Gb. |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
871 Universe::set_narrow_oop_base(Universe::heap()->base() - os::vm_page_size()); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
872 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
873 if (PrintCompressedOopsMode) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
874 tty->print(", Compressed Oops with base: "PTR_FORMAT, Universe::narrow_oop_base()); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
875 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
876 } else { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
877 Universe::set_narrow_oop_base(0); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
878 if (PrintCompressedOopsMode) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
879 tty->print(", zero based Compressed Oops"); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
880 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
881 #ifdef _WIN64 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
882 if (!Universe::narrow_oop_use_implicit_null_checks()) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
883 // Don't need guard page for implicit checks in indexed addressing |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
884 // mode with zero based Compressed Oops. |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
885 Universe::set_narrow_oop_use_implicit_null_checks(true); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
886 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
887 #endif // _WIN64 |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
888 if((uint64_t)Universe::heap()->reserved_region().end() > NarrowOopHeapMax) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
889 // Can't reserve heap below 4Gb. |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
890 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
891 } else { |
922
1a81ea4b45d4
6869822: assert(Universe::narrow_oop_shift() == 0,"use unscaled narrow oop")
kvn
parents:
845
diff
changeset
|
892 Universe::set_narrow_oop_shift(0); |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
893 if (PrintCompressedOopsMode) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
894 tty->print(", 32-bits Oops"); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
895 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
896 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
897 } |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
898 if (PrintCompressedOopsMode) { |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
899 tty->cr(); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
900 tty->cr(); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
901 } |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
902 } |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
903 assert(Universe::narrow_oop_base() == (Universe::heap()->base() - os::vm_page_size()) || |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
904 Universe::narrow_oop_base() == NULL, "invalid value"); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
905 assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes || |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
906 Universe::narrow_oop_shift() == 0, "invalid value"); |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
494
diff
changeset
|
907 #endif |
0 | 908 |
909 // We will never reach the CATCH below since Exceptions::_throw will cause | |
910 // the VM to exit if an exception is thrown during initialization | |
911 | |
912 if (UseTLAB) { | |
913 assert(Universe::heap()->supports_tlab_allocation(), | |
914 "Should support thread-local allocation buffers"); | |
915 ThreadLocalAllocBuffer::startup_initialization(); | |
916 } | |
917 return JNI_OK; | |
918 } | |
919 | |
920 // It's the caller's repsonsibility to ensure glitch-freedom | |
921 // (if required). | |
922 void Universe::update_heap_info_at_gc() { | |
923 _heap_capacity_at_last_gc = heap()->capacity(); | |
924 _heap_used_at_last_gc = heap()->used(); | |
925 } | |
926 | |
927 | |
928 | |
929 void universe2_init() { | |
930 EXCEPTION_MARK; | |
931 Universe::genesis(CATCH); | |
932 // Although we'd like to verify here that the state of the heap | |
933 // is good, we can't because the main thread has not yet added | |
934 // itself to the threads list (so, using current interfaces | |
935 // we can't "fill" its TLAB), unless TLABs are disabled. | |
936 if (VerifyBeforeGC && !UseTLAB && | |
937 Universe::heap()->total_collections() >= VerifyGCStartAt) { | |
938 Universe::heap()->prepare_for_verify(); | |
939 Universe::verify(); // make sure we're starting with a clean slate | |
940 } | |
941 } | |
942 | |
943 | |
944 // This function is defined in JVM.cpp | |
945 extern void initialize_converter_functions(); | |
946 | |
947 bool universe_post_init() { | |
948 Universe::_fully_initialized = true; | |
949 EXCEPTION_MARK; | |
950 { ResourceMark rm; | |
951 Interpreter::initialize(); // needed for interpreter entry points | |
952 if (!UseSharedSpaces) { | |
1142 | 953 KlassHandle ok_h(THREAD, SystemDictionary::Object_klass()); |
0 | 954 Universe::reinitialize_vtable_of(ok_h, CHECK_false); |
955 Universe::reinitialize_itables(CHECK_false); | |
956 } | |
957 } | |
958 | |
959 klassOop k; | |
960 instanceKlassHandle k_h; | |
961 if (!UseSharedSpaces) { | |
962 // Setup preallocated empty java.lang.Class array | |
1142 | 963 Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false); |
0 | 964 // Setup preallocated OutOfMemoryError errors |
965 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_OutOfMemoryError(), true, CHECK_false); | |
966 k_h = instanceKlassHandle(THREAD, k); | |
967 Universe::_out_of_memory_error_java_heap = k_h->allocate_permanent_instance(CHECK_false); | |
968 Universe::_out_of_memory_error_perm_gen = k_h->allocate_permanent_instance(CHECK_false); | |
969 Universe::_out_of_memory_error_array_size = k_h->allocate_permanent_instance(CHECK_false); | |
970 Universe::_out_of_memory_error_gc_overhead_limit = | |
971 k_h->allocate_permanent_instance(CHECK_false); | |
972 | |
973 // Setup preallocated NullPointerException | |
974 // (this is currently used for a cheap & dirty solution in compiler exception handling) | |
975 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_NullPointerException(), true, CHECK_false); | |
976 Universe::_null_ptr_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | |
977 // Setup preallocated ArithmeticException | |
978 // (this is currently used for a cheap & dirty solution in compiler exception handling) | |
979 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ArithmeticException(), true, CHECK_false); | |
980 Universe::_arithmetic_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | |
981 // Virtual Machine Error for when we get into a situation we can't resolve | |
982 k = SystemDictionary::resolve_or_fail( | |
983 vmSymbolHandles::java_lang_VirtualMachineError(), true, CHECK_false); | |
984 bool linked = instanceKlass::cast(k)->link_class_or_fail(CHECK_false); | |
985 if (!linked) { | |
986 tty->print_cr("Unable to link/verify VirtualMachineError class"); | |
987 return false; // initialization failed | |
988 } | |
989 Universe::_virtual_machine_error_instance = | |
990 instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false); | |
991 } | |
992 if (!DumpSharedSpaces) { | |
993 // These are the only Java fields that are currently set during shared space dumping. | |
994 // We prefer to not handle this generally, so we always reinitialize these detail messages. | |
995 Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false); | |
996 java_lang_Throwable::set_message(Universe::_out_of_memory_error_java_heap, msg()); | |
997 | |
998 msg = java_lang_String::create_from_str("PermGen space", CHECK_false); | |
999 java_lang_Throwable::set_message(Universe::_out_of_memory_error_perm_gen, msg()); | |
1000 | |
1001 msg = java_lang_String::create_from_str("Requested array size exceeds VM limit", CHECK_false); | |
1002 java_lang_Throwable::set_message(Universe::_out_of_memory_error_array_size, msg()); | |
1003 | |
1004 msg = java_lang_String::create_from_str("GC overhead limit exceeded", CHECK_false); | |
1005 java_lang_Throwable::set_message(Universe::_out_of_memory_error_gc_overhead_limit, msg()); | |
1006 | |
1007 msg = java_lang_String::create_from_str("/ by zero", CHECK_false); | |
1008 java_lang_Throwable::set_message(Universe::_arithmetic_exception_instance, msg()); | |
1009 | |
1010 // Setup the array of errors that have preallocated backtrace | |
1011 k = Universe::_out_of_memory_error_java_heap->klass(); | |
1012 assert(k->klass_part()->name() == vmSymbols::java_lang_OutOfMemoryError(), "should be out of memory error"); | |
1013 k_h = instanceKlassHandle(THREAD, k); | |
1014 | |
1015 int len = (StackTraceInThrowable) ? (int)PreallocatedOutOfMemoryErrorCount : 0; | |
1016 Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(k_h(), len, CHECK_false); | |
1017 for (int i=0; i<len; i++) { | |
1018 oop err = k_h->allocate_permanent_instance(CHECK_false); | |
1019 Handle err_h = Handle(THREAD, err); | |
1020 java_lang_Throwable::allocate_backtrace(err_h, CHECK_false); | |
1021 Universe::preallocated_out_of_memory_errors()->obj_at_put(i, err_h()); | |
1022 } | |
1023 Universe::_preallocated_out_of_memory_error_avail_count = (jint)len; | |
1024 } | |
1025 | |
1026 | |
1027 // Setup static method for registering finalizers | |
1028 // The finalizer klass must be linked before looking up the method, in | |
1029 // case it needs to get rewritten. | |
1142 | 1030 instanceKlass::cast(SystemDictionary::Finalizer_klass())->link_class(CHECK_false); |
1031 methodOop m = instanceKlass::cast(SystemDictionary::Finalizer_klass())->find_method( | |
0 | 1032 vmSymbols::register_method_name(), |
1033 vmSymbols::register_method_signature()); | |
1034 if (m == NULL || !m->is_static()) { | |
1035 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(), | |
1036 "java.lang.ref.Finalizer.register", false); | |
1037 } | |
1038 Universe::_finalizer_register_cache->init( | |
1142 | 1039 SystemDictionary::Finalizer_klass(), m, CHECK_false); |
0 | 1040 |
1041 // Resolve on first use and initialize class. | |
1042 // Note: No race-condition here, since a resolve will always return the same result | |
1043 | |
1044 // Setup method for security checks | |
1045 k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_reflect_Method(), true, CHECK_false); | |
1046 k_h = instanceKlassHandle(THREAD, k); | |
1047 k_h->link_class(CHECK_false); | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1142
diff
changeset
|
1048 m = k_h->find_method(vmSymbols::invoke_name(), vmSymbols::object_object_array_object_signature()); |
0 | 1049 if (m == NULL || m->is_static()) { |
1050 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(), | |
1051 "java.lang.reflect.Method.invoke", false); | |
1052 } | |
1053 Universe::_reflect_invoke_cache->init(k_h(), m, CHECK_false); | |
1054 | |
1055 // Setup method for registering loaded classes in class loader vector | |
1142 | 1056 instanceKlass::cast(SystemDictionary::ClassLoader_klass())->link_class(CHECK_false); |
1057 m = instanceKlass::cast(SystemDictionary::ClassLoader_klass())->find_method(vmSymbols::addClass_name(), vmSymbols::class_void_signature()); | |
0 | 1058 if (m == NULL || m->is_static()) { |
1059 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodException(), | |
1060 "java.lang.ClassLoader.addClass", false); | |
1061 } | |
1062 Universe::_loader_addClass_cache->init( | |
1142 | 1063 SystemDictionary::ClassLoader_klass(), m, CHECK_false); |
0 | 1064 |
1065 // The folowing is initializing converter functions for serialization in | |
1066 // JVM.cpp. If we clean up the StrictMath code above we may want to find | |
1067 // a better solution for this as well. | |
1068 initialize_converter_functions(); | |
1069 | |
1070 // This needs to be done before the first scavenge/gc, since | |
1071 // it's an input to soft ref clearing policy. | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1072 { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1073 MutexLocker x(Heap_lock); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1074 Universe::update_heap_info_at_gc(); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1075 } |
0 | 1076 |
1077 // ("weak") refs processing infrastructure initialization | |
1078 Universe::heap()->post_initialize(); | |
1079 | |
1080 GC_locker::unlock(); // allow gc after bootstrapping | |
1081 | |
1082 MemoryService::set_universe_heap(Universe::_collectedHeap); | |
1083 return true; | |
1084 } | |
1085 | |
1086 | |
1087 void Universe::compute_base_vtable_size() { | |
1088 _base_vtable_size = ClassLoader::compute_Object_vtable(); | |
1089 } | |
1090 | |
1091 | |
1092 // %%% The Universe::flush_foo methods belong in CodeCache. | |
1093 | |
1094 // Flushes compiled methods dependent on dependee. | |
1095 void Universe::flush_dependents_on(instanceKlassHandle dependee) { | |
1096 assert_lock_strong(Compile_lock); | |
1097 | |
1098 if (CodeCache::number_of_nmethods_with_dependencies() == 0) return; | |
1099 | |
1100 // CodeCache can only be updated by a thread_in_VM and they will all be | |
1101 // stopped dring the safepoint so CodeCache will be safe to update without | |
1102 // holding the CodeCache_lock. | |
1103 | |
1104 DepChange changes(dependee); | |
1105 | |
1106 // Compute the dependent nmethods | |
1107 if (CodeCache::mark_for_deoptimization(changes) > 0) { | |
1108 // At least one nmethod has been marked for deoptimization | |
1109 VM_Deoptimize op; | |
1110 VMThread::execute(&op); | |
1111 } | |
1112 } | |
1113 | |
1114 #ifdef HOTSWAP | |
1115 // Flushes compiled methods dependent on dependee in the evolutionary sense | |
1116 void Universe::flush_evol_dependents_on(instanceKlassHandle ev_k_h) { | |
1117 // --- Compile_lock is not held. However we are at a safepoint. | |
1118 assert_locked_or_safepoint(Compile_lock); | |
1119 if (CodeCache::number_of_nmethods_with_dependencies() == 0) return; | |
1120 | |
1121 // CodeCache can only be updated by a thread_in_VM and they will all be | |
1122 // stopped dring the safepoint so CodeCache will be safe to update without | |
1123 // holding the CodeCache_lock. | |
1124 | |
1125 // Compute the dependent nmethods | |
1126 if (CodeCache::mark_for_evol_deoptimization(ev_k_h) > 0) { | |
1127 // At least one nmethod has been marked for deoptimization | |
1128 | |
1129 // All this already happens inside a VM_Operation, so we'll do all the work here. | |
1130 // Stuff copied from VM_Deoptimize and modified slightly. | |
1131 | |
1132 // We do not want any GCs to happen while we are in the middle of this VM operation | |
1133 ResourceMark rm; | |
1134 DeoptimizationMarker dm; | |
1135 | |
1136 // Deoptimize all activations depending on marked nmethods | |
1137 Deoptimization::deoptimize_dependents(); | |
1138 | |
1139 // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies) | |
1140 CodeCache::make_marked_nmethods_not_entrant(); | |
1141 } | |
1142 } | |
1143 #endif // HOTSWAP | |
1144 | |
1145 | |
1146 // Flushes compiled methods dependent on dependee | |
1147 void Universe::flush_dependents_on_method(methodHandle m_h) { | |
1148 // --- Compile_lock is not held. However we are at a safepoint. | |
1149 assert_locked_or_safepoint(Compile_lock); | |
1150 | |
1151 // CodeCache can only be updated by a thread_in_VM and they will all be | |
1152 // stopped dring the safepoint so CodeCache will be safe to update without | |
1153 // holding the CodeCache_lock. | |
1154 | |
1155 // Compute the dependent nmethods | |
1156 if (CodeCache::mark_for_deoptimization(m_h()) > 0) { | |
1157 // At least one nmethod has been marked for deoptimization | |
1158 | |
1159 // All this already happens inside a VM_Operation, so we'll do all the work here. | |
1160 // Stuff copied from VM_Deoptimize and modified slightly. | |
1161 | |
1162 // We do not want any GCs to happen while we are in the middle of this VM operation | |
1163 ResourceMark rm; | |
1164 DeoptimizationMarker dm; | |
1165 | |
1166 // Deoptimize all activations depending on marked nmethods | |
1167 Deoptimization::deoptimize_dependents(); | |
1168 | |
1169 // Make the dependent methods not entrant (in VM_Deoptimize they are made zombies) | |
1170 CodeCache::make_marked_nmethods_not_entrant(); | |
1171 } | |
1172 } | |
1173 | |
1174 void Universe::print() { print_on(gclog_or_tty); } | |
1175 | |
1176 void Universe::print_on(outputStream* st) { | |
1177 st->print_cr("Heap"); | |
1178 heap()->print_on(st); | |
1179 } | |
1180 | |
1181 void Universe::print_heap_at_SIGBREAK() { | |
1182 if (PrintHeapAtSIGBREAK) { | |
1183 MutexLocker hl(Heap_lock); | |
1184 print_on(tty); | |
1185 tty->cr(); | |
1186 tty->flush(); | |
1187 } | |
1188 } | |
1189 | |
1190 void Universe::print_heap_before_gc(outputStream* st) { | |
1191 st->print_cr("{Heap before GC invocations=%u (full %u):", | |
1192 heap()->total_collections(), | |
1193 heap()->total_full_collections()); | |
1194 heap()->print_on(st); | |
1195 } | |
1196 | |
1197 void Universe::print_heap_after_gc(outputStream* st) { | |
1198 st->print_cr("Heap after GC invocations=%u (full %u):", | |
1199 heap()->total_collections(), | |
1200 heap()->total_full_collections()); | |
1201 heap()->print_on(st); | |
1202 st->print_cr("}"); | |
1203 } | |
1204 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
647
diff
changeset
|
1205 void Universe::verify(bool allow_dirty, bool silent, bool option) { |
0 | 1206 if (SharedSkipVerify) { |
1207 return; | |
1208 } | |
1209 | |
1210 // The use of _verify_in_progress is a temporary work around for | |
1211 // 6320749. Don't bother with a creating a class to set and clear | |
1212 // it since it is only used in this method and the control flow is | |
1213 // straight forward. | |
1214 _verify_in_progress = true; | |
1215 | |
1216 COMPILER2_PRESENT( | |
1217 assert(!DerivedPointerTable::is_active(), | |
1218 "DPT should not be active during verification " | |
1219 "(of thread stacks below)"); | |
1220 ) | |
1221 | |
1222 ResourceMark rm; | |
1223 HandleMark hm; // Handles created during verification can be zapped | |
1224 _verify_count++; | |
1225 | |
1226 if (!silent) gclog_or_tty->print("[Verifying "); | |
1227 if (!silent) gclog_or_tty->print("threads "); | |
1228 Threads::verify(); | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
647
diff
changeset
|
1229 heap()->verify(allow_dirty, silent, option); |
0 | 1230 |
1231 if (!silent) gclog_or_tty->print("syms "); | |
1232 SymbolTable::verify(); | |
1233 if (!silent) gclog_or_tty->print("strs "); | |
1234 StringTable::verify(); | |
1235 { | |
1236 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); | |
1237 if (!silent) gclog_or_tty->print("zone "); | |
1238 CodeCache::verify(); | |
1239 } | |
1240 if (!silent) gclog_or_tty->print("dict "); | |
1241 SystemDictionary::verify(); | |
1242 if (!silent) gclog_or_tty->print("hand "); | |
1243 JNIHandles::verify(); | |
1244 if (!silent) gclog_or_tty->print("C-heap "); | |
1245 os::check_heap(); | |
1246 if (!silent) gclog_or_tty->print_cr("]"); | |
1247 | |
1248 _verify_in_progress = false; | |
1249 } | |
1250 | |
1251 // Oop verification (see MacroAssembler::verify_oop) | |
1252 | |
1253 static uintptr_t _verify_oop_data[2] = {0, (uintptr_t)-1}; | |
1254 static uintptr_t _verify_klass_data[2] = {0, (uintptr_t)-1}; | |
1255 | |
1256 | |
1257 static void calculate_verify_data(uintptr_t verify_data[2], | |
1258 HeapWord* low_boundary, | |
1259 HeapWord* high_boundary) { | |
1260 assert(low_boundary < high_boundary, "bad interval"); | |
1261 | |
1262 // decide which low-order bits we require to be clear: | |
1263 size_t alignSize = MinObjAlignmentInBytes; | |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1507
diff
changeset
|
1264 size_t min_object_size = CollectedHeap::min_fill_size(); |
0 | 1265 |
1266 // make an inclusive limit: | |
1267 uintptr_t max = (uintptr_t)high_boundary - min_object_size*wordSize; | |
1268 uintptr_t min = (uintptr_t)low_boundary; | |
1269 assert(min < max, "bad interval"); | |
1270 uintptr_t diff = max ^ min; | |
1271 | |
1272 // throw away enough low-order bits to make the diff vanish | |
1273 uintptr_t mask = (uintptr_t)(-1); | |
1274 while ((mask & diff) != 0) | |
1275 mask <<= 1; | |
1276 uintptr_t bits = (min & mask); | |
1277 assert(bits == (max & mask), "correct mask"); | |
1278 // check an intermediate value between min and max, just to make sure: | |
1279 assert(bits == ((min + (max-min)/2) & mask), "correct mask"); | |
1280 | |
1281 // require address alignment, too: | |
1282 mask |= (alignSize - 1); | |
1283 | |
1284 if (!(verify_data[0] == 0 && verify_data[1] == (uintptr_t)-1)) { | |
1285 assert(verify_data[0] == mask && verify_data[1] == bits, "mask stability"); | |
1286 } | |
1287 verify_data[0] = mask; | |
1288 verify_data[1] = bits; | |
1289 } | |
1290 | |
1291 | |
1292 // Oop verification (see MacroAssembler::verify_oop) | |
1293 #ifndef PRODUCT | |
1294 | |
1295 uintptr_t Universe::verify_oop_mask() { | |
1296 MemRegion m = heap()->reserved_region(); | |
1297 calculate_verify_data(_verify_oop_data, | |
1298 m.start(), | |
1299 m.end()); | |
1300 return _verify_oop_data[0]; | |
1301 } | |
1302 | |
1303 | |
1304 | |
1305 uintptr_t Universe::verify_oop_bits() { | |
1306 verify_oop_mask(); | |
1307 return _verify_oop_data[1]; | |
1308 } | |
1309 | |
1310 | |
1311 uintptr_t Universe::verify_klass_mask() { | |
1312 /* $$$ | |
1313 // A klass can never live in the new space. Since the new and old | |
1314 // spaces can change size, we must settle for bounds-checking against | |
1315 // the bottom of the world, plus the smallest possible new and old | |
1316 // space sizes that may arise during execution. | |
1317 size_t min_new_size = Universe::new_size(); // in bytes | |
1318 size_t min_old_size = Universe::old_size(); // in bytes | |
1319 calculate_verify_data(_verify_klass_data, | |
1320 (HeapWord*)((uintptr_t)_new_gen->low_boundary + min_new_size + min_old_size), | |
1321 _perm_gen->high_boundary); | |
1322 */ | |
1323 // Why doesn't the above just say that klass's always live in the perm | |
1324 // gen? I'll see if that seems to work... | |
1325 MemRegion permanent_reserved; | |
1326 switch (Universe::heap()->kind()) { | |
1327 default: | |
1328 // ???: What if a CollectedHeap doesn't have a permanent generation? | |
1329 ShouldNotReachHere(); | |
1330 break; | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1331 case CollectedHeap::GenCollectedHeap: |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1332 case CollectedHeap::G1CollectedHeap: { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1333 SharedHeap* sh = (SharedHeap*) Universe::heap(); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1334 permanent_reserved = sh->perm_gen()->reserved(); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
1335 break; |
0 | 1336 } |
1337 #ifndef SERIALGC | |
1338 case CollectedHeap::ParallelScavengeHeap: { | |
1339 ParallelScavengeHeap* psh = (ParallelScavengeHeap*) Universe::heap(); | |
1340 permanent_reserved = psh->perm_gen()->reserved(); | |
1341 break; | |
1342 } | |
1343 #endif // SERIALGC | |
1344 } | |
1345 calculate_verify_data(_verify_klass_data, | |
1346 permanent_reserved.start(), | |
1347 permanent_reserved.end()); | |
1348 | |
1349 return _verify_klass_data[0]; | |
1350 } | |
1351 | |
1352 | |
1353 | |
1354 uintptr_t Universe::verify_klass_bits() { | |
1355 verify_klass_mask(); | |
1356 return _verify_klass_data[1]; | |
1357 } | |
1358 | |
1359 | |
1360 uintptr_t Universe::verify_mark_mask() { | |
1361 return markOopDesc::lock_mask_in_place; | |
1362 } | |
1363 | |
1364 | |
1365 | |
1366 uintptr_t Universe::verify_mark_bits() { | |
1367 intptr_t mask = verify_mark_mask(); | |
1368 intptr_t bits = (intptr_t)markOopDesc::prototype(); | |
1369 assert((bits & ~mask) == 0, "no stray header bits"); | |
1370 return bits; | |
1371 } | |
1372 #endif // PRODUCT | |
1373 | |
1374 | |
1375 void Universe::compute_verify_oop_data() { | |
1376 verify_oop_mask(); | |
1377 verify_oop_bits(); | |
1378 verify_mark_mask(); | |
1379 verify_mark_bits(); | |
1380 verify_klass_mask(); | |
1381 verify_klass_bits(); | |
1382 } | |
1383 | |
1384 | |
1385 void CommonMethodOopCache::init(klassOop k, methodOop m, TRAPS) { | |
1386 if (!UseSharedSpaces) { | |
1387 _klass = k; | |
1388 } | |
1389 #ifndef PRODUCT | |
1390 else { | |
1391 // sharing initilization should have already set up _klass | |
1392 assert(_klass != NULL, "just checking"); | |
1393 } | |
1394 #endif | |
1395 | |
1396 _method_idnum = m->method_idnum(); | |
1397 assert(_method_idnum >= 0, "sanity check"); | |
1398 } | |
1399 | |
1400 | |
1401 ActiveMethodOopsCache::~ActiveMethodOopsCache() { | |
1402 if (_prev_methods != NULL) { | |
1403 for (int i = _prev_methods->length() - 1; i >= 0; i--) { | |
1404 jweak method_ref = _prev_methods->at(i); | |
1405 if (method_ref != NULL) { | |
1406 JNIHandles::destroy_weak_global(method_ref); | |
1407 } | |
1408 } | |
1409 delete _prev_methods; | |
1410 _prev_methods = NULL; | |
1411 } | |
1412 } | |
1413 | |
1414 | |
1415 void ActiveMethodOopsCache::add_previous_version(const methodOop method) { | |
1416 assert(Thread::current()->is_VM_thread(), | |
1417 "only VMThread can add previous versions"); | |
1418 | |
1419 if (_prev_methods == NULL) { | |
1420 // This is the first previous version so make some space. | |
1421 // Start with 2 elements under the assumption that the class | |
1422 // won't be redefined much. | |
1423 _prev_methods = new (ResourceObj::C_HEAP) GrowableArray<jweak>(2, true); | |
1424 } | |
1425 | |
1426 // RC_TRACE macro has an embedded ResourceMark | |
1427 RC_TRACE(0x00000100, | |
1428 ("add: %s(%s): adding prev version ref for cached method @%d", | |
1429 method->name()->as_C_string(), method->signature()->as_C_string(), | |
1430 _prev_methods->length())); | |
1431 | |
1432 methodHandle method_h(method); | |
1433 jweak method_ref = JNIHandles::make_weak_global(method_h); | |
1434 _prev_methods->append(method_ref); | |
1435 | |
1436 // Using weak references allows previous versions of the cached | |
1437 // method to be GC'ed when they are no longer needed. Since the | |
1438 // caller is the VMThread and we are at a safepoint, this is a good | |
1439 // time to clear out unused weak references. | |
1440 | |
1441 for (int i = _prev_methods->length() - 1; i >= 0; i--) { | |
1442 jweak method_ref = _prev_methods->at(i); | |
1443 assert(method_ref != NULL, "weak method ref was unexpectedly cleared"); | |
1444 if (method_ref == NULL) { | |
1445 _prev_methods->remove_at(i); | |
1446 // Since we are traversing the array backwards, we don't have to | |
1447 // do anything special with the index. | |
1448 continue; // robustness | |
1449 } | |
1450 | |
1451 methodOop m = (methodOop)JNIHandles::resolve(method_ref); | |
1452 if (m == NULL) { | |
1453 // this method entry has been GC'ed so remove it | |
1454 JNIHandles::destroy_weak_global(method_ref); | |
1455 _prev_methods->remove_at(i); | |
1456 } else { | |
1457 // RC_TRACE macro has an embedded ResourceMark | |
1458 RC_TRACE(0x00000400, ("add: %s(%s): previous cached method @%d is alive", | |
1459 m->name()->as_C_string(), m->signature()->as_C_string(), i)); | |
1460 } | |
1461 } | |
1462 } // end add_previous_version() | |
1463 | |
1464 | |
1465 bool ActiveMethodOopsCache::is_same_method(const methodOop method) const { | |
1466 instanceKlass* ik = instanceKlass::cast(klass()); | |
1467 methodOop check_method = ik->method_with_idnum(method_idnum()); | |
1468 assert(check_method != NULL, "sanity check"); | |
1469 if (check_method == method) { | |
1470 // done with the easy case | |
1471 return true; | |
1472 } | |
1473 | |
1474 if (_prev_methods != NULL) { | |
1475 // The cached method has been redefined at least once so search | |
1476 // the previous versions for a match. | |
1477 for (int i = 0; i < _prev_methods->length(); i++) { | |
1478 jweak method_ref = _prev_methods->at(i); | |
1479 assert(method_ref != NULL, "weak method ref was unexpectedly cleared"); | |
1480 if (method_ref == NULL) { | |
1481 continue; // robustness | |
1482 } | |
1483 | |
1484 check_method = (methodOop)JNIHandles::resolve(method_ref); | |
1485 if (check_method == method) { | |
1486 // a previous version matches | |
1487 return true; | |
1488 } | |
1489 } | |
1490 } | |
1491 | |
1492 // either no previous versions or no previous version matched | |
1493 return false; | |
1494 } | |
1495 | |
1496 | |
1497 methodOop LatestMethodOopCache::get_methodOop() { | |
1498 instanceKlass* ik = instanceKlass::cast(klass()); | |
1499 methodOop m = ik->method_with_idnum(method_idnum()); | |
1500 assert(m != NULL, "sanity check"); | |
1501 return m; | |
1502 } | |
1503 | |
1504 | |
1505 #ifdef ASSERT | |
1506 // Release dummy object(s) at bottom of heap | |
1507 bool Universe::release_fullgc_alot_dummy() { | |
1508 MutexLocker ml(FullGCALot_lock); | |
1509 if (_fullgc_alot_dummy_array != NULL) { | |
1510 if (_fullgc_alot_dummy_next >= _fullgc_alot_dummy_array->length()) { | |
1511 // No more dummies to release, release entire array instead | |
1512 _fullgc_alot_dummy_array = NULL; | |
1513 return false; | |
1514 } | |
1515 if (!UseConcMarkSweepGC) { | |
1516 // Release dummy at bottom of old generation | |
1517 _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL); | |
1518 } | |
1519 // Release dummy at bottom of permanent generation | |
1520 _fullgc_alot_dummy_array->obj_at_put(_fullgc_alot_dummy_next++, NULL); | |
1521 } | |
1522 return true; | |
1523 } | |
1524 | |
1525 #endif // ASSERT |