Created
August 23, 2024 15:14
-
-
Save tstuefe/5111c735b12f6d9c3c1d32699d0820f6 to your computer and use it in GitHub Desktop.
Make Metaspace::deallocate smarter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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