RFR: JDK-8317683: Add JIT memory statistics [v3]

Thomas Stuefe stuefe at openjdk.org
Wed Oct 11 20:04:14 UTC 2023


On Wed, 11 Oct 2023 13:41:20 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:

>> This proposal adds a way to monitor C1/C2 memory usage per compilation. 
>> 
>> We are flying a bit blind there: NMT is okay for initial triaging but no help when digging deeper into compiler footprint. NMT shows how much native memory the JIT uses but lumps together footprints from concurrent compilations, making its peak values arbitrary. And we have no way to associate the NMT numbers with individual allocations.
>> 
>> The statistic added by this patch shows footprint *per compilation*. It measures memory spikes per thread for a single compilation. It then presents them with additional information, e.g., the node count (for C2). 
>> 
>> Example printout:
>> 
>> 
>> 112703:
>> Compilation memory statistics
>> 
>> Legend:
>>   total  : memory allocated via arenas while compiling
>>   NA     : ...how much in node arenas (if c2)
>>   RA     : ...how much in resource areas
>>   #nodes : ...how many nodes (if c2)
>>   time   : time of last compilation (sec)
>>   type   : compiler type
>>   #rc    : how often recompiled
>>   thread : compiler thread
>> 
>> total     NA        RA        #nodes  time    type  #rc thread              method
>> 30273336  6383040   18027000  18257   1,979   c2    2   0x00007f6f0c136460  java/lang/ClassLoader.loadClass((Ljava/lang/String;)Ljava/lang/Class;) 
>> 27690456  5892160   16211800  15179   3,643   c2    2   0x00007f6f0c0433e0  org/springframework/cache/interceptor/CacheOperationSourcePointcut.matches((Ljava/lang/reflect/Method;Ljava/lang/Class;)Z) 
>> ...
>> ...
>> 
>> 
>> [full example printout here](https://github.com/openjdk/jdk/files/12853477/compiler-statistic-petclinic.txt)
>> 
>> #### Usage
>> 
>> The statistic needs to be enabled with a new compile command (`-XX:CompileCommand="CollectMemStat,*.*` or `-XX:CompileCommand="PrintMemStat,*.*"`). 
>> 
>> It then can be printed with a new jcmd: `jcmd xxx Compiler.memory`.
>> 
>> `PrintMemStat` also prints the usage out after compilation and again, as sorted table, at VM shutdown.
>> 
>> #### Technical details
>> 
>> The patch exploits the fact that compilers use arenas almost exclusively. It hooks into `Arena::grow()` to track allocations. That makes memory tracking very cheap at an acceptable loss in fidelity (we only track arena chunk allocations, not individual Arena allocations).
>> 
>> Peak values are tracked per compiler thread. That works since all arenas used during compilation are associated with a compiler thread and never change that association during the compilation.
>> 
>> We measure total footprint...
>
> Thomas Stuefe has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - remove stray newlines
>  - MemStat->CollectMemStat

> Adding this for knowledge: https://patchwork.sourceware.org/project/glibc/patch/20230927203815.1843924-1-irogers@google.com/
> 
> What I have found more complex during the investigation of the increases RSS due to malloc arenas, were the fact that anon mappings were unnamed and just a parallel investigation over mprotect events has narrowed the JIT Arena::grow call stacks and compile threads..it would be nice to have, given that JIT compiler threads are fixed, a way to lookup such names in the glibc arenas allocated, to simplify debugging and correlate information coming from this report (and avoiding using profilers to debugs JIT & malloc-related interactions)...

Is your concern about memory that has been freed and is retained by the libc? In other words, a temporary spike that carries over into a permanent RSS increase? In that case, a clear answer is difficult since there is no clear 1:1 relationship between a single malloc and that block of memory.

The first thing to try if you suspect RSS is dominated by free retained libc memory is to trim native memory via `jcmd System.trim_native_heap`. We also have libc autotrimming coming for JDK 17.0.10 and JDK 21. If that shows good results, the next question is what part of the VM caused the malloc spike that increased RSS. NMT peak values may give part of the answer. If the Compiler is the culprit, the next step is to use this new statistic to understand which method caused the increase.

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

PR Comment: https://git.openjdk.org/jdk/pull/16076#issuecomment-1758446498


More information about the hotspot-compiler-dev mailing list