void FinalizerInfoDCmd::execute(DCmdSource source, TRAPS) { ResourceMark rm; Klass* k = SystemDictionary::resolve_or_null( vmSymbols::finalizer_histogram_klass(), THREAD); assert(k != NULL, "FinalizerHistogram class is not accessible"); instanceKlassHandle klass(THREAD, k); JavaValue result(T_ARRAY); // We are calling lang.ref.FinalizerHistogram.getFinalizerHistogram() method // and expect it to return array of FinalizerHistogramEntry as Object[] JavaCalls::call_static(&result, klass, vmSymbols::get_finalizer_histogram_name(), vmSymbols::void_finalizer_histogram_entry_array_signature(), CHECK); objArrayOop result_oop = (objArrayOop) result.get_jobject(); if (result_oop->length() == 0) { output()->print_cr("No instances waiting for finalization found"); return; } oop foop = result_oop->obj_at(0); InstanceKlass* ik = InstanceKlass::cast(foop->klass()); fieldDescriptor count_fd, name_fd; Klass* count_res = ik->find_field( vmSymbols::finalizer_histogram_entry_count_field(), vmSymbols::int_signature(), &count_fd); Klass* name_res = ik->find_field( vmSymbols::finalizer_histogram_entry_name_field(), vmSymbols::string_signature(), &name_fd); assert(count_res != NULL && name_res != NULL, "Unexpected layout of FinalizerHistogramEntry"); output()->print_cr("Unreachable instances waiting for finalization"); output()->print_cr("#instances class name"); output()->print_cr("-----------------------"); for (int i = 0; i < result_oop->length(); ++i) { oop element_oop = result_oop->obj_at(i); oop str_oop = element_oop->obj_field(name_fd.offset()); char *name = java_lang_String::as_utf8_string(str_oop); int count = element_oop->int_field(count_fd.offset()); output()->print_cr("%10d %s", count, name); } }
void compute_offset(int &dest_offset, Klass* klass, const char* name, const char* signature, bool static_field) { Symbol* name_symbol = SymbolTable::probe(name, (int)strlen(name)); Symbol* signature_symbol = SymbolTable::probe(signature, (int)strlen(signature)); if (name_symbol == NULL || signature_symbol == NULL) { guarantee(false, err_msg("symbol with name %s and signature %s was not found in symbol table (klass=%s)", name, signature, klass->name()->as_C_string())); } InstanceKlass* ik = InstanceKlass::cast(klass); fieldDescriptor fd; if (!ik->find_field(name_symbol, signature_symbol, &fd)) { ResourceMark rm; fatal(err_msg("Invalid layout of %s at %s", name_symbol->as_C_string(), ik->external_name())); } guarantee(fd.is_static() == static_field, "static/instance mismatch"); dest_offset = fd.offset(); }