Skip to content

8361706: Parallel weak klass link cleaning does not clean out previous klasses #26263

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/shared/parallelCleaning.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,6 @@ void KlassCleaningTask::work() {
// All workers will help cleaning the classes,
InstanceKlass* klass;
while ((klass = claim_next_klass()) != nullptr) {
clean_klass(klass);
Klass::clean_weak_instanceklass_links(klass);
}
}
4 changes: 0 additions & 4 deletions src/hotspot/share/gc/shared/parallelCleaning.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,6 @@ class KlassCleaningTask : public StackObj {

public:

void clean_klass(InstanceKlass* ik) {
ik->clean_weak_instanceklass_links();
}

void work();
};

Expand Down
17 changes: 10 additions & 7 deletions src/hotspot/share/oops/klass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -749,17 +749,20 @@ void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_kla
// Clean the implementors list and method data.
if (clean_alive_klasses && current->is_instance_klass()) {
InstanceKlass* ik = InstanceKlass::cast(current);
ik->clean_weak_instanceklass_links();

// JVMTI RedefineClasses creates previous versions that are not in
// the class hierarchy, so process them here.
while ((ik = ik->previous_versions()) != nullptr) {
ik->clean_weak_instanceklass_links();
}
clean_weak_instanceklass_links(ik);
}
}
}

void Klass::clean_weak_instanceklass_links(InstanceKlass* ik) {
ik->clean_weak_instanceklass_links();
// JVMTI RedefineClasses creates previous versions that are not in
// the class hierarchy, so process them here.
while ((ik = ik->previous_versions()) != nullptr) {
ik->clean_weak_instanceklass_links();
}
}

void Klass::metaspace_pointers_do(MetaspaceClosure* it) {
if (log_is_enabled(Trace, aot)) {
ResourceMark rm;
Expand Down
3 changes: 3 additions & 0 deletions src/hotspot/share/oops/klass.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,10 @@ class Klass : public Metadata {

void clean_subklass();

// Clean out unnecessary weak klass links from the whole klass hierarchy.
static void clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses = true);
// Clean out unnecessary weak klass links from the given InstanceKlass.
static void clean_weak_instanceklass_links(InstanceKlass* ik);

// Return self, except for abstract classes with exactly 1
// implementor. Then return the 1 concrete implementation.
Expand Down