8275712: Hashtable literal_size functions are broken

Reviewed-by: coleenp, zgu
This commit is contained in:
Stefan Karlsson 2021-10-22 08:20:43 +00:00
parent fab3d6c612
commit 1efe946db7
2 changed files with 24 additions and 19 deletions

View file

@ -538,18 +538,19 @@ void StringTable::rehash_table() {
} }
// Statistics // Statistics
static int literal_size(oop obj) { static size_t literal_size(oop obj) {
// NOTE: this would over-count if (pre-JDK8)
// java_lang_Class::has_offset_field() is true and the String.value array is
// shared by several Strings. However, starting from JDK8, the String.value
// array is not shared anymore.
if (obj == NULL) { if (obj == NULL) {
return 0; return 0;
} else if (obj->klass() == vmClasses::String_klass()) {
return (obj->size() + java_lang_String::value(obj)->size()) * HeapWordSize;
} else {
return obj->size();
} }
size_t word_size = obj->size();
if (obj->klass() == vmClasses::String_klass()) {
// This may overcount if String.value arrays are shared.
word_size += java_lang_String::value(obj)->size();
}
return word_size * HeapWordSize;
} }
struct SizeFunc : StackObj { struct SizeFunc : StackObj {

View file

@ -75,24 +75,28 @@ template <MEMFLAGS F> void BasicHashtable<F>::free_buckets() {
} }
// Default overload, for types that are uninteresting. // Default overload, for types that are uninteresting.
template<typename T> static int literal_size(T) { return 0; } template<typename T> static size_t literal_size(T) { return 0; }
static int literal_size(Symbol *symbol) { static size_t literal_size(Symbol *symbol) {
return symbol->size() * HeapWordSize; return symbol->size() * HeapWordSize;
} }
static int literal_size(oop obj) { static size_t literal_size(oop obj) {
if (obj == NULL) { if (obj == NULL) {
return 0; return 0;
} else if (obj->klass() == vmClasses::String_klass()) {
// This may overcount if String.value arrays are shared.
return (obj->size() + java_lang_String::value(obj)->size()) * HeapWordSize;
} else {
return obj->size();
}
} }
static int literal_size(WeakHandle v) { size_t word_size = obj->size();
if (obj->klass() == vmClasses::String_klass()) {
// This may overcount if String.value arrays are shared.
word_size += java_lang_String::value(obj)->size();
}
return word_size * HeapWordSize;
}
static size_t literal_size(WeakHandle v) {
return literal_size(v.peek()); return literal_size(v.peek());
} }
@ -175,7 +179,7 @@ template <MEMFLAGS F> bool BasicHashtable<F>::maybe_grow(int max_size, int load_
template <class T, MEMFLAGS F> TableStatistics Hashtable<T, F>::statistics_calculate(T (*literal_load_barrier)(HashtableEntry<T, F>*)) { template <class T, MEMFLAGS F> TableStatistics Hashtable<T, F>::statistics_calculate(T (*literal_load_barrier)(HashtableEntry<T, F>*)) {
NumberSeq summary; NumberSeq summary;
int literal_bytes = 0; size_t literal_bytes = 0;
for (int i = 0; i < this->table_size(); ++i) { for (int i = 0; i < this->table_size(); ++i) {
int count = 0; int count = 0;
for (HashtableEntry<T, F>* e = this->bucket(i); for (HashtableEntry<T, F>* e = this->bucket(i);