comparison src/share/vm/prims/jvmtiTagMap.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1 37f87013dfd8
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
2660 2660
2661 // invoke the callback 2661 // invoke the callback
2662 _continue = CallbackInvoker::report_simple_root(kind, o); 2662 _continue = CallbackInvoker::report_simple_root(kind, o);
2663 2663
2664 } 2664 }
2665 virtual void do_oop(narrowOop* obj_p) { ShouldNotReachHere(); }
2665 }; 2666 };
2666 2667
2667 // A supporting closure used to process JNI locals 2668 // A supporting closure used to process JNI locals
2668 class JNILocalRootsClosure : public OopClosure { 2669 class JNILocalRootsClosure : public OopClosure {
2669 private: 2670 private:
2702 } 2703 }
2703 2704
2704 // invoke the callback 2705 // invoke the callback
2705 _continue = CallbackInvoker::report_jni_local_root(_thread_tag, _tid, _depth, _method, o); 2706 _continue = CallbackInvoker::report_jni_local_root(_thread_tag, _tid, _depth, _method, o);
2706 } 2707 }
2708 virtual void do_oop(narrowOop* obj_p) { ShouldNotReachHere(); }
2707 }; 2709 };
2708 2710
2709 2711
2710 // A VM operation to iterate over objects that are reachable from 2712 // A VM operation to iterate over objects that are reachable from
2711 // a set of roots or an initial object. 2713 // a set of roots or an initial object.
2876 } 2878 }
2877 return true; 2879 return true;
2878 } 2880 }
2879 2881
2880 // verify that a static oop field is in range 2882 // verify that a static oop field is in range
2881 static inline bool verify_static_oop(instanceKlass* ik, oop* obj_p) { 2883 static inline bool verify_static_oop(instanceKlass* ik,
2882 oop* start = ik->start_of_static_fields(); 2884 klassOop k, int offset) {
2883 oop* end = start + ik->static_oop_field_size(); 2885 address obj_p = (address)k + offset;
2886 address start = (address)ik->start_of_static_fields();
2887 address end = start + (ik->static_oop_field_size() * heapOopSize);
2884 assert(end >= start, "sanity check"); 2888 assert(end >= start, "sanity check");
2885 2889
2886 if (obj_p >= start && obj_p < end) { 2890 if (obj_p >= start && obj_p < end) {
2887 return true; 2891 return true;
2888 } else { 2892 } else {
2979 ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k); 2983 ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k);
2980 for (i=0; i<field_map->field_count(); i++) { 2984 for (i=0; i<field_map->field_count(); i++) {
2981 ClassFieldDescriptor* field = field_map->field_at(i); 2985 ClassFieldDescriptor* field = field_map->field_at(i);
2982 char type = field->field_type(); 2986 char type = field->field_type();
2983 if (!is_primitive_field_type(type)) { 2987 if (!is_primitive_field_type(type)) {
2984 address addr = (address)k + field->field_offset(); 2988 oop fld_o = k->obj_field(field->field_offset());
2985 oop* f = (oop*)addr; 2989 assert(verify_static_oop(ik, k, field->field_offset()), "sanity check");
2986 assert(verify_static_oop(ik, f), "sanity check");
2987 oop fld_o = *f;
2988 if (fld_o != NULL) { 2990 if (fld_o != NULL) {
2989 int slot = field->field_index(); 2991 int slot = field->field_index();
2990 if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) { 2992 if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) {
2991 delete field_map; 2993 delete field_map;
2992 return false; 2994 return false;
3024 ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o); 3026 ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o);
3025 for (int i=0; i<field_map->field_count(); i++) { 3027 for (int i=0; i<field_map->field_count(); i++) {
3026 ClassFieldDescriptor* field = field_map->field_at(i); 3028 ClassFieldDescriptor* field = field_map->field_at(i);
3027 char type = field->field_type(); 3029 char type = field->field_type();
3028 if (!is_primitive_field_type(type)) { 3030 if (!is_primitive_field_type(type)) {
3029 address addr = (address)o + field->field_offset(); 3031 oop fld_o = o->obj_field(field->field_offset());
3030 oop* f = (oop*)addr;
3031 oop fld_o = *f;
3032 if (fld_o != NULL) { 3032 if (fld_o != NULL) {
3033 // reflection code may have a reference to a klassOop. 3033 // reflection code may have a reference to a klassOop.
3034 // - see sun.reflect.UnsafeStaticFieldAccessorImpl and sun.misc.Unsafe 3034 // - see sun.reflect.UnsafeStaticFieldAccessorImpl and sun.misc.Unsafe
3035 if (fld_o->is_klass()) { 3035 if (fld_o->is_klass()) {
3036 klassOop k = (klassOop)fld_o; 3036 klassOop k = (klassOop)fld_o;