[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Re: RFR: JDK-8318636: Add jcmd to print annotated process memory map [v6]
From:       Gerard Ziemski <gziemski () openjdk ! org>
Date:       2023-10-31 17:33:41
Message-ID: nPcikdsLhnQpgM74kuGde221X3tFO0QOKp3cNpRApIc=.840e508c-96bd-4723-b103-e6127fd27c5a () github ! com
[Download RAW message or body]

On Sat, 28 Oct 2023 13:04:05 GMT, Thomas Stuefe <stuefe@openjdk.org> wrote:

> > Analysts and supporters often use /proc/xx/maps to make sense of the memory \
> > footprint of a process. 
> > Interpreting the memory map correctly can help when used as a complement to other \
> > tools (e.g. NMT). There even exist tools out there that attempt to annotate the \
> > process memory map with JVM information. 
> > That, however, can be more accurately done from within the JVM, at least for \
> > mappings originating from hotspot. After all, we can correlate the mapping \
> > information in NMT with the VMA map. 
> > Example output (from a spring petstore run):
> > 
> > [example_system_map.txt](https://github.com/openjdk/jdk/files/13179054/example_system_map.txt)
> >  
> > This patch adds the VM annotations for VMAs that are *mmaped*. I also have an \
> > experimental patch that works with malloc'ed memory, but it is not ready yet for \
> > consumption and I leave that part of for now.
> 
> Thomas Stuefe has updated the pull request incrementally with one additional commit \
> since the last revision: 
> fix various builds

Just a couple of issues/questions.

This is a very nice feature we're adding. Thank you!

src/hotspot/os/linux/memMapPrinter_linux.cpp line 59:

> 57:   void print_OS_specific_details(outputStream* st) const override {
> 58:     st->print("%s %s ", _info.prot, _info.offset);
> 59:   }

If that's all this is doing, do we really need it?

src/hotspot/os/linux/memMapPrinter_linux.cpp line 83:

> 81:     char line[linesize];
> 82:     while(fgets(line, sizeof(line), f) == line) {
> 83:       line[sizeof(line) - 1] = '\0';

What would happen if the read line is empty, i.e. sizeof(line)==0, can that happen?

src/hotspot/share/nmt/memMapPrinter.cpp line 79:

> 77:   const void* const min = MAX2(from1, from2);
> 78:   const void* const max = MIN2(to1, to2);
> 79:   return min < max;

I had to rewrite it as:

`return MAX2(from1, from2) < MIN2(to1, to2);`

to make sure I understand it, or better yet, why not have it as a macros?

`#define RANGE_INTERSECT(min, max) (return MAX2(from1, from2) < MIN2(to1, to2))`

 MAX2 and MIN2 are macros already and we're not doing anything fancy here.

src/hotspot/share/nmt/memMapPrinter.cpp line 89:

> 87:   // NMT deadlocks (ThreadCritical).
> 88:   Range* _ranges;
> 89:   MEMFLAGS* _flags;

Why did you decide to have two separate memory chunks?

I think I'd have used a struct to hold Range* and MEMFLAGS* and use that struct in a \
single array.

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

Changes requested by gziemski (Committer).

PR Review: https://git.openjdk.org/jdk/pull/16301#pullrequestreview-1704722251
PR Review Comment: https://git.openjdk.org/jdk/pull/16301#discussion_r1377905955
PR Review Comment: https://git.openjdk.org/jdk/pull/16301#discussion_r1376585794
PR Review Comment: https://git.openjdk.org/jdk/pull/16301#discussion_r1377917390
PR Review Comment: https://git.openjdk.org/jdk/pull/16301#discussion_r1377926176


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic