@@ -2074,6 +2074,52 @@ Method* InstanceKlass::lookup_method_in_all_interfaces(Symbol* name,
20742074 return NULL ;
20752075}
20762076
2077+ PrintClassClosure::PrintClassClosure (outputStream* st, bool verbose)
2078+ :_st(st), _verbose(verbose) {
2079+ ResourceMark rm;
2080+ _st->print (" %-18s " , " KlassAddr" );
2081+ _st->print (" %-4s " , " Size" );
2082+ _st->print (" %-20s " , " State" );
2083+ _st->print (" %-7s " , " Flags" );
2084+ _st->print (" %-5s " , " ClassName" );
2085+ _st->cr ();
2086+ }
2087+
2088+ void PrintClassClosure::do_klass (Klass* k) {
2089+ ResourceMark rm;
2090+ // klass pointer
2091+ _st->print (INTPTR_FORMAT " " , p2i (k));
2092+ // klass size
2093+ _st->print (" %4d " , k->size ());
2094+ // initialization state
2095+ if (k->is_instance_klass ()) {
2096+ _st->print (" %-20s " ,InstanceKlass::cast (k)->init_state_name ());
2097+ } else {
2098+ _st->print (" %-20s " ," " );
2099+ }
2100+ // misc flags(Changes should synced with ClassesDCmd::ClassesDCmd help doc)
2101+ char buf[10 ];
2102+ int i = 0 ;
2103+ if (k->has_finalizer ()) buf[i++] = ' F' ;
2104+ if (k->has_final_method ()) buf[i++] = ' f' ;
2105+ if (k->is_instance_klass ()) {
2106+ InstanceKlass* ik = InstanceKlass::cast (k);
2107+ if (ik->is_rewritten ()) buf[i++] = ' W' ;
2108+ if (ik->is_contended ()) buf[i++] = ' C' ;
2109+ if (ik->has_been_redefined ()) buf[i++] = ' R' ;
2110+ if (ik->is_shared ()) buf[i++] = ' S' ;
2111+ }
2112+ buf[i++] = ' \0 ' ;
2113+ _st->print (" %-7s " , buf);
2114+ // klass name
2115+ _st->print (" %-5s " , k->external_name ());
2116+ // end
2117+ _st->cr ();
2118+ if (_verbose) {
2119+ k->print_on (_st);
2120+ }
2121+ }
2122+
20772123/* jni_id_for for jfieldIds only */
20782124JNIid* InstanceKlass::jni_id_for (int offset) {
20792125 MutexLocker ml (JfieldIdCreation_lock);
@@ -3393,14 +3439,18 @@ static void print_vtable(vtableEntry* start, int len, outputStream* st) {
33933439 return print_vtable (reinterpret_cast <intptr_t *>(start), len, st);
33943440}
33953441
3442+ const char * InstanceKlass::init_state_name () const {
3443+ return state_names[_init_state];
3444+ }
3445+
33963446void InstanceKlass::print_on (outputStream* st) const {
33973447 assert (is_klass (), " must be klass" );
33983448 Klass::print_on (st);
33993449
34003450 st->print (BULLET" instance size: %d" , size_helper ()); st->cr ();
34013451 st->print (BULLET" klass size: %d" , size ()); st->cr ();
34023452 st->print (BULLET" access: " ); access_flags ().print_on (st); st->cr ();
3403- st->print (BULLET" state: " ); st->print_cr (" %s" , state_names[_init_state] );
3453+ st->print (BULLET" state: " ); st->print_cr (" %s" , init_state_name () );
34043454 st->print (BULLET" name: " ); name ()->print_value_on (st); st->cr ();
34053455 st->print (BULLET" super: " ); Metadata::print_value_on_maybe_null (st, super ()); st->cr ();
34063456 st->print (BULLET" sub: " );
0 commit comments