679
680 // writes a HPROF_HEAP_DUMP_SEGMENT record
681 static void write_dump_header(DumpWriter* writer);
682
683 // fixes up the length of the current dump record
684 static void write_current_dump_record_length(DumpWriter* writer);
685
686 // fixes up the current dump record and writes HPROF_HEAP_DUMP_END record
687 static void end_of_dump(DumpWriter* writer);
688 };
689
690 // write a header of the given type
691 void DumperSupport:: write_header(DumpWriter* writer, hprofTag tag, u4 len) {
692 writer->write_u1((u1)tag);
693 writer->write_u4(0); // current ticks
694 writer->write_u4(len);
695 }
696
697 // returns hprof tag for the given type signature
698 hprofTag DumperSupport::sig2tag(Symbol* sig) {
699 switch (sig->byte_at(0)) {
700 case JVM_SIGNATURE_CLASS : return HPROF_NORMAL_OBJECT;
701 case JVM_SIGNATURE_ARRAY : return HPROF_NORMAL_OBJECT;
702 case JVM_SIGNATURE_BYTE : return HPROF_BYTE;
703 case JVM_SIGNATURE_CHAR : return HPROF_CHAR;
704 case JVM_SIGNATURE_FLOAT : return HPROF_FLOAT;
705 case JVM_SIGNATURE_DOUBLE : return HPROF_DOUBLE;
706 case JVM_SIGNATURE_INT : return HPROF_INT;
707 case JVM_SIGNATURE_LONG : return HPROF_LONG;
708 case JVM_SIGNATURE_SHORT : return HPROF_SHORT;
709 case JVM_SIGNATURE_BOOLEAN : return HPROF_BOOLEAN;
710 default : ShouldNotReachHere(); /* to shut up compiler */ return HPROF_BYTE;
711 }
712 }
713
714 hprofTag DumperSupport::type2tag(BasicType type) {
715 switch (type) {
716 case T_BYTE : return HPROF_BYTE;
717 case T_CHAR : return HPROF_CHAR;
718 case T_FLOAT : return HPROF_FLOAT;
719 case T_DOUBLE : return HPROF_DOUBLE;
804 writer->write_u1((u1)b);
805 break;
806 }
807 default : {
808 ShouldNotReachHere();
809 break;
810 }
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;
|
679
680 // writes a HPROF_HEAP_DUMP_SEGMENT record
681 static void write_dump_header(DumpWriter* writer);
682
683 // fixes up the length of the current dump record
684 static void write_current_dump_record_length(DumpWriter* writer);
685
686 // fixes up the current dump record and writes HPROF_HEAP_DUMP_END record
687 static void end_of_dump(DumpWriter* writer);
688 };
689
690 // write a header of the given type
691 void DumperSupport:: write_header(DumpWriter* writer, hprofTag tag, u4 len) {
692 writer->write_u1((u1)tag);
693 writer->write_u4(0); // current ticks
694 writer->write_u4(len);
695 }
696
697 // returns hprof tag for the given type signature
698 hprofTag DumperSupport::sig2tag(Symbol* sig) {
699 switch (sig->char_at(0)) {
700 case JVM_SIGNATURE_CLASS : return HPROF_NORMAL_OBJECT;
701 case JVM_SIGNATURE_ARRAY : return HPROF_NORMAL_OBJECT;
702 case JVM_SIGNATURE_BYTE : return HPROF_BYTE;
703 case JVM_SIGNATURE_CHAR : return HPROF_CHAR;
704 case JVM_SIGNATURE_FLOAT : return HPROF_FLOAT;
705 case JVM_SIGNATURE_DOUBLE : return HPROF_DOUBLE;
706 case JVM_SIGNATURE_INT : return HPROF_INT;
707 case JVM_SIGNATURE_LONG : return HPROF_LONG;
708 case JVM_SIGNATURE_SHORT : return HPROF_SHORT;
709 case JVM_SIGNATURE_BOOLEAN : return HPROF_BOOLEAN;
710 default : ShouldNotReachHere(); /* to shut up compiler */ return HPROF_BYTE;
711 }
712 }
713
714 hprofTag DumperSupport::type2tag(BasicType type) {
715 switch (type) {
716 case T_BYTE : return HPROF_BYTE;
717 case T_CHAR : return HPROF_CHAR;
718 case T_FLOAT : return HPROF_FLOAT;
719 case T_DOUBLE : return HPROF_DOUBLE;
804 writer->write_u1((u1)b);
805 break;
806 }
807 default : {
808 ShouldNotReachHere();
809 break;
810 }
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->char_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;
|