RFR: JDK-8326586: Improve Speed of System.map [v2]

Gerard Ziemski gziemski at openjdk.org
Tue Feb 27 20:32:53 UTC 2024


On Tue, 27 Feb 2024 07:25:54 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:

>> A small optimization that speeds up `jcmd pid System.map` by orders of magnitude by optimizing NMT cache lookup for sequential accesses. This cache is used to map NMT against System information - and the latter usually comes in sequential form, e.g. scanned from `/proc/<pid>/maps` or via VirtualQuery.
>> 
>> On Linux x64, `System.map`for a JVM with an artificially bloated process space (1 million mappings) takes:
>> 
>> before this patch: 6.3 minutes
>> with this patch: 4.2 seconds
>> 
>> which is a 87x speed improvement.
>> 
>> Ping @jdksjolen and @gerard-ziemski?
>
> Thomas Stuefe has updated the pull request incrementally with one additional commit since the last revision:
> 
>   uintx->size_t

BTW here is the truth table I used to convince myself that the code is doing the right thing, might be useful to someone (even myself) looking at this in the future:


range_intersects == MAX(from) < MIN(to)
NEW CODE: break if (to <= range.from)
OLD CODE: break if (from < _range.to)

....{..}.... from,to
[..]........ range
....<....... MAX(from)
...>........ MIN(to)
...><.......  MAX(from) < MIN(to) -> FALSE
.......}.... to
[........... range.from
[......}....  to <= range.from    -> FALSE
....{....... from
...]........ range.to
...]{.......  from < _range.to    -> FALSE

....{..}.... from,to
.[..]....... range
....<....... MAX(from)
....>....... MIN(to)
....X.......  MAX(from) < MIN(to) -> FALSE
.......}.... to
.[.......... range.from
.[.....}....  to <= range.from    -> FALSE
....{....... from
....]....... range.to
....X.......  from < _range.to    -> FALSE

....{..}.... from,to
..[..]...... range
....<....... MAX(from)
.....>...... MIN(to)
....<>......  MAX(from) < MIN(to) -> TRUE
.......}.... to
..[......... range.from
..[....}....  to <= range.from    -> FALSE
....{....... from
.....]...... range.to
....{]......  from < _range.to    -> TRUE

....{..}.... from,to
...[..]..... range
....<....... MAX(from)
......>..... MIN(to)
....<.>.....  MAX(from) < MIN(to) -> TRUE
.......}.... to
...[........ range.from
...[...}....  to <= range.from    -> FALSE
....{....... from
......]..... range.to
....{.].....  from < _range.to    -> TRUE

....{..}.... from,to
....[..].... range
....<....... MAX(from)
.......>.... MIN(to)
....<..>....  MAX(from) < MIN(to) -> TRUE
.......}.... to
....[....... range.from
....[..}....  to <= range.from    -> FALSE
....{....... from
.......].... range.to
....{..]....  from < _range.to    -> TRUE

....{..}.... from,to
.....[..]... range
.....<...... MAX(from)
.......>.... MIN(to)
.....<.>....  MAX(from) < MIN(to) -> TRUE
.......}.... to
.....[...... range.from
.....[.}....  to <= range.from    -> FALSE
....{....... from
........]... range.to
....{...]...  from < _range.to    -> TRUE

....{..}.... from,to
......[..].. range
......<..... MAX(from)
.......>.... MIN(to)
......<>....  MAX(from) < MIN(to) -> TRUE
.......}.... to
......[..... range.from
......[}....  to <= range.from    -> FALSE
....{....... from
.........].. range.to
....{....]..  from < _range.to    -> TRUE

....{..}.... from,to
.......[..]. range
.......<.... MAX(from)
.......>.... MIN(to)
.......X....  MAX(from) < MIN(to) -> FALSE
.......}.... to
.......[.... range.from
.......X....  to <= range.from    -> TRUE
....{....... from
..........]. range.to
....{.....].  from < _range.to    -> TRUE

....{..}.... from,to
........[..] range
........<... MAX(from)
.......>.... MIN(to)
.......><...  MAX(from) < MIN(to) -> FALSE
.......}.... to
........[... range.from
.......}[...  to <= range.from    -> TRUE
....{....... from
...........] range.to
....{......]  from < _range.to    -> TRUE


[ - range from
] - range to
{ - from
} - to
< - MAX(from)
> - MIN(to)

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

PR Comment: https://git.openjdk.org/jdk/pull/17984#issuecomment-1967538880


More information about the hotspot-runtime-dev mailing list