RFR: 8367005: ImageReader refactor caused performance regressions for startup and footprint [v2]
David Beaumont
duke at openjdk.org
Wed Sep 10 22:05:26 UTC 2025
> Summary: Add two new methods to ImageReader to make SystemModuleReader more performant.
>
> Analysis of benchmarks shows that when the vast majority of resources (~11,000 in the Perfstartup-SwingSet-G1 benchmark) tested for in SystemModuleReader do NOT exist, performance is degraded compared to this code prior to the refactoring in JDK-8360037.
>
> The current refactoring of ImageReader has everything going through a single "findNode()" method for simplest possible encapsulation, but while this is functionally correct, it's not tuned for testing for the non-existence of resources.
>
> In particular:
> 1. SystemModuleReader only requests resources (i.e. things in the jimage file with paths *not* starting /modules/ or /packages/). This means findNode() does two look-ups for the resource, the first of which will always fail.
> 2. The containsResource() logic doesn't need to create and cache nodes in ImageReader, it can just check for the presence of an ImageLocation corresponding to a resource.
>
> Thus two new methods are added to resolve these cases:
> * findResourceNode(module, path)
> * containsResource(module, path)
>
> Their API takes module and path separately so as to not be confusable with findNode(nodename).
>
> However care must be taken to prevent these methods being fooled into returning non-resource entries (this was possible before the refactoring by using module names like "modules" or "packages") so new tests have been added.
David Beaumont has updated the pull request incrementally with one additional commit since the last revision:
Found additional place where new API can be used.
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/27203/files
- new: https://git.openjdk.org/jdk/pull/27203/files/44e07ee0..2cdb1b22
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=27203&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=27203&range=00-01
Stats: 2 lines in 1 file changed: 0 ins; 0 del; 2 mod
Patch: https://git.openjdk.org/jdk/pull/27203.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/27203/head:pull/27203
PR: https://git.openjdk.org/jdk/pull/27203
More information about the core-libs-dev
mailing list