< prev index next >

src/share/vm/utilities/hashtable.cpp

Print this page

        

*** 26,35 **** --- 26,36 ---- #include "classfile/altHashing.hpp" #include "classfile/dictionary.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/moduleEntry.hpp" #include "classfile/packageEntry.hpp" + #include "classfile/placeholders.hpp" #include "classfile/protectionDomainCache.hpp" #include "classfile/stringTable.hpp" #include "memory/allocation.inline.hpp" #include "memory/filemap.hpp" #include "memory/resourceArea.hpp"
*** 305,348 **** entry = entry->next(); } } } - template <MEMFLAGS F> template <class T> void BasicHashtable<F>::verify_table(const char* table_name) { int element_count = 0; int max_bucket_count = 0; for (int index = 0; index < table_size(); index++) { int bucket_count = 0; for (T* probe = (T*)bucket(index); probe != NULL; probe = probe->next()) { probe->verify(); bucket_count++; } element_count += bucket_count; ! max_bucket_count = MAX2(max_bucket_count, bucket_count); } guarantee(number_of_entries() == element_count, "Verify of %s failed", table_name); - DEBUG_ONLY(verify_lookup_length(max_bucket_count, table_name)); - } - - - #endif // PRODUCT - - #ifdef ASSERT ! // Assert if the longest bucket is 10x longer than the average bucket size. ! // Could change back to a warning, but warnings are not noticed. ! template <MEMFLAGS F> void BasicHashtable<F>::verify_lookup_length(int max_bucket_count, const char *table_name) { ! log_info(hashtables)("%s max bucket size %d element count %d table size %d", table_name, ! max_bucket_count, _number_of_entries, _table_size); ! assert (max_bucket_count < ((1 + number_of_entries()/table_size())*10), "Table is unbalanced"); } ! ! #endif ! // Explicitly instantiate these types #if INCLUDE_ALL_GCS template class Hashtable<nmethod*, mtGC>; template class HashtableEntry<nmethod*, mtGC>; --- 306,352 ---- entry = entry->next(); } } } template <MEMFLAGS F> template <class T> void BasicHashtable<F>::verify_table(const char* table_name) { int element_count = 0; int max_bucket_count = 0; + int max_bucket_number = 0; for (int index = 0; index < table_size(); index++) { int bucket_count = 0; for (T* probe = (T*)bucket(index); probe != NULL; probe = probe->next()) { probe->verify(); bucket_count++; } element_count += bucket_count; ! if (bucket_count > max_bucket_count) { ! max_bucket_count = bucket_count; ! max_bucket_number = index; ! } } guarantee(number_of_entries() == element_count, "Verify of %s failed", table_name); ! // Log some statistics about the hashtable ! log_info(hashtables)("%s max bucket size %d bucket %d element count %d table size %d", table_name, ! max_bucket_count, max_bucket_number, _number_of_entries, _table_size); ! if (_number_of_entries > 0 && log_is_enabled(Debug, hashtables)) { ! for (int index = 0; index < table_size(); index++) { ! int bucket_count = 0; ! for (T* probe = (T*)bucket(index); probe != NULL; probe = probe->next()) { ! log_debug(hashtables)("bucket %d hash " INTPTR_FORMAT, index, (intptr_t)probe->hash()); ! bucket_count++; ! } ! if (bucket_count > 0) { ! log_debug(hashtables)("bucket %d count %d", index, bucket_count); ! } ! } ! } } ! #endif // PRODUCT // Explicitly instantiate these types #if INCLUDE_ALL_GCS template class Hashtable<nmethod*, mtGC>; template class HashtableEntry<nmethod*, mtGC>;
*** 381,385 **** --- 385,391 ---- template void BasicHashtable<mtClass>::verify_table<DictionaryEntry>(char const*); template void BasicHashtable<mtModule>::verify_table<ModuleEntry>(char const*); template void BasicHashtable<mtModule>::verify_table<PackageEntry>(char const*); template void BasicHashtable<mtClass>::verify_table<ProtectionDomainCacheEntry>(char const*); + template void BasicHashtable<mtClass>::verify_table<PlaceholderEntry>(char const*); +
< prev index next >