Skip to content

Instantly share code, notes, and snippets.

@tstuefe
Created August 23, 2024 15:14
Show Gist options
  • Save tstuefe/5111c735b12f6d9c3c1d32699d0820f6 to your computer and use it in GitHub Desktop.
Save tstuefe/5111c735b12f6d9c3c1d32699d0820f6 to your computer and use it in GitHub Desktop.
Make Metaspace::deallocate smarter
diff --git a/src/hotspot/share/memory/classLoaderMetaspace.cpp b/src/hotspot/share/memory/classLoaderMetaspace.cpp
index 3315c15e677..20b501cc52a 100644
--- a/src/hotspot/share/memory/classLoaderMetaspace.cpp
+++ b/src/hotspot/share/memory/classLoaderMetaspace.cpp
@@ -130,8 +130,9 @@ MetaWord* ClassLoaderMetaspace::expand_and_allocate(size_t word_size, Metaspace:
// Prematurely returns a metaspace allocation to the _block_freelists
// because it is not needed anymore.
-void ClassLoaderMetaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) {
+void ClassLoaderMetaspace::deallocate(MetaWord* ptr, size_t word_size) {
MutexLocker fcl(lock(), Mutex::_no_safepoint_check_flag);
+ const bool is_class = Metaspace::contains_in_class_space(ptr);
if (Metaspace::using_class_space() && is_class) {
class_space_arena()->deallocate(ptr, word_size);
} else {
diff --git a/src/hotspot/share/memory/classLoaderMetaspace.hpp b/src/hotspot/share/memory/classLoaderMetaspace.hpp
index 525c63dde3e..e2a4c3098c1 100644
--- a/src/hotspot/share/memory/classLoaderMetaspace.hpp
+++ b/src/hotspot/share/memory/classLoaderMetaspace.hpp
@@ -92,7 +92,7 @@ class ClassLoaderMetaspace : public CHeapObj<mtClass> {
// Prematurely returns a metaspace allocation to the _block_freelists
// because it is not needed anymore.
- void deallocate(MetaWord* ptr, size_t word_size, bool is_class);
+ void deallocate(MetaWord* ptr, size_t word_size);
// Update statistics. This walks all in-use chunks.
void add_to_statistics(metaspace::ClmsStats* out) const;
diff --git a/src/hotspot/share/memory/metadataFactory.hpp b/src/hotspot/share/memory/metadataFactory.hpp
index 76ea469cebf..f5935c588d7 100644
--- a/src/hotspot/share/memory/metadataFactory.hpp
+++ b/src/hotspot/share/memory/metadataFactory.hpp
@@ -54,7 +54,7 @@ class MetadataFactory : AllStatic {
assert(loader_data != nullptr, "shouldn't pass null");
assert(!data->is_shared(), "cannot deallocate array in shared spaces");
int size = data->size();
- loader_data->metaspace_non_null()->deallocate((MetaWord*)data, size, false);
+ loader_data->metaspace_non_null()->deallocate((MetaWord*)data, size);
}
}
@@ -68,7 +68,6 @@ class MetadataFactory : AllStatic {
assert(!md->on_stack(), "can't deallocate things on stack");
assert(!md->is_shared(), "cannot deallocate if in shared spaces");
md->deallocate_contents(loader_data);
- bool is_klass = md->is_in_klass_space();
// Call the destructor. This is currently used for MethodData which has a member
// that needs to be destructed to release resources. Most Metadata derived classes have noop
// destructors and/or cleanup using deallocate_contents.
@@ -76,7 +75,7 @@ class MetadataFactory : AllStatic {
// or volatile so we can call the destructor of the type T points to.
using U = std::remove_cv_t<T>;
md->~U();
- loader_data->metaspace_non_null()->deallocate((MetaWord*)md, size, is_klass);
+ loader_data->metaspace_non_null()->deallocate((MetaWord*)md, size);
}
}
};
diff --git a/src/hotspot/share/memory/metaspace.cpp b/src/hotspot/share/memory/metaspace.cpp
index 7e01b42a873..cf5ffd53ce0 100644
--- a/src/hotspot/share/memory/metaspace.cpp
+++ b/src/hotspot/share/memory/metaspace.cpp
@@ -985,9 +985,14 @@ bool Metaspace::contains(const void* ptr) {
}
bool Metaspace::contains_non_shared(const void* ptr) {
- if (using_class_space() && VirtualSpaceList::vslist_class()->contains((MetaWord*)ptr)) {
- return true;
- }
+ return contains_in_class_space(ptr) || contains_in_nonclass_space(ptr);
+}
+bool Metaspace::contains_in_nonclass_space(const void* ptr) {
return VirtualSpaceList::vslist_nonclass()->contains((MetaWord*)ptr);
}
+
+bool Metaspace::contains_in_class_space(const void* ptr) {
+ return using_class_space() && VirtualSpaceList::vslist_class()->contains((MetaWord*)ptr);
+}
+
diff --git a/src/hotspot/share/memory/metaspace.hpp b/src/hotspot/share/memory/metaspace.hpp
index a90ff775647..e94ccc3a18d 100644
--- a/src/hotspot/share/memory/metaspace.hpp
+++ b/src/hotspot/share/memory/metaspace.hpp
@@ -115,6 +115,8 @@ class Metaspace : public AllStatic {
static bool contains(const void* ptr);
static bool contains_non_shared(const void* ptr);
+ static bool contains_in_nonclass_space(const void* ptr);
+ static bool contains_in_class_space(const void* ptr);
// Free empty virtualspaces
static void purge(bool classes_unloaded);
diff --git a/test/hotspot/gtest/metaspace/test_metaspace_misc.cpp b/test/hotspot/gtest/metaspace/test_metaspace_misc.cpp
index 6a2282960e6..2834bc64666 100644
--- a/test/hotspot/gtest/metaspace/test_metaspace_misc.cpp
+++ b/test/hotspot/gtest/metaspace/test_metaspace_misc.cpp
@@ -67,7 +67,7 @@ TEST_VM(metaspace, misc_max_alloc_size) {
ASSERT_NOT_NULL(p);
}
// And also, successfully deallocate it.
- cld->metaspace_non_null()->deallocate(p, sz, in_class_space);
+ cld->metaspace_non_null()->deallocate(p, sz);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment