mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 06:14:49 +02:00
8015422: Large performance hit when the StringTable is walked twice in Parallel Scavenge
Combine the calls to StringTable::unlink and StringTable::oops_do in Parallel Scavenge. Reviewed-by: pliden, coleenp
This commit is contained in:
parent
8b7d3c5d3b
commit
c13149ab8d
3 changed files with 11 additions and 7 deletions
|
@ -737,7 +737,7 @@ oop StringTable::intern(const char* utf8_string, TRAPS) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StringTable::unlink(BoolObjectClosure* is_alive) {
|
void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f) {
|
||||||
// Readers of the table are unlocked, so we should only be removing
|
// Readers of the table are unlocked, so we should only be removing
|
||||||
// entries at a safepoint.
|
// entries at a safepoint.
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
||||||
|
@ -748,6 +748,9 @@ void StringTable::unlink(BoolObjectClosure* is_alive) {
|
||||||
assert(!entry->is_shared(), "CDS not used for the StringTable");
|
assert(!entry->is_shared(), "CDS not used for the StringTable");
|
||||||
|
|
||||||
if (is_alive->do_object_b(entry->literal())) {
|
if (is_alive->do_object_b(entry->literal())) {
|
||||||
|
if (f != NULL) {
|
||||||
|
f->do_oop((oop*)entry->literal_addr());
|
||||||
|
}
|
||||||
p = entry->next_addr();
|
p = entry->next_addr();
|
||||||
} else {
|
} else {
|
||||||
*p = entry->next();
|
*p = entry->next();
|
||||||
|
|
|
@ -272,7 +272,10 @@ public:
|
||||||
|
|
||||||
// GC support
|
// GC support
|
||||||
// Delete pointers to otherwise-unreachable objects.
|
// Delete pointers to otherwise-unreachable objects.
|
||||||
static void unlink(BoolObjectClosure* cl);
|
static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f);
|
||||||
|
static void unlink(BoolObjectClosure* cl) {
|
||||||
|
unlink_or_oops_do(cl, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
// Invoke "f->do_oop" on the locations of all oops in the table.
|
// Invoke "f->do_oop" on the locations of all oops in the table.
|
||||||
static void oops_do(OopClosure* f);
|
static void oops_do(OopClosure* f);
|
||||||
|
|
|
@ -450,11 +450,9 @@ bool PSScavenge::invoke_no_policy() {
|
||||||
reference_processor()->enqueue_discovered_references(NULL);
|
reference_processor()->enqueue_discovered_references(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlink any dead interned Strings
|
// Unlink any dead interned Strings and process the remaining live ones.
|
||||||
StringTable::unlink(&_is_alive_closure);
|
|
||||||
// Process the remaining live ones
|
|
||||||
PSScavengeRootsClosure root_closure(promotion_manager);
|
PSScavengeRootsClosure root_closure(promotion_manager);
|
||||||
StringTable::oops_do(&root_closure);
|
StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
|
||||||
|
|
||||||
// Finally, flush the promotion_manager's labs, and deallocate its stacks.
|
// Finally, flush the promotion_manager's labs, and deallocate its stacks.
|
||||||
PSPromotionManager::post_scavenge();
|
PSPromotionManager::post_scavenge();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue