1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/share/vm/memory/universe.hpp Sat Dec 01 00:00:00 2007 +0000 1.3 @@ -0,0 +1,419 @@ 1.4 +/* 1.5 + * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. 1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 + * 1.8 + * This code is free software; you can redistribute it and/or modify it 1.9 + * under the terms of the GNU General Public License version 2 only, as 1.10 + * published by the Free Software Foundation. 1.11 + * 1.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 1.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.15 + * version 2 for more details (a copy is included in the LICENSE file that 1.16 + * accompanied this code). 1.17 + * 1.18 + * You should have received a copy of the GNU General Public License version 1.19 + * 2 along with this work; if not, write to the Free Software Foundation, 1.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.21 + * 1.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 1.23 + * CA 95054 USA or visit www.sun.com if you need additional information or 1.24 + * have any questions. 1.25 + * 1.26 + */ 1.27 + 1.28 +// Universe is a name space holding known system classes and objects in the VM. 1.29 +// 1.30 +// Loaded classes are accessible through the SystemDictionary. 1.31 +// 1.32 +// The object heap is allocated and accessed through Universe, and various allocation 1.33 +// support is provided. Allocation by the interpreter and compiled code is done inline 1.34 +// and bails out to Scavenge::invoke_and_allocate. 1.35 + 1.36 +class CollectedHeap; 1.37 +class DeferredObjAllocEvent; 1.38 + 1.39 + 1.40 +// Common parts of a methodOop cache. This cache safely interacts with 1.41 +// the RedefineClasses API. 1.42 +// 1.43 +class CommonMethodOopCache : public CHeapObj { 1.44 + // We save the klassOop and the idnum of methodOop in order to get 1.45 + // the current cached methodOop. 1.46 + private: 1.47 + klassOop _klass; 1.48 + int _method_idnum; 1.49 + 1.50 + public: 1.51 + CommonMethodOopCache() { _klass = NULL; _method_idnum = -1; } 1.52 + ~CommonMethodOopCache() { _klass = NULL; _method_idnum = -1; } 1.53 + 1.54 + void init(klassOop k, methodOop m, TRAPS); 1.55 + klassOop klass() const { return _klass; } 1.56 + int method_idnum() const { return _method_idnum; } 1.57 + 1.58 + // GC support 1.59 + void oops_do(OopClosure* f) { f->do_oop((oop*)&_klass); } 1.60 +}; 1.61 + 1.62 + 1.63 +// A helper class for caching a methodOop when the user of the cache 1.64 +// cares about all versions of the methodOop. 1.65 +// 1.66 +class ActiveMethodOopsCache : public CommonMethodOopCache { 1.67 + // This subclass adds weak references to older versions of the 1.68 + // methodOop and a query method for a methodOop. 1.69 + 1.70 + private: 1.71 + // If the cached methodOop has not been redefined, then 1.72 + // _prev_methods will be NULL. If all of the previous 1.73 + // versions of the method have been collected, then 1.74 + // _prev_methods can have a length of zero. 1.75 + GrowableArray<jweak>* _prev_methods; 1.76 + 1.77 + public: 1.78 + ActiveMethodOopsCache() { _prev_methods = NULL; } 1.79 + ~ActiveMethodOopsCache(); 1.80 + 1.81 + void add_previous_version(const methodOop method); 1.82 + bool is_same_method(const methodOop method) const; 1.83 +}; 1.84 + 1.85 + 1.86 +// A helper class for caching a methodOop when the user of the cache 1.87 +// only cares about the latest version of the methodOop. 1.88 +// 1.89 +class LatestMethodOopCache : public CommonMethodOopCache { 1.90 + // This subclass adds a getter method for the latest methodOop. 1.91 + 1.92 + public: 1.93 + methodOop get_methodOop(); 1.94 +}; 1.95 + 1.96 + 1.97 +class Universe: AllStatic { 1.98 + friend class MarkSweep; 1.99 + friend class oopDesc; 1.100 + friend class ClassLoader; 1.101 + friend class Arguments; 1.102 + friend class SystemDictionary; 1.103 + friend class VMStructs; 1.104 + friend class CompactingPermGenGen; 1.105 + friend class VM_PopulateDumpSharedSpace; 1.106 + 1.107 + friend jint universe_init(); 1.108 + friend void universe2_init(); 1.109 + friend bool universe_post_init(); 1.110 + 1.111 + private: 1.112 + // Known classes in the VM 1.113 + static klassOop _boolArrayKlassObj; 1.114 + static klassOop _byteArrayKlassObj; 1.115 + static klassOop _charArrayKlassObj; 1.116 + static klassOop _intArrayKlassObj; 1.117 + static klassOop _shortArrayKlassObj; 1.118 + static klassOop _longArrayKlassObj; 1.119 + static klassOop _singleArrayKlassObj; 1.120 + static klassOop _doubleArrayKlassObj; 1.121 + static klassOop _typeArrayKlassObjs[T_VOID+1]; 1.122 + 1.123 + static klassOop _objectArrayKlassObj; 1.124 + 1.125 + static klassOop _symbolKlassObj; 1.126 + static klassOop _methodKlassObj; 1.127 + static klassOop _constMethodKlassObj; 1.128 + static klassOop _methodDataKlassObj; 1.129 + static klassOop _klassKlassObj; 1.130 + static klassOop _arrayKlassKlassObj; 1.131 + static klassOop _objArrayKlassKlassObj; 1.132 + static klassOop _typeArrayKlassKlassObj; 1.133 + static klassOop _instanceKlassKlassObj; 1.134 + static klassOop _constantPoolKlassObj; 1.135 + static klassOop _constantPoolCacheKlassObj; 1.136 + static klassOop _compiledICHolderKlassObj; 1.137 + static klassOop _systemObjArrayKlassObj; 1.138 + 1.139 + // Known objects in the VM 1.140 + 1.141 + // Primitive objects 1.142 + static oop _int_mirror; 1.143 + static oop _float_mirror; 1.144 + static oop _double_mirror; 1.145 + static oop _byte_mirror; 1.146 + static oop _bool_mirror; 1.147 + static oop _char_mirror; 1.148 + static oop _long_mirror; 1.149 + static oop _short_mirror; 1.150 + static oop _void_mirror; 1.151 + 1.152 + static oop _main_thread_group; // Reference to the main thread group object 1.153 + static oop _system_thread_group; // Reference to the system thread group object 1.154 + 1.155 + static typeArrayOop _the_empty_byte_array; // Canonicalized byte array 1.156 + static typeArrayOop _the_empty_short_array; // Canonicalized short array 1.157 + static typeArrayOop _the_empty_int_array; // Canonicalized int array 1.158 + static objArrayOop _the_empty_system_obj_array; // Canonicalized system obj array 1.159 + static objArrayOop _the_empty_class_klass_array; // Canonicalized obj array of type java.lang.Class 1.160 + static objArrayOop _the_array_interfaces_array; // Canonicalized 2-array of cloneable & serializable klasses 1.161 + static LatestMethodOopCache* _finalizer_register_cache; // static method for registering finalizable objects 1.162 + static LatestMethodOopCache* _loader_addClass_cache; // method for registering loaded classes in class loader vector 1.163 + static ActiveMethodOopsCache* _reflect_invoke_cache; // method for security checks 1.164 + static oop _out_of_memory_error_java_heap; // preallocated error object (no backtrace) 1.165 + static oop _out_of_memory_error_perm_gen; // preallocated error object (no backtrace) 1.166 + static oop _out_of_memory_error_array_size;// preallocated error object (no backtrace) 1.167 + static oop _out_of_memory_error_gc_overhead_limit; // preallocated error object (no backtrace) 1.168 + 1.169 + // array of preallocated error objects with backtrace 1.170 + static objArrayOop _preallocated_out_of_memory_error_array; 1.171 + 1.172 + // number of preallocated error objects available for use 1.173 + static volatile jint _preallocated_out_of_memory_error_avail_count; 1.174 + 1.175 + static oop _null_ptr_exception_instance; // preallocated exception object 1.176 + static oop _arithmetic_exception_instance; // preallocated exception object 1.177 + static oop _virtual_machine_error_instance; // preallocated exception object 1.178 + // The object used as an exception dummy when exceptions are thrown for 1.179 + // the vm thread. 1.180 + static oop _vm_exception; 1.181 + 1.182 + static oop _emptySymbol; // Canonical empty string ("") symbol 1.183 + 1.184 + // The particular choice of collected heap. 1.185 + static CollectedHeap* _collectedHeap; 1.186 + 1.187 + // array of dummy objects used with +FullGCAlot 1.188 + debug_only(static objArrayOop _fullgc_alot_dummy_array;) 1.189 + // index of next entry to clear 1.190 + debug_only(static int _fullgc_alot_dummy_next;) 1.191 + 1.192 + // Compiler/dispatch support 1.193 + static int _base_vtable_size; // Java vtbl size of klass Object (in words) 1.194 + 1.195 + // Initialization 1.196 + static bool _bootstrapping; // true during genesis 1.197 + static bool _fully_initialized; // true after universe_init and initialize_vtables called 1.198 + 1.199 + // the array of preallocated errors with backtraces 1.200 + static objArrayOop preallocated_out_of_memory_errors() { return _preallocated_out_of_memory_error_array; } 1.201 + 1.202 + // generate an out of memory error; if possible using an error with preallocated backtrace; 1.203 + // otherwise return the given default error. 1.204 + static oop gen_out_of_memory_error(oop default_err); 1.205 + 1.206 + // Historic gc information 1.207 + static size_t _heap_capacity_at_last_gc; 1.208 + static size_t _heap_used_at_last_gc; 1.209 + 1.210 + static jint initialize_heap(); 1.211 + static void initialize_basic_type_mirrors(TRAPS); 1.212 + static void fixup_mirrors(TRAPS); 1.213 + 1.214 + static void reinitialize_vtable_of(KlassHandle h_k, TRAPS); 1.215 + static void reinitialize_itables(TRAPS); 1.216 + static void compute_base_vtable_size(); // compute vtable size of class Object 1.217 + 1.218 + static void genesis(TRAPS); // Create the initial world 1.219 + 1.220 + // Mirrors for primitive classes (created eagerly) 1.221 + static oop check_mirror(oop m) { 1.222 + assert(m != NULL, "mirror not initialized"); 1.223 + return m; 1.224 + } 1.225 + 1.226 + // Debugging 1.227 + static int _verify_count; // number of verifies done 1.228 + // True during call to verify(). Should only be set/cleared in verify(). 1.229 + static bool _verify_in_progress; 1.230 + 1.231 + static void compute_verify_oop_data(); 1.232 + 1.233 + public: 1.234 + // Known classes in the VM 1.235 + static klassOop boolArrayKlassObj() { return _boolArrayKlassObj; } 1.236 + static klassOop byteArrayKlassObj() { return _byteArrayKlassObj; } 1.237 + static klassOop charArrayKlassObj() { return _charArrayKlassObj; } 1.238 + static klassOop intArrayKlassObj() { return _intArrayKlassObj; } 1.239 + static klassOop shortArrayKlassObj() { return _shortArrayKlassObj; } 1.240 + static klassOop longArrayKlassObj() { return _longArrayKlassObj; } 1.241 + static klassOop singleArrayKlassObj() { return _singleArrayKlassObj; } 1.242 + static klassOop doubleArrayKlassObj() { return _doubleArrayKlassObj; } 1.243 + 1.244 + static klassOop objectArrayKlassObj() { 1.245 + return _objectArrayKlassObj; 1.246 + } 1.247 + 1.248 + static klassOop typeArrayKlassObj(BasicType t) { 1.249 + assert((uint)t < T_VOID+1, "range check"); 1.250 + assert(_typeArrayKlassObjs[t] != NULL, "domain check"); 1.251 + return _typeArrayKlassObjs[t]; 1.252 + } 1.253 + 1.254 + static klassOop symbolKlassObj() { return _symbolKlassObj; } 1.255 + static klassOop methodKlassObj() { return _methodKlassObj; } 1.256 + static klassOop constMethodKlassObj() { return _constMethodKlassObj; } 1.257 + static klassOop methodDataKlassObj() { return _methodDataKlassObj; } 1.258 + static klassOop klassKlassObj() { return _klassKlassObj; } 1.259 + static klassOop arrayKlassKlassObj() { return _arrayKlassKlassObj; } 1.260 + static klassOop objArrayKlassKlassObj() { return _objArrayKlassKlassObj; } 1.261 + static klassOop typeArrayKlassKlassObj() { return _typeArrayKlassKlassObj; } 1.262 + static klassOop instanceKlassKlassObj() { return _instanceKlassKlassObj; } 1.263 + static klassOop constantPoolKlassObj() { return _constantPoolKlassObj; } 1.264 + static klassOop constantPoolCacheKlassObj() { return _constantPoolCacheKlassObj; } 1.265 + static klassOop compiledICHolderKlassObj() { return _compiledICHolderKlassObj; } 1.266 + static klassOop systemObjArrayKlassObj() { return _systemObjArrayKlassObj; } 1.267 + 1.268 + // Known objects in tbe VM 1.269 + static oop int_mirror() { return check_mirror(_int_mirror); 1.270 +} 1.271 + static oop float_mirror() { return check_mirror(_float_mirror); } 1.272 + static oop double_mirror() { return check_mirror(_double_mirror); } 1.273 + static oop byte_mirror() { return check_mirror(_byte_mirror); } 1.274 + static oop bool_mirror() { return check_mirror(_bool_mirror); } 1.275 + static oop char_mirror() { return check_mirror(_char_mirror); } 1.276 + static oop long_mirror() { return check_mirror(_long_mirror); } 1.277 + static oop short_mirror() { return check_mirror(_short_mirror); } 1.278 + static oop void_mirror() { return check_mirror(_void_mirror); } 1.279 + 1.280 + // table of same 1.281 + static oop _mirrors[T_VOID+1]; 1.282 + 1.283 + static oop java_mirror(BasicType t) { 1.284 + assert((uint)t < T_VOID+1, "range check"); 1.285 + return check_mirror(_mirrors[t]); 1.286 + } 1.287 + static oop main_thread_group() { return _main_thread_group; } 1.288 + static void set_main_thread_group(oop group) { _main_thread_group = group;} 1.289 + 1.290 + static oop system_thread_group() { return _system_thread_group; } 1.291 + static void set_system_thread_group(oop group) { _system_thread_group = group;} 1.292 + 1.293 + static typeArrayOop the_empty_byte_array() { return _the_empty_byte_array; } 1.294 + static typeArrayOop the_empty_short_array() { return _the_empty_short_array; } 1.295 + static typeArrayOop the_empty_int_array() { return _the_empty_int_array; } 1.296 + static objArrayOop the_empty_system_obj_array () { return _the_empty_system_obj_array; } 1.297 + static objArrayOop the_empty_class_klass_array () { return _the_empty_class_klass_array; } 1.298 + static objArrayOop the_array_interfaces_array() { return _the_array_interfaces_array; } 1.299 + static methodOop finalizer_register_method() { return _finalizer_register_cache->get_methodOop(); } 1.300 + static methodOop loader_addClass_method() { return _loader_addClass_cache->get_methodOop(); } 1.301 + static ActiveMethodOopsCache* reflect_invoke_cache() { return _reflect_invoke_cache; } 1.302 + static oop null_ptr_exception_instance() { return _null_ptr_exception_instance; } 1.303 + static oop arithmetic_exception_instance() { return _arithmetic_exception_instance; } 1.304 + static oop virtual_machine_error_instance() { return _virtual_machine_error_instance; } 1.305 + static oop vm_exception() { return _vm_exception; } 1.306 + static oop emptySymbol() { return _emptySymbol; } 1.307 + 1.308 + // OutOfMemoryError support. Returns an error with the required message. The returned error 1.309 + // may or may not have a backtrace. If error has a backtrace then the stack trace is already 1.310 + // filled in. 1.311 + static oop out_of_memory_error_java_heap() { return gen_out_of_memory_error(_out_of_memory_error_java_heap); } 1.312 + static oop out_of_memory_error_perm_gen() { return gen_out_of_memory_error(_out_of_memory_error_perm_gen); } 1.313 + static oop out_of_memory_error_array_size() { return gen_out_of_memory_error(_out_of_memory_error_array_size); } 1.314 + static oop out_of_memory_error_gc_overhead_limit() { return gen_out_of_memory_error(_out_of_memory_error_gc_overhead_limit); } 1.315 + 1.316 + // Accessors needed for fast allocation 1.317 + static klassOop* boolArrayKlassObj_addr() { return &_boolArrayKlassObj; } 1.318 + static klassOop* byteArrayKlassObj_addr() { return &_byteArrayKlassObj; } 1.319 + static klassOop* charArrayKlassObj_addr() { return &_charArrayKlassObj; } 1.320 + static klassOop* intArrayKlassObj_addr() { return &_intArrayKlassObj; } 1.321 + static klassOop* shortArrayKlassObj_addr() { return &_shortArrayKlassObj; } 1.322 + static klassOop* longArrayKlassObj_addr() { return &_longArrayKlassObj; } 1.323 + static klassOop* singleArrayKlassObj_addr() { return &_singleArrayKlassObj; } 1.324 + static klassOop* doubleArrayKlassObj_addr() { return &_doubleArrayKlassObj; } 1.325 + 1.326 + // The particular choice of collected heap. 1.327 + static CollectedHeap* heap() { return _collectedHeap; } 1.328 + 1.329 + // Historic gc information 1.330 + static size_t get_heap_capacity_at_last_gc() { return _heap_capacity_at_last_gc; } 1.331 + static size_t get_heap_free_at_last_gc() { return _heap_capacity_at_last_gc - _heap_used_at_last_gc; } 1.332 + static size_t get_heap_used_at_last_gc() { return _heap_used_at_last_gc; } 1.333 + static void update_heap_info_at_gc(); 1.334 + 1.335 + // Testers 1.336 + static bool is_bootstrapping() { return _bootstrapping; } 1.337 + static bool is_fully_initialized() { return _fully_initialized; } 1.338 + 1.339 + static inline bool element_type_should_be_aligned(BasicType type); 1.340 + static inline bool field_type_should_be_aligned(BasicType type); 1.341 + static bool on_page_boundary(void* addr); 1.342 + static bool should_fill_in_stack_trace(Handle throwable); 1.343 + static void check_alignment(uintx size, uintx alignment, const char* name); 1.344 + 1.345 + // Finalizer support. 1.346 + static void run_finalizers_on_exit(); 1.347 + 1.348 + // Iteration 1.349 + 1.350 + // Apply "f" to the addresses of all the direct heap pointers maintained 1.351 + // as static fields of "Universe". 1.352 + static void oops_do(OopClosure* f, bool do_all = false); 1.353 + 1.354 + // Apply "f" to all klasses for basic types (classes not present in 1.355 + // SystemDictionary). 1.356 + static void basic_type_classes_do(void f(klassOop)); 1.357 + 1.358 + // Apply "f" to all system klasses (classes not present in SystemDictionary). 1.359 + static void system_classes_do(void f(klassOop)); 1.360 + 1.361 + // For sharing -- fill in a list of known vtable pointers. 1.362 + static void init_self_patching_vtbl_list(void** list, int count); 1.363 + 1.364 + // Debugging 1.365 + static bool verify_in_progress() { return _verify_in_progress; } 1.366 + static void verify(bool allow_dirty = true, bool silent = false); 1.367 + static int verify_count() { return _verify_count; } 1.368 + static void print(); 1.369 + static void print_on(outputStream* st); 1.370 + static void print_heap_at_SIGBREAK(); 1.371 + static void print_heap_before_gc() { print_heap_before_gc(gclog_or_tty); } 1.372 + static void print_heap_after_gc() { print_heap_after_gc(gclog_or_tty); } 1.373 + static void print_heap_before_gc(outputStream* st); 1.374 + static void print_heap_after_gc(outputStream* st); 1.375 + 1.376 + // Change the number of dummy objects kept reachable by the full gc dummy 1.377 + // array; this should trigger relocation in a sliding compaction collector. 1.378 + debug_only(static bool release_fullgc_alot_dummy();) 1.379 + // The non-oop pattern (see compiledIC.hpp, etc) 1.380 + static void* non_oop_word(); 1.381 + 1.382 + // Oop verification (see MacroAssembler::verify_oop) 1.383 + static uintptr_t verify_oop_mask() PRODUCT_RETURN0; 1.384 + static uintptr_t verify_oop_bits() PRODUCT_RETURN0; 1.385 + static uintptr_t verify_mark_bits() PRODUCT_RETURN0; 1.386 + static uintptr_t verify_mark_mask() PRODUCT_RETURN0; 1.387 + static uintptr_t verify_klass_mask() PRODUCT_RETURN0; 1.388 + static uintptr_t verify_klass_bits() PRODUCT_RETURN0; 1.389 + 1.390 + // Flushing and deoptimization 1.391 + static void flush_dependents_on(instanceKlassHandle dependee); 1.392 +#ifdef HOTSWAP 1.393 + // Flushing and deoptimization in case of evolution 1.394 + static void flush_evol_dependents_on(instanceKlassHandle dependee); 1.395 +#endif // HOTSWAP 1.396 + // Support for fullspeed debugging 1.397 + static void flush_dependents_on_method(methodHandle dependee); 1.398 + 1.399 + // Compiler support 1.400 + static int base_vtable_size() { return _base_vtable_size; } 1.401 +}; 1.402 + 1.403 +class DeferredObjAllocEvent : public CHeapObj { 1.404 + private: 1.405 + oop _oop; 1.406 + size_t _bytesize; 1.407 + jint _arena_id; 1.408 + 1.409 + public: 1.410 + DeferredObjAllocEvent(const oop o, const size_t s, const jint id) { 1.411 + _oop = o; 1.412 + _bytesize = s; 1.413 + _arena_id = id; 1.414 + } 1.415 + 1.416 + ~DeferredObjAllocEvent() { 1.417 + } 1.418 + 1.419 + jint arena_id() { return _arena_id; } 1.420 + size_t bytesize() { return _bytesize; } 1.421 + oop get_oop() { return _oop; } 1.422 +};