From aff5aa72bbf4ecea614339483581093a67efa265 Mon Sep 17 00:00:00 2001 From: Afshin Zafari Date: Tue, 1 Apr 2025 08:25:53 +0000 Subject: [PATCH] 8350566: NMT: add size parameter to MemTracker::record_virtual_memory_tag Reviewed-by: jsjolen, gziemski --- src/hotspot/share/cds/metaspaceShared.cpp | 7 +++---- src/hotspot/share/gc/g1/g1RegionToSpaceMapper.cpp | 2 +- src/hotspot/share/gc/parallel/parMarkBitMap.cpp | 2 +- src/hotspot/share/gc/parallel/psParallelCompact.cpp | 2 +- src/hotspot/share/gc/shared/cardTable.cpp | 2 +- src/hotspot/share/gc/shenandoah/shenandoahCardTable.cpp | 3 ++- .../share/gc/shenandoah/shenandoahCollectionSet.cpp | 2 +- src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp | 8 ++++---- .../share/jfr/recorder/storage/jfrVirtualMemory.cpp | 2 +- src/hotspot/share/memory/metaspace.cpp | 2 +- src/hotspot/share/memory/metaspace/virtualSpaceNode.cpp | 2 +- src/hotspot/share/nmt/memTracker.hpp | 9 +++++++-- src/hotspot/share/nmt/virtualMemoryTracker.cpp | 2 +- src/hotspot/share/nmt/virtualMemoryTracker.hpp | 2 +- 14 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp index ac43af3826a..277c6ce90e7 100644 --- a/src/hotspot/share/cds/metaspaceShared.cpp +++ b/src/hotspot/share/cds/metaspaceShared.cpp @@ -1532,7 +1532,7 @@ char* MetaspaceShared::reserve_address_space_for_archives(FileMapInfo* static_ma assert(base_address == nullptr || (address)archive_space_rs.base() == base_address, "Sanity"); // Register archive space with NMT. - MemTracker::record_virtual_memory_tag(archive_space_rs.base(), mtClassShared); + MemTracker::record_virtual_memory_tag(archive_space_rs, mtClassShared); return archive_space_rs.base(); } return nullptr; @@ -1605,9 +1605,8 @@ char* MetaspaceShared::reserve_address_space_for_archives(FileMapInfo* static_ma release_reserved_spaces(total_space_rs, archive_space_rs, class_space_rs); return nullptr; } - // NMT: fix up the space tags - MemTracker::record_virtual_memory_tag(archive_space_rs.base(), mtClassShared); - MemTracker::record_virtual_memory_tag(class_space_rs.base(), mtClass); + MemTracker::record_virtual_memory_tag(archive_space_rs, mtClassShared); + MemTracker::record_virtual_memory_tag(class_space_rs, mtClass); } else { if (use_archive_base_addr && base_address != nullptr) { total_space_rs = MemoryReserver::reserve((char*) base_address, diff --git a/src/hotspot/share/gc/g1/g1RegionToSpaceMapper.cpp b/src/hotspot/share/gc/g1/g1RegionToSpaceMapper.cpp index 33a9df79349..1710ceaf73a 100644 --- a/src/hotspot/share/gc/g1/g1RegionToSpaceMapper.cpp +++ b/src/hotspot/share/gc/g1/g1RegionToSpaceMapper.cpp @@ -47,7 +47,7 @@ G1RegionToSpaceMapper::G1RegionToSpaceMapper(ReservedSpace rs, guarantee(is_power_of_2(page_size), "must be"); guarantee(is_power_of_2(region_granularity), "must be"); - MemTracker::record_virtual_memory_tag((address)rs.base(), mem_tag); + MemTracker::record_virtual_memory_tag(rs, mem_tag); } // Used to manually signal a mapper to handle a set of regions as committed. diff --git a/src/hotspot/share/gc/parallel/parMarkBitMap.cpp b/src/hotspot/share/gc/parallel/parMarkBitMap.cpp index f1d309807b5..f33d7f93f1d 100644 --- a/src/hotspot/share/gc/parallel/parMarkBitMap.cpp +++ b/src/hotspot/share/gc/parallel/parMarkBitMap.cpp @@ -59,7 +59,7 @@ ParMarkBitMap::initialize(MemRegion covered_region) os::trace_page_sizes("Mark Bitmap", raw_bytes, raw_bytes, rs.base(), rs.size(), used_page_sz); - MemTracker::record_virtual_memory_tag((address)rs.base(), mtGC); + MemTracker::record_virtual_memory_tag(rs, mtGC); _virtual_space = new PSVirtualSpace(rs, page_sz); diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index 9f51aba080e..99b975c282a 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -256,7 +256,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size) os::trace_page_sizes("Parallel Compact Data", raw_bytes, raw_bytes, rs.base(), rs.size(), page_sz); - MemTracker::record_virtual_memory_tag((address)rs.base(), mtGC); + MemTracker::record_virtual_memory_tag(rs, mtGC); PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz); diff --git a/src/hotspot/share/gc/shared/cardTable.cpp b/src/hotspot/share/gc/shared/cardTable.cpp index fbfc07a4e09..3236d73933c 100644 --- a/src/hotspot/share/gc/shared/cardTable.cpp +++ b/src/hotspot/share/gc/shared/cardTable.cpp @@ -87,7 +87,7 @@ void CardTable::initialize(void* region0_start, void* region1_start) { "card marking array"); } - MemTracker::record_virtual_memory_tag((address)rs.base(), mtGC); + MemTracker::record_virtual_memory_tag(rs, mtGC); os::trace_page_sizes("Card Table", num_bytes, num_bytes, rs.base(), rs.size(), _page_size); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCardTable.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCardTable.cpp index b3284051ee7..00f11938489 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCardTable.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCardTable.cpp @@ -1,4 +1,5 @@ /* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -83,7 +84,7 @@ void ShenandoahCardTable::initialize(const ReservedSpace& card_table) { vm_exit_during_initialization("Could not reserve enough space for the card marking array"); } - MemTracker::record_virtual_memory_tag((address)card_table.base(), mtGC); + MemTracker::record_virtual_memory_tag(card_table, mtGC); os::trace_page_sizes("Card Table", _byte_map_size, _byte_map_size, card_table.base(), card_table.size(), _page_size); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp index c27b790fbf7..1d353163463 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp @@ -63,7 +63,7 @@ ShenandoahCollectionSet::ShenandoahCollectionSet(ShenandoahHeap* heap, ReservedS // subsystem for mapping not-yet-written-to pages to a single physical backing page, // but this is not guaranteed, and would confuse NMT and other memory accounting tools. - MemTracker::record_virtual_memory_tag(_map_space.base(), mtGC); + MemTracker::record_virtual_memory_tag(_map_space, mtGC); size_t page_size = os::vm_page_size(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index e38e1636fd1..32acb42c765 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -303,7 +303,7 @@ jint ShenandoahHeap::initialize() { bitmap_size_orig, bitmap_page_size, bitmap.base(), bitmap.size(), bitmap.page_size()); - MemTracker::record_virtual_memory_tag(bitmap.base(), mtGC); + MemTracker::record_virtual_memory_tag(bitmap, mtGC); _bitmap_region = MemRegion((HeapWord*) bitmap.base(), bitmap.size() / HeapWordSize); _bitmap_region_special = bitmap.special(); @@ -327,7 +327,7 @@ jint ShenandoahHeap::initialize() { os::commit_memory_or_exit(verify_bitmap.base(), verify_bitmap.size(), bitmap_page_size, false, "Cannot commit verification bitmap memory"); } - MemTracker::record_virtual_memory_tag(verify_bitmap.base(), mtGC); + MemTracker::record_virtual_memory_tag(verify_bitmap, mtGC); MemRegion verify_bitmap_region = MemRegion((HeapWord *) verify_bitmap.base(), verify_bitmap.size() / HeapWordSize); _verification_bit_map.initialize(_heap_region, verify_bitmap_region); _verifier = new ShenandoahVerifier(this, &_verification_bit_map); @@ -341,7 +341,7 @@ jint ShenandoahHeap::initialize() { bitmap_size_orig, aux_bitmap_page_size, aux_bitmap.base(), aux_bitmap.size(), aux_bitmap.page_size()); - MemTracker::record_virtual_memory_tag(aux_bitmap.base(), mtGC); + MemTracker::record_virtual_memory_tag(aux_bitmap, mtGC); _aux_bitmap_region = MemRegion((HeapWord*) aux_bitmap.base(), aux_bitmap.size() / HeapWordSize); _aux_bitmap_region_special = aux_bitmap.special(); _aux_bit_map.initialize(_heap_region, _aux_bitmap_region); @@ -359,7 +359,7 @@ jint ShenandoahHeap::initialize() { region_storage_size_orig, region_page_size, region_storage.base(), region_storage.size(), region_storage.page_size()); - MemTracker::record_virtual_memory_tag(region_storage.base(), mtGC); + MemTracker::record_virtual_memory_tag(region_storage, mtGC); if (!region_storage.special()) { os::commit_memory_or_exit(region_storage.base(), region_storage_size, region_page_size, false, "Cannot commit region memory"); diff --git a/src/hotspot/share/jfr/recorder/storage/jfrVirtualMemory.cpp b/src/hotspot/share/jfr/recorder/storage/jfrVirtualMemory.cpp index c91da007521..97f2b8a1990 100644 --- a/src/hotspot/share/jfr/recorder/storage/jfrVirtualMemory.cpp +++ b/src/hotspot/share/jfr/recorder/storage/jfrVirtualMemory.cpp @@ -119,7 +119,7 @@ bool JfrVirtualMemorySegment::initialize(size_t reservation_size_request_bytes) _rs.base(), _rs.size(), os::vm_page_size()); - MemTracker::record_virtual_memory_tag((address)_rs.base(), mtTracing); + MemTracker::record_virtual_memory_tag(_rs, mtTracing); assert(is_aligned(_rs.base(), os::vm_page_size()), "invariant"); assert(is_aligned(_rs.size(), os::vm_page_size()), "invariant"); diff --git a/src/hotspot/share/memory/metaspace.cpp b/src/hotspot/share/memory/metaspace.cpp index 3615c3dc7ee..04e5d807f32 100644 --- a/src/hotspot/share/memory/metaspace.cpp +++ b/src/hotspot/share/memory/metaspace.cpp @@ -797,7 +797,7 @@ void Metaspace::global_initialize() { } // Mark class space as such - MemTracker::record_virtual_memory_tag((address)rs.base(), mtClass); + MemTracker::record_virtual_memory_tag(rs, mtClass); // Initialize space Metaspace::initialize_class_space(rs); diff --git a/src/hotspot/share/memory/metaspace/virtualSpaceNode.cpp b/src/hotspot/share/memory/metaspace/virtualSpaceNode.cpp index 500649dc926..66644c805a9 100644 --- a/src/hotspot/share/memory/metaspace/virtualSpaceNode.cpp +++ b/src/hotspot/share/memory/metaspace/virtualSpaceNode.cpp @@ -260,7 +260,7 @@ VirtualSpaceNode* VirtualSpaceNode::create_node(size_t word_size, if (!rs.is_reserved()) { vm_exit_out_of_memory(word_size * BytesPerWord, OOM_MMAP_ERROR, "Failed to reserve memory for metaspace"); } - MemTracker::record_virtual_memory_tag(rs.base(), mtMetaspace); + MemTracker::record_virtual_memory_tag(rs, mtMetaspace); assert_is_aligned(rs.base(), chunklevel::MAX_CHUNK_BYTE_SIZE); InternalStats::inc_num_vsnodes_births(); return new VirtualSpaceNode(rs, true, limiter, reserve_words_counter, commit_words_counter); diff --git a/src/hotspot/share/nmt/memTracker.hpp b/src/hotspot/share/nmt/memTracker.hpp index 38b97dba69c..981e991a41e 100644 --- a/src/hotspot/share/nmt/memTracker.hpp +++ b/src/hotspot/share/nmt/memTracker.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_NMT_MEMTRACKER_HPP #define SHARE_NMT_MEMTRACKER_HPP +#include "memory/reservedSpace.hpp" #include "nmt/mallocTracker.hpp" #include "nmt/nmtCommon.hpp" #include "nmt/memoryFileTracker.hpp" @@ -220,12 +221,16 @@ class MemTracker : AllStatic { } } - static inline void record_virtual_memory_tag(void* addr, MemTag mem_tag) { + static inline void record_virtual_memory_tag(const ReservedSpace& rs, MemTag mem_tag) { + record_virtual_memory_tag(rs.base(), rs.size(), mem_tag); + } + + static inline void record_virtual_memory_tag(void* addr, size_t size, MemTag mem_tag) { assert_post_init(); if (!enabled()) return; if (addr != nullptr) { NmtVirtualMemoryLocker nvml; - VirtualMemoryTracker::set_reserved_region_tag((address)addr, mem_tag); + VirtualMemoryTracker::set_reserved_region_type((address)addr, size, mem_tag); } } diff --git a/src/hotspot/share/nmt/virtualMemoryTracker.cpp b/src/hotspot/share/nmt/virtualMemoryTracker.cpp index d5cba7ad82d..9e5d0a18c10 100644 --- a/src/hotspot/share/nmt/virtualMemoryTracker.cpp +++ b/src/hotspot/share/nmt/virtualMemoryTracker.cpp @@ -413,7 +413,7 @@ bool VirtualMemoryTracker::add_reserved_region(address base_addr, size_t size, } } -void VirtualMemoryTracker::set_reserved_region_tag(address addr, MemTag mem_tag) { +void VirtualMemoryTracker::set_reserved_region_type(address addr, size_t size, MemTag mem_tag) { assert(addr != nullptr, "Invalid address"); assert(_reserved_regions != nullptr, "Sanity check"); MemTracker::assert_locked(); diff --git a/src/hotspot/share/nmt/virtualMemoryTracker.hpp b/src/hotspot/share/nmt/virtualMemoryTracker.hpp index 0b31bf5daa3..74d299e6637 100644 --- a/src/hotspot/share/nmt/virtualMemoryTracker.hpp +++ b/src/hotspot/share/nmt/virtualMemoryTracker.hpp @@ -386,7 +386,7 @@ class VirtualMemoryTracker : AllStatic { static bool remove_uncommitted_region (address base_addr, size_t size); static bool remove_released_region (address base_addr, size_t size); static bool remove_released_region (ReservedMemoryRegion* rgn); - static void set_reserved_region_tag (address addr, MemTag mem_tag); + static void set_reserved_region_type (address addr, size_t size, MemTag mem_tag); // Given an existing memory mapping registered with NMT, split the mapping in // two. The newly created two mappings will be registered under the call