src/share/vm/classfile/stringTable.cpp
Print this page
@@ -35,10 +35,11 @@
#include "oops/oop.inline2.hpp"
#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "utilities/hashtable.inline.hpp"
#if INCLUDE_ALL_GCS
+#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
#include "gc_implementation/g1/g1StringDedup.hpp"
#endif
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
@@ -155,26 +156,44 @@
int length;
jchar* chars = symbol->as_unicode(length);
return lookup(chars, length);
}
+// Tell the GC that this string was looked up in the StringTable.
+static void ensure_string_alive(oop string) {
+ // A lookup in the StringTable could return an object that was previously
+ // considered dead. The SATB part of G1 needs to get notified about this
+ // potential resurrection, otherwise the marking might not find the object.
+#if INCLUDE_ALL_GCS
+ if (UseG1GC && string != NULL) {
+ G1SATBCardTableModRefBS::enqueue(string);
+ }
+#endif
+}
oop StringTable::lookup(jchar* name, int len) {
unsigned int hash = hash_string(name, len);
int index = the_table()->hash_to_index(hash);
- return the_table()->lookup(index, name, len, hash);
+ oop string = the_table()->lookup(index, name, len, hash);
+
+ ensure_string_alive(string);
+
+ return string;
}
oop StringTable::intern(Handle string_or_null, jchar* name,
int len, TRAPS) {
unsigned int hashValue = hash_string(name, len);
int index = the_table()->hash_to_index(hashValue);
oop found_string = the_table()->lookup(index, name, len, hashValue);
// Found
- if (found_string != NULL) return found_string;
+ if (found_string != NULL) {
+ ensure_string_alive(found_string);
+ return found_string;
+ }
debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
assert(!Universe::heap()->is_in_reserved(name),
"proposed name of symbol must be stable");
@@ -195,15 +214,21 @@
}
#endif
// Grab the StringTable_lock before getting the_table() because it could
// change at safepoint.
+ oop added_or_found;
+ {
MutexLocker ml(StringTable_lock, THREAD);
-
// Otherwise, add to symbol to table
- return the_table()->basic_add(index, string, name, len,
+ added_or_found = the_table()->basic_add(index, string, name, len,
hashValue, CHECK_NULL);
+ }
+
+ ensure_string_alive(added_or_found);
+
+ return added_or_found;
}
oop StringTable::intern(Symbol* symbol, TRAPS) {
if (symbol == NULL) return NULL;
ResourceMark rm(THREAD);