< prev index next >

src/share/vm/services/heapDumper.cpp

Print this page




 797       writer->write_u4((u4)*i);
 798       break;
 799     }
 800     case JVM_SIGNATURE_LONG     : {
 801       jlong* l = (jlong*)addr;
 802       writer->write_u8((u8)*l);
 803       break;
 804     }
 805     case JVM_SIGNATURE_BOOLEAN : {
 806       jboolean* b = (jboolean*)addr;
 807       writer->write_u1((u1)*b);
 808       break;
 809     }
 810     default : ShouldNotReachHere();
 811   }
 812 }
 813 
 814 // returns the size of the instance of the given class
 815 u4 DumperSupport::instance_size(Klass* k) {
 816   HandleMark hm;
 817   instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
 818 
 819   u4 size = 0;
 820 
 821   for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) {
 822     if (!fld.access_flags().is_static()) {
 823       Symbol* sig = fld.signature();
 824       switch (sig->byte_at(0)) {
 825         case JVM_SIGNATURE_CLASS   :
 826         case JVM_SIGNATURE_ARRAY   : size += oopSize; break;
 827 
 828         case JVM_SIGNATURE_BYTE    :
 829         case JVM_SIGNATURE_BOOLEAN : size += 1; break;
 830 
 831         case JVM_SIGNATURE_CHAR    :
 832         case JVM_SIGNATURE_SHORT   : size += 2; break;
 833 
 834         case JVM_SIGNATURE_INT     :
 835         case JVM_SIGNATURE_FLOAT   : size += 4; break;
 836 
 837         case JVM_SIGNATURE_LONG    :
 838         case JVM_SIGNATURE_DOUBLE  : size += 8; break;
 839 
 840         default : ShouldNotReachHere();
 841       }
 842     }
 843   }
 844   return size;
 845 }
 846 
 847 // dumps static fields of the given class
 848 void DumperSupport::dump_static_fields(DumpWriter* writer, Klass* k) {
 849   HandleMark hm;
 850   instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
 851 
 852   // pass 1 - count the static fields
 853   u2 field_count = 0;
 854   for (FieldStream fldc(ikh, true, true); !fldc.eos(); fldc.next()) {
 855     if (fldc.access_flags().is_static()) field_count++;
 856   }
 857 
 858   writer->write_u2(field_count);
 859 
 860   // pass 2 - dump the field descriptors and raw values
 861   for (FieldStream fld(ikh, true, true); !fld.eos(); fld.next()) {
 862     if (fld.access_flags().is_static()) {
 863       Symbol* sig = fld.signature();
 864 
 865       writer->write_symbolID(fld.name());   // name
 866       writer->write_u1(sig2tag(sig));       // type
 867 
 868       // value
 869       int offset = fld.offset();
 870       address addr = (address)ikh->java_mirror() + offset;
 871 
 872       dump_field_value(writer, sig->byte_at(0), addr);
 873     }
 874   }
 875 }
 876 
 877 // dump the raw values of the instance fields of the given object
 878 void DumperSupport::dump_instance_fields(DumpWriter* writer, oop o) {
 879   HandleMark hm;
 880   instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), o->klass());
 881 
 882   for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) {
 883     if (!fld.access_flags().is_static()) {
 884       Symbol* sig = fld.signature();
 885       address addr = (address)o + fld.offset();
 886 
 887       dump_field_value(writer, sig->byte_at(0), addr);
 888     }
 889   }
 890 }
 891 
 892 // dumps the definition of the instance fields for a given class
 893 void DumperSupport::dump_instance_field_descriptors(DumpWriter* writer, Klass* k) {
 894   HandleMark hm;
 895   instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
 896 
 897   // pass 1 - count the instance fields
 898   u2 field_count = 0;
 899   for (FieldStream fldc(ikh, true, true); !fldc.eos(); fldc.next()) {
 900     if (!fldc.access_flags().is_static()) field_count++;
 901   }
 902 
 903   writer->write_u2(field_count);
 904 
 905   // pass 2 - dump the field descriptors
 906   for (FieldStream fld(ikh, true, true); !fld.eos(); fld.next()) {
 907     if (!fld.access_flags().is_static()) {
 908       Symbol* sig = fld.signature();
 909 
 910       writer->write_symbolID(fld.name());                   // name
 911       writer->write_u1(sig2tag(sig));       // type
 912     }
 913   }
 914 }
 915 
 916 // creates HPROF_GC_INSTANCE_DUMP record for the given object
 917 void DumperSupport::dump_instance(DumpWriter* writer, oop o) {
 918   Klass* k = o->klass();
 919 
 920   writer->write_u1(HPROF_GC_INSTANCE_DUMP);
 921   writer->write_objectID(o);
 922   writer->write_u4(STACK_TRACE_ID);
 923 
 924   // class ID
 925   writer->write_classID(k);
 926 




 797       writer->write_u4((u4)*i);
 798       break;
 799     }
 800     case JVM_SIGNATURE_LONG     : {
 801       jlong* l = (jlong*)addr;
 802       writer->write_u8((u8)*l);
 803       break;
 804     }
 805     case JVM_SIGNATURE_BOOLEAN : {
 806       jboolean* b = (jboolean*)addr;
 807       writer->write_u1((u1)*b);
 808       break;
 809     }
 810     default : ShouldNotReachHere();
 811   }
 812 }
 813 
 814 // returns the size of the instance of the given class
 815 u4 DumperSupport::instance_size(Klass* k) {
 816   HandleMark hm;
 817   InstanceKlass* ik = InstanceKlass::cast(k);
 818 
 819   u4 size = 0;
 820 
 821   for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) {
 822     if (!fld.access_flags().is_static()) {
 823       Symbol* sig = fld.signature();
 824       switch (sig->byte_at(0)) {
 825         case JVM_SIGNATURE_CLASS   :
 826         case JVM_SIGNATURE_ARRAY   : size += oopSize; break;
 827 
 828         case JVM_SIGNATURE_BYTE    :
 829         case JVM_SIGNATURE_BOOLEAN : size += 1; break;
 830 
 831         case JVM_SIGNATURE_CHAR    :
 832         case JVM_SIGNATURE_SHORT   : size += 2; break;
 833 
 834         case JVM_SIGNATURE_INT     :
 835         case JVM_SIGNATURE_FLOAT   : size += 4; break;
 836 
 837         case JVM_SIGNATURE_LONG    :
 838         case JVM_SIGNATURE_DOUBLE  : size += 8; break;
 839 
 840         default : ShouldNotReachHere();
 841       }
 842     }
 843   }
 844   return size;
 845 }
 846 
 847 // dumps static fields of the given class
 848 void DumperSupport::dump_static_fields(DumpWriter* writer, Klass* k) {
 849   HandleMark hm;
 850   InstanceKlass* ik = InstanceKlass::cast(k);
 851 
 852   // pass 1 - count the static fields
 853   u2 field_count = 0;
 854   for (FieldStream fldc(ik, true, true); !fldc.eos(); fldc.next()) {
 855     if (fldc.access_flags().is_static()) field_count++;
 856   }
 857 
 858   writer->write_u2(field_count);
 859 
 860   // pass 2 - dump the field descriptors and raw values
 861   for (FieldStream fld(ik, true, true); !fld.eos(); fld.next()) {
 862     if (fld.access_flags().is_static()) {
 863       Symbol* sig = fld.signature();
 864 
 865       writer->write_symbolID(fld.name());   // name
 866       writer->write_u1(sig2tag(sig));       // type
 867 
 868       // value
 869       int offset = fld.offset();
 870       address addr = (address)ik->java_mirror() + offset;
 871 
 872       dump_field_value(writer, sig->byte_at(0), addr);
 873     }
 874   }
 875 }
 876 
 877 // dump the raw values of the instance fields of the given object
 878 void DumperSupport::dump_instance_fields(DumpWriter* writer, oop o) {
 879   HandleMark hm;
 880   InstanceKlass* ik = InstanceKlass::cast(o->klass());
 881 
 882   for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) {
 883     if (!fld.access_flags().is_static()) {
 884       Symbol* sig = fld.signature();
 885       address addr = (address)o + fld.offset();
 886 
 887       dump_field_value(writer, sig->byte_at(0), addr);
 888     }
 889   }
 890 }
 891 
 892 // dumps the definition of the instance fields for a given class
 893 void DumperSupport::dump_instance_field_descriptors(DumpWriter* writer, Klass* k) {
 894   HandleMark hm;
 895   InstanceKlass* ik = InstanceKlass::cast(k);
 896 
 897   // pass 1 - count the instance fields
 898   u2 field_count = 0;
 899   for (FieldStream fldc(ik, true, true); !fldc.eos(); fldc.next()) {
 900     if (!fldc.access_flags().is_static()) field_count++;
 901   }
 902 
 903   writer->write_u2(field_count);
 904 
 905   // pass 2 - dump the field descriptors
 906   for (FieldStream fld(ik, true, true); !fld.eos(); fld.next()) {
 907     if (!fld.access_flags().is_static()) {
 908       Symbol* sig = fld.signature();
 909 
 910       writer->write_symbolID(fld.name());                   // name
 911       writer->write_u1(sig2tag(sig));       // type
 912     }
 913   }
 914 }
 915 
 916 // creates HPROF_GC_INSTANCE_DUMP record for the given object
 917 void DumperSupport::dump_instance(DumpWriter* writer, oop o) {
 918   Klass* k = o->klass();
 919 
 920   writer->write_u1(HPROF_GC_INSTANCE_DUMP);
 921   writer->write_objectID(o);
 922   writer->write_u4(STACK_TRACE_ID);
 923 
 924   // class ID
 925   writer->write_classID(k);
 926 


< prev index next >