comparison src/share/vm/oops/instanceKlassKlass.cpp @ 2376:c7f3d0b4570f

7017732: move static fields into Class to prepare for perm gen removal Reviewed-by: kvn, coleenp, twisti, stefank
author never
date Fri, 18 Mar 2011 16:00:34 -0700
parents e5383553fd4e
children ed69575596ac
comparison
equal deleted inserted replaced
2375:d673ef06fe96 2376:c7f3d0b4570f
29 #include "gc_interface/collectedHeap.inline.hpp" 29 #include "gc_interface/collectedHeap.inline.hpp"
30 #include "interpreter/oopMapCache.hpp" 30 #include "interpreter/oopMapCache.hpp"
31 #include "memory/gcLocker.hpp" 31 #include "memory/gcLocker.hpp"
32 #include "oops/constantPoolOop.hpp" 32 #include "oops/constantPoolOop.hpp"
33 #include "oops/instanceKlass.hpp" 33 #include "oops/instanceKlass.hpp"
34 #include "oops/instanceMirrorKlass.hpp"
34 #include "oops/instanceKlassKlass.hpp" 35 #include "oops/instanceKlassKlass.hpp"
35 #include "oops/instanceRefKlass.hpp" 36 #include "oops/instanceRefKlass.hpp"
36 #include "oops/objArrayKlassKlass.hpp" 37 #include "oops/objArrayKlassKlass.hpp"
37 #include "oops/objArrayOop.hpp" 38 #include "oops/objArrayOop.hpp"
38 #include "oops/oop.inline.hpp" 39 #include "oops/oop.inline.hpp"
84 void instanceKlassKlass::oop_follow_contents(oop obj) { 85 void instanceKlassKlass::oop_follow_contents(oop obj) {
85 assert(obj->is_klass(),"must be a klass"); 86 assert(obj->is_klass(),"must be a klass");
86 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); 87 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass");
87 88
88 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 89 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
89 ik->follow_static_fields();
90 { 90 {
91 HandleMark hm; 91 HandleMark hm;
92 ik->vtable()->oop_follow_contents(); 92 ik->vtable()->oop_follow_contents();
93 ik->itable()->oop_follow_contents(); 93 ik->itable()->oop_follow_contents();
94 } 94 }
125 oop obj) { 125 oop obj) {
126 assert(obj->is_klass(),"must be a klass"); 126 assert(obj->is_klass(),"must be a klass");
127 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); 127 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass");
128 128
129 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 129 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
130 ik->follow_static_fields(cm);
131 ik->vtable()->oop_follow_contents(cm); 130 ik->vtable()->oop_follow_contents(cm);
132 ik->itable()->oop_follow_contents(cm); 131 ik->itable()->oop_follow_contents(cm);
133 132
134 PSParallelCompact::mark_and_push(cm, ik->adr_array_klasses()); 133 PSParallelCompact::mark_and_push(cm, ik->adr_array_klasses());
135 PSParallelCompact::mark_and_push(cm, ik->adr_methods()); 134 PSParallelCompact::mark_and_push(cm, ik->adr_methods());
166 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 165 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
167 // Get size before changing pointers. 166 // Get size before changing pointers.
168 // Don't call size() or oop_size() since that is a virtual call. 167 // Don't call size() or oop_size() since that is a virtual call.
169 int size = ik->object_size(); 168 int size = ik->object_size();
170 169
171 ik->iterate_static_fields(blk);
172 ik->vtable()->oop_oop_iterate(blk); 170 ik->vtable()->oop_oop_iterate(blk);
173 ik->itable()->oop_oop_iterate(blk); 171 ik->itable()->oop_oop_iterate(blk);
174 172
175 blk->do_oop(ik->adr_array_klasses()); 173 blk->do_oop(ik->adr_array_klasses());
176 blk->do_oop(ik->adr_methods()); 174 blk->do_oop(ik->adr_methods());
207 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 205 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
208 // Get size before changing pointers. 206 // Get size before changing pointers.
209 // Don't call size() or oop_size() since that is a virtual call. 207 // Don't call size() or oop_size() since that is a virtual call.
210 int size = ik->object_size(); 208 int size = ik->object_size();
211 209
212 ik->iterate_static_fields(blk, mr);
213 ik->vtable()->oop_oop_iterate_m(blk, mr); 210 ik->vtable()->oop_oop_iterate_m(blk, mr);
214 ik->itable()->oop_oop_iterate_m(blk, mr); 211 ik->itable()->oop_oop_iterate_m(blk, mr);
215 212
216 oop* adr; 213 oop* adr;
217 adr = ik->adr_array_klasses(); 214 adr = ik->adr_array_klasses();
264 int instanceKlassKlass::oop_adjust_pointers(oop obj) { 261 int instanceKlassKlass::oop_adjust_pointers(oop obj) {
265 assert(obj->is_klass(),"must be a klass"); 262 assert(obj->is_klass(),"must be a klass");
266 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); 263 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass");
267 264
268 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 265 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
269 ik->adjust_static_fields();
270 ik->vtable()->oop_adjust_pointers(); 266 ik->vtable()->oop_adjust_pointers();
271 ik->itable()->oop_adjust_pointers(); 267 ik->itable()->oop_adjust_pointers();
272 268
273 MarkSweep::adjust_pointer(ik->adr_array_klasses()); 269 MarkSweep::adjust_pointer(ik->adr_array_klasses());
274 MarkSweep::adjust_pointer(ik->adr_methods()); 270 MarkSweep::adjust_pointer(ik->adr_methods());
298 } 294 }
299 295
300 #ifndef SERIALGC 296 #ifndef SERIALGC
301 void instanceKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { 297 void instanceKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
302 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 298 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
303 ik->push_static_fields(pm);
304 299
305 oop* loader_addr = ik->adr_class_loader(); 300 oop* loader_addr = ik->adr_class_loader();
306 if (PSScavenge::should_scavenge(loader_addr)) { 301 if (PSScavenge::should_scavenge(loader_addr)) {
307 pm->claim_or_forward_depth(loader_addr); 302 pm->claim_or_forward_depth(loader_addr);
308 } 303 }
334 assert(obj->is_klass(),"must be a klass"); 329 assert(obj->is_klass(),"must be a klass");
335 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), 330 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(),
336 "must be instance klass"); 331 "must be instance klass");
337 332
338 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); 333 instanceKlass* ik = instanceKlass::cast(klassOop(obj));
339 ik->update_static_fields();
340 ik->vtable()->oop_update_pointers(cm); 334 ik->vtable()->oop_update_pointers(cm);
341 ik->itable()->oop_update_pointers(cm); 335 ik->itable()->oop_update_pointers(cm);
342 336
343 oop* const beg_oop = ik->oop_block_beg(); 337 oop* const beg_oop = ik->oop_block_beg();
344 oop* const end_oop = ik->oop_block_end(); 338 oop* const end_oop = ik->oop_block_end();
354 } 348 }
355 349
356 #endif // SERIALGC 350 #endif // SERIALGC
357 351
358 klassOop 352 klassOop
359 instanceKlassKlass::allocate_instance_klass(int vtable_len, int itable_len, 353 instanceKlassKlass::allocate_instance_klass(Symbol* name, int vtable_len, int itable_len,
360 int static_field_size, 354 int static_field_size,
361 unsigned nonstatic_oop_map_count, 355 unsigned nonstatic_oop_map_count,
362 ReferenceType rt, TRAPS) { 356 ReferenceType rt, TRAPS) {
363 357
364 const int nonstatic_oop_map_size = 358 const int nonstatic_oop_map_size =
365 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count); 359 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count);
366 int size = instanceKlass::object_size(align_object_offset(vtable_len) + align_object_offset(itable_len) + static_field_size + nonstatic_oop_map_size); 360 int size = instanceKlass::object_size(align_object_offset(vtable_len) + align_object_offset(itable_len) + nonstatic_oop_map_size);
367 361
368 // Allocation 362 // Allocation
369 KlassHandle h_this_klass(THREAD, as_klassOop()); 363 KlassHandle h_this_klass(THREAD, as_klassOop());
370 KlassHandle k; 364 KlassHandle k;
371 if (rt == REF_NONE) { 365 if (rt == REF_NONE) {
372 // regular klass 366 if (name != vmSymbols::java_lang_Class()) {
373 instanceKlass o; 367 // regular klass
374 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); 368 instanceKlass o;
369 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL);
370 } else {
371 // Class
372 instanceMirrorKlass o;
373 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL);
374 }
375 } else { 375 } else {
376 // reference klass 376 // reference klass
377 instanceRefKlass o; 377 instanceRefKlass o;
378 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); 378 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL);
379 } 379 }
406 ik->set_source_file_name(NULL); 406 ik->set_source_file_name(NULL);
407 ik->set_source_debug_extension(NULL); 407 ik->set_source_debug_extension(NULL);
408 ik->set_source_debug_extension(NULL); 408 ik->set_source_debug_extension(NULL);
409 ik->set_array_name(NULL); 409 ik->set_array_name(NULL);
410 ik->set_inner_classes(NULL); 410 ik->set_inner_classes(NULL);
411 ik->set_static_oop_field_size(0); 411 ik->set_static_oop_field_count(0);
412 ik->set_nonstatic_field_size(0); 412 ik->set_nonstatic_field_size(0);
413 ik->set_is_marked_dependent(false); 413 ik->set_is_marked_dependent(false);
414 ik->set_init_state(instanceKlass::allocated); 414 ik->set_init_state(instanceKlass::allocated);
415 ik->set_init_thread(NULL); 415 ik->set_init_thread(NULL);
416 ik->set_reference_type(rt); 416 ik->set_reference_type(rt);
440 } 440 }
441 441
442 // To get verify to work - must be set to partial loaded before first GC point. 442 // To get verify to work - must be set to partial loaded before first GC point.
443 k()->set_partially_loaded(); 443 k()->set_partially_loaded();
444 } 444 }
445
446 // GC can happen here
447 java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror
448 return k(); 445 return k();
449 } 446 }
450 447
451 448
452 449
564 ik->do_local_static_fields(&print_static_field); 561 ik->do_local_static_fields(&print_static_field);
565 st->print_cr(BULLET"---- non-static fields (%d words):", ik->nonstatic_field_size()); 562 st->print_cr(BULLET"---- non-static fields (%d words):", ik->nonstatic_field_size());
566 FieldPrinter print_nonstatic_field(st); 563 FieldPrinter print_nonstatic_field(st);
567 ik->do_nonstatic_fields(&print_nonstatic_field); 564 ik->do_nonstatic_fields(&print_nonstatic_field);
568 565
569 st->print(BULLET"static oop maps: ");
570 if (ik->static_oop_field_size() > 0) {
571 int first_offset = ik->offset_of_static_fields();
572 st->print("%d-%d", first_offset, first_offset + ik->static_oop_field_size() - 1);
573 }
574 st->cr();
575
576 st->print(BULLET"non-static oop maps: "); 566 st->print(BULLET"non-static oop maps: ");
577 OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); 567 OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
578 OopMapBlock* end_map = map + ik->nonstatic_oop_map_count(); 568 OopMapBlock* end_map = map + ik->nonstatic_oop_map_count();
579 while (map < end_map) { 569 while (map < end_map) {
580 st->print("%d-%d ", map->offset(), map->offset() + heapOopSize*(map->count() - 1)); 570 st->print("%d-%d ", map->offset(), map->offset() + heapOopSize*(map->count() - 1));
628 SystemDictionary::verify_obj_klass_present(h_obj, h_name, h_loader); 618 SystemDictionary::verify_obj_klass_present(h_obj, h_name, h_loader);
629 } 619 }
630 620
631 // Verify static fields 621 // Verify static fields
632 VerifyFieldClosure blk; 622 VerifyFieldClosure blk;
633 ik->iterate_static_fields(&blk);
634 623
635 // Verify vtables 624 // Verify vtables
636 if (ik->is_linked()) { 625 if (ik->is_linked()) {
637 ResourceMark rm(thread); 626 ResourceMark rm(thread);
638 // $$$ This used to be done only for m/s collections. Doing it 627 // $$$ This used to be done only for m/s collections. Doing it