mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 01:54:47 +02:00
8275712: Hashtable literal_size functions are broken
Reviewed-by: coleenp, zgu
This commit is contained in:
parent
fab3d6c612
commit
1efe946db7
2 changed files with 24 additions and 19 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 int literal_size(WeakHandle v) {
|
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue