RFR: 8328944: NMT reports "unknown" memory [v2]

Afshin Zafari azafari at openjdk.org
Wed Nov 20 11:35:27 UTC 2024


On Tue, 19 Nov 2024 22:01:13 GMT, Gerard Ziemski <gziemski at openjdk.org> wrote:

>> We use `mtNone` value in several functions default parameters, which may show up in NMT reports.
>> 
>> We address this, by avoiding using `mtNone`.
>> 
>> Eventually the goal would be to eliminate using `mtNone` whenever possible.
>> TODO: update copyrights.
>> 
>> Testing: undergoing MARCH5 tier1-5 ...
>
> Gerard Ziemski has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:
> 
>  - avoid using mtNone
>  - Merge remote-tracking branch 'upstream/master' into JDK-8328944
>  - revert, we will re-do with a smaller change
>  - remove more mtNone
>  - remove API that allows to change the mem_tag for virtual memory, feedback
>  - do not allow default parameter for mtNone

Thanks for taking this issue. I add my points here:

1) The `ReservedSpace` objects in these files have to have extra MemTag (`mtTest`) parameter:
  - test_freeRegionList.cpp
  - test_virtualspace.cpp
  - test_virtualMemoryTracker.cpp
 
2) The `mtNone` as default value for the parameter should be removed from the following functions, otherwise Unknown memory types can still be reported:



Source root • src/hotspot/os/windows/os_windows.cpp:
    3239: static char* map_or_reserve_memory_aligned(size_t size, size_t alignment, int file_desc, MemTag mem_tag = mtNone) {
  3239    assert(is_aligned(alignment, os::vm_allocation_granularity()),
  3240    assert(is_aligned(alignment, os::vm_allocation_granularity()),

Source root • src/hotspot/share/cds/filemap.cpp:
  1773                          char *addr, size_t bytes, bool read_only,
  1774:                         bool allow_exec, MemTag mem_tag = mtNone) {
  1775    char* mem = os::map_memory(fd, file_name, file_offset, addr, bytes,

Source root • src/hotspot/share/memory/virtualspace.hpp:
  63    void initialize(size_t size, size_t alignment, size_t page_size,
  64    void initialize(size_t size, size_t alignment, size_t page_size,
  65:                   char* requested_address, bool executable, MemTag mem_tag = mtNone);
  65  
  66  

Source root • src/hotspot/share/nmt/memReporter.hpp:
  110    void print_total(size_t reserved, size_t committed, size_t peak = 0) const;
  111:   void print_malloc(const MemoryCounter* c, MemTag mem_tag = mtNone) const;
  112    void print_virtual_memory(size_t reserved, size_t committed, size_t peak) const;

Source root • src/hotspot/share/nmt/memTracker.hpp:
  123    static inline void record_virtual_memory_reserve(void* addr, size_t size, const NativeCallStack& stack,
  124:     MemTag mem_tag = mtNone) {
  125      assert_post_init();

  149    static inline void record_virtual_memory_reserve_and_commit(void* addr, size_t size,
  150:     const NativeCallStack& stack, MemTag mem_tag = mtNone) {

Source root • src/hotspot/share/nmt/virtualMemoryTracker.hpp:
  299    ReservedMemoryRegion(address base, size_t size, const NativeCallStack& stack,
  300:     MemTag mem_tag = mtNone) :

  383:   static bool add_reserved_region (address base_addr, size_t size, const NativeCallStack& stack, MemTag mem_tag = mtNone);
  384  

Source root • src/hotspot/share/runtime/os.hpp:
  453:   static char*  reserve_memory(size_t bytes, bool executable = false, MemTag mem_tag = mtNone);

  460:   static char*  attempt_reserve_memory_at(char* addr, size_t bytes, bool executable = false, MemTag mem_tag = mtNone);

  512:   static char* map_memory_to_file(size_t size, int fd, MemTag mem_tag = mtNone);
  513:   static char* map_memory_to_file_aligned(size_t size, size_t alignment, int fd, MemTag mem_tag = mtNone);

  515:   static char* attempt_map_memory_to_file_at(char* base, size_t size, int fd, MemTag mem_tag = mtNone);

  519  static char*  map_memory(int fd, const char* file_name, size_t file_offset,
                          char *addr, size_t bytes, bool read_only = false,
  520                             char *addr, size_t bytes, bool read_only = false,
  521:                            bool allow_exec = false, MemTag mem_tag = mtNone);



3) In virtualspace.cpp, the `result` in these functions has `mtNone` tag while the parent may have another tag:


ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment) {
  assert(partition_size <= size(), "partition failed");
  ReservedSpace result(base(), partition_size, alignment, page_size(), special(), executable());
  return result;
}

ReservedSpace ReservedSpace::last_part(size_t partition_size, size_t alignment) {
  assert(partition_size <= size(), "partition failed");
  ReservedSpace result(base() + partition_size, size() - partition_size,
                       alignment, page_size(), special(), executable());
  return result;
}

ReservedSpace ReservedSpace::partition(size_t offset, size_t partition_size, size_t alignment) {
  assert(offset + partition_size <= size(), "partition failed");
  ReservedSpace result(base() + offset, partition_size, alignment, page_size(), special(), executable());
  return result;
}

4) In virtualspace.cpp, the `space` has `mtNone` tag at this function:

ReservedSpace ReservedSpace::space_for_range(char* base, size_t size, size_t alignment,
                                             size_t page_size, bool special, bool executable) {
  assert(is_aligned(base, os::vm_allocation_granularity()), "Unaligned base");
  assert(is_aligned(size, os::vm_page_size()), "Unaligned size");
  assert(os::page_sizes().contains(page_size), "Invalid pagesize");
  ReservedSpace space;
  space.initialize_members(base, size, alignment, page_size, special, executable);
  return space;
}

-------------

PR Review: https://git.openjdk.org/jdk/pull/21843#pullrequestreview-2448359154


More information about the shenandoah-dev mailing list