mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8019375: Internal symbol table size should be tunable
Reviewed-by: coleenp, kamg
This commit is contained in:
parent
088ded71f9
commit
c3d0e64506
6 changed files with 19 additions and 22 deletions
|
@ -44,12 +44,10 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
|
||||||
private static synchronized void initialize(TypeDataBase db) {
|
private static synchronized void initialize(TypeDataBase db) {
|
||||||
Type type = db.lookupType("SymbolTable");
|
Type type = db.lookupType("SymbolTable");
|
||||||
theTableField = type.getAddressField("_the_table");
|
theTableField = type.getAddressField("_the_table");
|
||||||
symbolTableSize = db.lookupIntConstant("SymbolTable::symbol_table_size").intValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
private static AddressField theTableField;
|
private static AddressField theTableField;
|
||||||
private static int symbolTableSize;
|
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
public static SymbolTable getTheTable() {
|
public static SymbolTable getTheTable() {
|
||||||
|
@ -57,10 +55,6 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
|
||||||
return (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);
|
return (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getSymbolTableSize() {
|
|
||||||
return symbolTableSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SymbolTable(Address addr) {
|
public SymbolTable(Address addr) {
|
||||||
super(addr);
|
super(addr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,18 +107,13 @@ private:
|
||||||
add(loader_data, cp, names_count, name, lengths, cp_indices, hashValues, THREAD);
|
add(loader_data, cp, names_count, name, lengths, cp_indices, hashValues, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Table size
|
|
||||||
enum {
|
|
||||||
symbol_table_size = 20011
|
|
||||||
};
|
|
||||||
|
|
||||||
Symbol* lookup(int index, const char* name, int len, unsigned int hash);
|
Symbol* lookup(int index, const char* name, int len, unsigned int hash);
|
||||||
|
|
||||||
SymbolTable()
|
SymbolTable()
|
||||||
: Hashtable<Symbol*, mtSymbol>(symbol_table_size, sizeof (HashtableEntry<Symbol*, mtSymbol>)) {}
|
: Hashtable<Symbol*, mtSymbol>(SymbolTableSize, sizeof (HashtableEntry<Symbol*, mtSymbol>)) {}
|
||||||
|
|
||||||
SymbolTable(HashtableBucket<mtSymbol>* t, int number_of_entries)
|
SymbolTable(HashtableBucket<mtSymbol>* t, int number_of_entries)
|
||||||
: Hashtable<Symbol*, mtSymbol>(symbol_table_size, sizeof (HashtableEntry<Symbol*, mtSymbol>), t,
|
: Hashtable<Symbol*, mtSymbol>(SymbolTableSize, sizeof (HashtableEntry<Symbol*, mtSymbol>), t,
|
||||||
number_of_entries) {}
|
number_of_entries) {}
|
||||||
|
|
||||||
// Arena for permanent symbols (null class loader) that are never unloaded
|
// Arena for permanent symbols (null class loader) that are never unloaded
|
||||||
|
@ -136,6 +131,9 @@ public:
|
||||||
// The symbol table
|
// The symbol table
|
||||||
static SymbolTable* the_table() { return _the_table; }
|
static SymbolTable* the_table() { return _the_table; }
|
||||||
|
|
||||||
|
// Size of one bucket in the string table. Used when checking for rollover.
|
||||||
|
static uint bucket_size() { return sizeof(HashtableBucket<mtSymbol>); }
|
||||||
|
|
||||||
static void create_table() {
|
static void create_table() {
|
||||||
assert(_the_table == NULL, "One symbol table allowed.");
|
assert(_the_table == NULL, "One symbol table allowed.");
|
||||||
_the_table = new SymbolTable();
|
_the_table = new SymbolTable();
|
||||||
|
@ -145,8 +143,11 @@ public:
|
||||||
static void create_table(HashtableBucket<mtSymbol>* t, int length,
|
static void create_table(HashtableBucket<mtSymbol>* t, int length,
|
||||||
int number_of_entries) {
|
int number_of_entries) {
|
||||||
assert(_the_table == NULL, "One symbol table allowed.");
|
assert(_the_table == NULL, "One symbol table allowed.");
|
||||||
assert(length == symbol_table_size * sizeof(HashtableBucket<mtSymbol>),
|
|
||||||
"bad shared symbol size.");
|
// If CDS archive used a different symbol table size, use that size instead
|
||||||
|
// which is better than giving an error.
|
||||||
|
SymbolTableSize = length/bucket_size();
|
||||||
|
|
||||||
_the_table = new SymbolTable(t, number_of_entries);
|
_the_table = new SymbolTable(t, number_of_entries);
|
||||||
// if CDS give symbol table a default arena size since most symbols
|
// if CDS give symbol table a default arena size since most symbols
|
||||||
// are already allocated in the shared misc section.
|
// are already allocated in the shared misc section.
|
||||||
|
|
|
@ -2045,6 +2045,9 @@ bool Arguments::check_vm_args_consistency() {
|
||||||
status = status && verify_interval(StringTableSize, minimumStringTableSize,
|
status = status && verify_interval(StringTableSize, minimumStringTableSize,
|
||||||
(max_uintx / StringTable::bucket_size()), "StringTable size");
|
(max_uintx / StringTable::bucket_size()), "StringTable size");
|
||||||
|
|
||||||
|
status = status && verify_interval(SymbolTableSize, minimumSymbolTableSize,
|
||||||
|
(max_uintx / SymbolTable::bucket_size()), "SymbolTable size");
|
||||||
|
|
||||||
if (MinHeapFreeRatio > MaxHeapFreeRatio) {
|
if (MinHeapFreeRatio > MaxHeapFreeRatio) {
|
||||||
jio_fprintf(defaultStream::error_stream(),
|
jio_fprintf(defaultStream::error_stream(),
|
||||||
"MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or "
|
"MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or "
|
||||||
|
|
|
@ -3727,6 +3727,9 @@ class CommandLineFlags {
|
||||||
product(uintx, StringTableSize, defaultStringTableSize, \
|
product(uintx, StringTableSize, defaultStringTableSize, \
|
||||||
"Number of buckets in the interned String table") \
|
"Number of buckets in the interned String table") \
|
||||||
\
|
\
|
||||||
|
experimental(uintx, SymbolTableSize, defaultSymbolTableSize, \
|
||||||
|
"Number of buckets in the JVM internal Symbol table") \
|
||||||
|
\
|
||||||
develop(bool, TraceDefaultMethods, false, \
|
develop(bool, TraceDefaultMethods, false, \
|
||||||
"Trace the default method processing steps") \
|
"Trace the default method processing steps") \
|
||||||
\
|
\
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include "classfile/javaClasses.hpp"
|
#include "classfile/javaClasses.hpp"
|
||||||
#include "classfile/loaderConstraints.hpp"
|
#include "classfile/loaderConstraints.hpp"
|
||||||
#include "classfile/placeholders.hpp"
|
#include "classfile/placeholders.hpp"
|
||||||
#include "classfile/symbolTable.hpp"
|
|
||||||
#include "classfile/systemDictionary.hpp"
|
#include "classfile/systemDictionary.hpp"
|
||||||
#include "ci/ciField.hpp"
|
#include "ci/ciField.hpp"
|
||||||
#include "ci/ciInstance.hpp"
|
#include "ci/ciInstance.hpp"
|
||||||
|
@ -2249,12 +2248,6 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary;
|
||||||
declare_preprocessor_constant("PERFDATA_BIG_ENDIAN", PERFDATA_BIG_ENDIAN) \
|
declare_preprocessor_constant("PERFDATA_BIG_ENDIAN", PERFDATA_BIG_ENDIAN) \
|
||||||
declare_preprocessor_constant("PERFDATA_LITTLE_ENDIAN", PERFDATA_LITTLE_ENDIAN) \
|
declare_preprocessor_constant("PERFDATA_LITTLE_ENDIAN", PERFDATA_LITTLE_ENDIAN) \
|
||||||
\
|
\
|
||||||
/***************/ \
|
|
||||||
/* SymbolTable */ \
|
|
||||||
/***************/ \
|
|
||||||
\
|
|
||||||
declare_constant(SymbolTable::symbol_table_size) \
|
|
||||||
\
|
|
||||||
/***********************************/ \
|
/***********************************/ \
|
||||||
/* LoaderConstraintTable constants */ \
|
/* LoaderConstraintTable constants */ \
|
||||||
/***********************************/ \
|
/***********************************/ \
|
||||||
|
|
|
@ -333,6 +333,9 @@ const int max_method_code_size = 64*K - 1; // JVM spec, 2nd ed. section 4.8.1 (
|
||||||
const int defaultStringTableSize = NOT_LP64(1009) LP64_ONLY(60013);
|
const int defaultStringTableSize = NOT_LP64(1009) LP64_ONLY(60013);
|
||||||
const int minimumStringTableSize=1009;
|
const int minimumStringTableSize=1009;
|
||||||
|
|
||||||
|
const int defaultSymbolTableSize = 20011;
|
||||||
|
const int minimumSymbolTableSize = 1009;
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
// HotSwap - for JVMTI aka Class File Replacement and PopFrame
|
// HotSwap - for JVMTI aka Class File Replacement and PopFrame
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue