--- a/src/hotspot/share/classfile/symbolTable.cpp Thu Oct 17 20:27:44 2019 +0100
+++ b/src/hotspot/share/classfile/symbolTable.cpp Thu Oct 17 20:53:35 2019 +0100
@@ -45,10 +45,8 @@
// and not set it too short before we decide to resize,
// to match previous startup behavior
const double PREF_AVG_LIST_LEN = 8.0;
-// 2^17 (131,072) is max size, which is about 6.5 times as large
-// as the previous table size (used to be 20,011),
-// which never resized
-const size_t END_SIZE = 17;
+// 2^24 is max size, like StringTable.
+const size_t END_SIZE = 24;
// If a chain gets to 100 something might be wrong
const size_t REHASH_LEN = 100;
@@ -77,8 +75,7 @@
// --------------------------------------------------------------------------
-typedef ConcurrentHashTable<Symbol*,
- SymbolTableConfig, mtSymbol> SymbolTableHash;
+typedef ConcurrentHashTable<SymbolTableConfig, mtSymbol> SymbolTableHash;
static SymbolTableHash* _local_table = NULL;
volatile bool SymbolTable::_has_work = 0;
@@ -121,10 +118,12 @@
}
#endif
-class SymbolTableConfig : public SymbolTableHash::BaseConfig {
+class SymbolTableConfig : public AllStatic {
private:
public:
- static uintx get_hash(Symbol* const& value, bool* is_dead) {
+ typedef Symbol* Value; // value of the Node in the hashtable
+
+ static uintx get_hash(Value const& value, bool* is_dead) {
*is_dead = (value->refcount() == 0);
if (*is_dead) {
return 0;
@@ -133,11 +132,11 @@
}
}
// We use default allocation/deallocation but counted
- static void* allocate_node(size_t size, Symbol* const& value) {
+ static void* allocate_node(size_t size, Value const& value) {
SymbolTable::item_added();
- return SymbolTableHash::BaseConfig::allocate_node(size, value);
+ return AllocateHeap(size, mtSymbol);
}
- static void free_node(void* memory, Symbol* const& value) {
+ static void free_node(void* memory, Value const& value) {
// We get here because #1 some threads lost a race to insert a newly created Symbol
// or #2 we're cleaning up unused symbol.
// If #1, then the symbol can be either permanent (refcount==PERM_REFCOUNT),
@@ -150,7 +149,7 @@
assert(value->refcount() == 0, "expected dead symbol");
}
SymbolTable::delete_symbol(value);
- SymbolTableHash::BaseConfig::free_node(memory, value);
+ FreeHeap(memory);
SymbolTable::item_removed();
}
};
@@ -221,7 +220,7 @@
assert (len <= Symbol::max_length(), "should be checked by caller");
Symbol* sym;
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
c_heap = false;
}
if (c_heap) {
@@ -267,7 +266,7 @@
// all symbols from the dynamic table
SymbolsDo sd(cl);
if (!_local_table->try_scan(Thread::current(), sd)) {
- log_info(stringtable)("symbols_do unavailable at this moment");
+ log_info(symboltable)("symbols_do unavailable at this moment");
}
}
@@ -284,7 +283,7 @@
};
void SymbolTable::metaspace_pointers_do(MetaspaceClosure* it) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "called only during dump time");
+ Arguments::assert_is_dumping_archive();
MetaspacePointersDo mpd(it);
_local_table->do_safepoint_scan(mpd);
}
@@ -557,7 +556,7 @@
Thread* thr = Thread::current();
VerifySymbols vs;
if (!_local_table->try_scan(thr, vs)) {
- log_info(stringtable)("verify unavailable at this moment");
+ log_info(symboltable)("verify unavailable at this moment");
}
}
@@ -623,13 +622,11 @@
}
void SymbolTable::write_to_archive(bool is_static_archive) {
- _shared_table.reset();
- _dynamic_shared_table.reset();
-
CompactHashtableWriter writer(int(_items_count),
&MetaspaceShared::stats()->symbol);
copy_shared_symbol_table(&writer);
if (is_static_archive) {
+ _shared_table.reset();
writer.dump(&_shared_table, "symbol");
// Verify table is correct
@@ -639,6 +636,7 @@
unsigned int hash = hash_symbol(name, len, _alt_hash);
assert(sym == _shared_table.lookup(name, hash, len), "sanity");
} else {
+ _dynamic_shared_table.reset();
writer.dump(&_dynamic_shared_table, "symbol");
}
}
@@ -764,8 +762,9 @@
return false;
}
- // We use max size
- SymbolTableHash* new_table = new SymbolTableHash(END_SIZE, END_SIZE, REHASH_LEN);
+ // We use current size
+ size_t new_size = _local_table->get_size_log2(Thread::current());
+ SymbolTableHash* new_table = new SymbolTableHash(new_size, END_SIZE, REHASH_LEN);
// Use alt hash from now on
_alt_hash = true;
if (!_local_table->try_move_nodes_to(Thread::current(), new_table)) {