< prev index next >

src/share/vm/utilities/hashtable.cpp

Print this page
rev 9056 : 8185525: Add JFR event for DictionarySizes
Summary: Added TableStatistics event
Reviewed-by: egahlin, coleenp

*** 266,285 **** *bucket_addr(i) = high_list; } } } ! template <class T, MEMFLAGS F> int RehashableHashtable<T, F>::literal_size(Symbol *symbol) { return symbol->size() * HeapWordSize; } ! template <class T, MEMFLAGS F> int RehashableHashtable<T, F>::literal_size(oop oop) { // NOTE: this would over-count if (pre-JDK8) java_lang_Class::has_offset_field() is true, // and the String.value array is shared by several Strings. However, starting from JDK8, // the String.value array is not shared anymore. ! assert(oop != NULL && oop->klass() == SystemDictionary::String_klass(), "only strings are supported"); ! return (oop->size() + java_lang_String::value(oop)->size()) * HeapWordSize; } // Dump footprint and bucket length statistics // // Note: if you create a new subclass of Hashtable<MyNewType, F>, you will need to --- 266,297 ---- *bucket_addr(i) = high_list; } } } ! // For oops and Strings the size of the literal is interesting. For other types, nobody cares. ! int literal_size(ConstantPool*) { return 0; } ! int literal_size(Klass*) { return 0; } ! #if INCLUDE_ALL_GCS ! int literal_size(nmethod*) { return 0; } ! #endif ! ! int literal_size(Symbol *symbol) { return symbol->size() * HeapWordSize; } ! int literal_size(oop obj) { // NOTE: this would over-count if (pre-JDK8) java_lang_Class::has_offset_field() is true, // and the String.value array is shared by several Strings. However, starting from JDK8, // the String.value array is not shared anymore. ! if (obj == NULL) { ! return 0; ! } else if (obj->klass() == SystemDictionary::String_klass()) { ! return (obj->size() + java_lang_String::value(obj)->size()) * HeapWordSize; ! } else { ! return obj->size(); ! } } // Dump footprint and bucket length statistics // // Note: if you create a new subclass of Hashtable<MyNewType, F>, you will need to
*** 335,344 **** --- 347,371 ---- } _buckets = (HashtableBucket<F>*)memcpy(*top, _buckets, len); *top += len; } + template <class T, MEMFLAGS F> TableStatistics Hashtable<T, F>::statistics_calculate(T (*literal_load_barrier)(HashtableEntry<T, F>*)) { + NumberSeq summary; + int literal_bytes = 0; + for (int i = 0; i < this->table_size(); ++i) { + int count = 0; + for (HashtableEntry<T, F>* e = this->bucket(i); + e != NULL; e = e->next()) { + count++; + T l = (literal_load_barrier != NULL) ? literal_load_barrier(e) : e->literal(); + literal_bytes += literal_size(l); + } + summary.add((double)count); + } + return TableStatistics(this->_stats_rate, summary, literal_bytes, sizeof(HashtableBucket<F>), sizeof(HashtableEntry<T, F>)); + } #ifndef PRODUCT template <class T, MEMFLAGS F> void Hashtable<T, F>::print() { ResourceMark rm;
< prev index next >