6962930: make the string table size configurable
Reviewed-by: never, phh, stefank, kamg, dholmes, coleenp
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java Mon Mar 21 14:06:50 2011 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java Mon Mar 21 18:38:00 2011 -0700
@@ -44,12 +44,10 @@
private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("StringTable");
theTableField = type.getAddressField("_the_table");
- stringTableSize = db.lookupIntConstant("StringTable::string_table_size").intValue();
}
// Fields
private static AddressField theTableField;
- private static int stringTableSize;
// Accessors
public static StringTable getTheTable() {
@@ -57,10 +55,6 @@
return (StringTable) VMObjectFactory.newObject(StringTable.class, tmp);
}
- public static int getStringTableSize() {
- return stringTableSize;
- }
-
public StringTable(Address addr) {
super(addr);
}
--- a/hotspot/src/share/vm/classfile/symbolTable.hpp Mon Mar 21 14:06:50 2011 -0700
+++ b/hotspot/src/share/vm/classfile/symbolTable.hpp Mon Mar 21 18:38:00 2011 -0700
@@ -216,18 +216,14 @@
oop basic_add(int index, Handle string_or_null, jchar* name, int len,
unsigned int hashValue, TRAPS);
- // Table size
- enum {
- string_table_size = 1009
- };
-
oop lookup(int index, jchar* chars, int length, unsigned int hashValue);
- StringTable() : Hashtable<oop>(string_table_size, sizeof (HashtableEntry<oop>)) {}
+ StringTable() : Hashtable<oop>((int)StringTableSize,
+ sizeof (HashtableEntry<oop>)) {}
StringTable(HashtableBucket* t, int number_of_entries)
- : Hashtable<oop>(string_table_size, sizeof (HashtableEntry<oop>), t,
- number_of_entries) {}
+ : Hashtable<oop>((int)StringTableSize, sizeof (HashtableEntry<oop>), t,
+ number_of_entries) {}
public:
// The string table
@@ -241,7 +237,7 @@
static void create_table(HashtableBucket* t, int length,
int number_of_entries) {
assert(_the_table == NULL, "One string table allowed.");
- assert(length == string_table_size * sizeof(HashtableBucket),
+ assert((size_t)length == StringTableSize * sizeof(HashtableBucket),
"bad shared string size.");
_the_table = new StringTable(t, number_of_entries);
}
--- a/hotspot/src/share/vm/runtime/arguments.cpp Mon Mar 21 14:06:50 2011 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Mon Mar 21 18:38:00 2011 -0700
@@ -2819,22 +2819,38 @@
}
void Arguments::set_shared_spaces_flags() {
+ const bool must_share = DumpSharedSpaces || RequireSharedSpaces;
+ const bool might_share = must_share || UseSharedSpaces;
+
+ // The string table is part of the shared archive so the size must match.
+ if (!FLAG_IS_DEFAULT(StringTableSize)) {
+ // Disable sharing.
+ if (must_share) {
+ warning("disabling shared archive %s because of non-default "
+ "StringTableSize", DumpSharedSpaces ? "creation" : "use");
+ }
+ if (might_share) {
+ FLAG_SET_DEFAULT(DumpSharedSpaces, false);
+ FLAG_SET_DEFAULT(RequireSharedSpaces, false);
+ FLAG_SET_DEFAULT(UseSharedSpaces, false);
+ }
+ return;
+ }
+
// Check whether class data sharing settings conflict with GC, compressed oops
// or page size, and fix them up. Explicit sharing options override other
// settings.
const bool cannot_share = UseConcMarkSweepGC || CMSIncrementalMode ||
UseG1GC || UseParNewGC || UseParallelGC || UseParallelOldGC ||
UseCompressedOops || UseLargePages && FLAG_IS_CMDLINE(UseLargePages);
- const bool must_share = DumpSharedSpaces || RequireSharedSpaces;
- const bool might_share = must_share || UseSharedSpaces;
if (cannot_share) {
if (must_share) {
- warning("selecting serial gc and disabling large pages %s"
- "because of %s", "" LP64_ONLY("and compressed oops "),
- DumpSharedSpaces ? "-Xshare:dump" : "-Xshare:on");
- force_serial_gc();
- FLAG_SET_CMDLINE(bool, UseLargePages, false);
- LP64_ONLY(FLAG_SET_CMDLINE(bool, UseCompressedOops, false));
+ warning("selecting serial gc and disabling large pages %s"
+ "because of %s", "" LP64_ONLY("and compressed oops "),
+ DumpSharedSpaces ? "-Xshare:dump" : "-Xshare:on");
+ force_serial_gc();
+ FLAG_SET_CMDLINE(bool, UseLargePages, false);
+ LP64_ONLY(FLAG_SET_CMDLINE(bool, UseCompressedOops, false));
} else {
if (UseSharedSpaces && Verbose) {
warning("turning off use of shared archive because of "
--- a/hotspot/src/share/vm/runtime/globals.hpp Mon Mar 21 14:06:50 2011 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Mon Mar 21 18:38:00 2011 -0700
@@ -3756,6 +3756,9 @@
diagnostic(bool, PrintDTraceDOF, false, \
"Print the DTrace DOF passed to the system for JSDT probes") \
\
+ product(uintx, StringTableSize, 1009, \
+ "Number of buckets in the interned String table") \
+ \
product(bool, UseVMInterruptibleIO, false, \
"(Unstable, Solaris-specific) Thread interrupt before or with " \
"EINTR for I/O operations results in OS_INTRPT. The default value"\
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Mar 21 14:06:50 2011 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Mar 21 18:38:00 2011 -0700
@@ -1553,12 +1553,6 @@
\
declare_constant(SymbolTable::symbol_table_size) \
\
- /***************/ \
- /* StringTable */ \
- /***************/ \
- \
- declare_constant(StringTable::string_table_size) \
- \
/********************/ \
/* SystemDictionary */ \
/********************/ \