diff a/src/hotspot/share/classfile/stringTable.cpp b/src/hotspot/share/classfile/stringTable.cpp --- a/src/hotspot/share/classfile/stringTable.cpp +++ b/src/hotspot/share/classfile/stringTable.cpp @@ -215,28 +215,20 @@ size_t StringTable::item_added() { return Atomic::add(&_items_count, (size_t)1); } -size_t StringTable::add_items_to_clean(size_t ndead) { - size_t total = Atomic::add(&_uncleaned_items_count, (size_t)ndead); - log_trace(stringtable)( - "Uncleaned items:" SIZE_FORMAT " added: " SIZE_FORMAT " total:" SIZE_FORMAT, - _uncleaned_items_count, ndead, total); - return total; -} - void StringTable::item_removed() { Atomic::add(&_items_count, (size_t)-1); } double StringTable::get_load_factor() { - return (double)_items_count/_current_size; + return double(_items_count)/double(_current_size); } double StringTable::get_dead_factor() { - return (double)_uncleaned_items_count/_current_size; + return double(_uncleaned_items_count)/double(_current_size); } size_t StringTable::table_size() { return ((size_t)1) << _local_table->get_size_log2(Thread::current()); } @@ -447,11 +439,13 @@ bdt.done(jt); } log_debug(stringtable)("Cleaned %ld of %ld", stdc._count, stdc._item); } -void StringTable::check_concurrent_work() { +void StringTable::gc_notification(size_t dead_count) { + _uncleaned_items_count += dead_count; + if (_has_work) { return; } double load_factor = StringTable::get_load_factor(); @@ -462,10 +456,11 @@ if ((dead_factor > load_factor) || (load_factor > PREF_AVG_LIST_LEN) || (dead_factor > CLEAN_DEAD_HIGH_WATER_MARK)) { log_debug(stringtable)("Concurrent work triggered, live factor: %g dead factor: %g", load_factor, dead_factor); + _uncleaned_items_count = 0; trigger_concurrent_work(); } } void StringTable::do_concurrent_work(JavaThread* jt) {