RFR: 8369654: javac OutOfMemoryError for complex intersection type [v12]
Vicente Romero
vromero at openjdk.org
Sat Nov 1 12:25:47 UTC 2025
> Javac is throwing an OOME for the code like:
>
> class Test {
> interface WithMixin01<T> {}
> // ...
> // 20 interfaces here
> interface WithMixin20<T> {}
>
> interface ClientA extends
> WithMixin02<ClientA>,
> WithMixin01<ClientA>,
> WithMixin03<ClientA>,
> WithMixin04<ClientA>,
> WithMixin05<ClientA>,
> WithMixin06<ClientA>,
> WithMixin07<ClientA>,
> WithMixin08<ClientA>,
> WithMixin09<ClientA>,
> WithMixin10<ClientA>,
> WithMixin11<ClientA>,
> WithMixin12<ClientA>,
> WithMixin13<ClientA>,
> WithMixin14<ClientA>,
> WithMixin15<ClientA>,
> WithMixin16<ClientA>,
> WithMixin17<ClientA>,
> WithMixin18<ClientA>,
> WithMixin19<ClientA>,
> WithMixin20<ClientA> {
> }
>
> interface ClientB extends
> WithMixin01<ClientB>,
> WithMixin02<ClientB>,
> WithMixin03<ClientB>,
> WithMixin04<ClientB>,
> WithMixin05<ClientB>,
> WithMixin06<ClientB>,
> WithMixin07<ClientB>,
> WithMixin08<ClientB>,
> WithMixin09<ClientB>,
> WithMixin10<ClientB>,
> WithMixin11<ClientB>,
> WithMixin12<ClientB>,
> WithMixin13<ClientB>,
> WithMixin14<ClientB>,
> WithMixin15<ClientB>,
> WithMixin16<ClientB>,
> WithMixin17<ClientB>,
> WithMixin18<ClientB>,
> WithMixin19<ClientB>,
> WithMixin20<ClientB> {
> }
>
> public static void main(String... args) {
> ClientA a = null;
> ClientB b = null;
> String selector = "a";
> Object o = switch (selector) {
> case "a" -> a;
> case "b" -> b;
> default -> null;
> };
> }
> }
>
> the reason is that after [JDK-8353565](https://bugs.openjdk.org/browse/JDK-8353565) we are using Types::lub when joining jump chains in Code. The result of the lub will be erased anyways so the proposal here is to cut in the result given by lub types that will be erased anyways. The reason for the slow lub invocation here is that in order to obtain the lub in this case, the lub method is invoked several times. Each invocation, minus the first one, with very complex types which makes them very slooooow.
>
> TIA
Vicente Romero 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 16 additional commits since the last revision:
- Merge branch 'master' into JDK-8369654
- fixing comment
- adding some doc
- delta changes
- simplifying code
- adding more array support
- missing supertype
- another change
- another fix
- minor fixes
- ... and 6 more: https://git.openjdk.org/jdk/compare/bc6df8bb...34e2d9d4
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/28050/files
- new: https://git.openjdk.org/jdk/pull/28050/files/e5bfcfd1..34e2d9d4
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=28050&range=11
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=28050&range=10-11
Stats: 44514 lines in 404 files changed: 23137 ins; 18965 del; 2412 mod
Patch: https://git.openjdk.org/jdk/pull/28050.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/28050/head:pull/28050
PR: https://git.openjdk.org/jdk/pull/28050
More information about the compiler-dev
mailing list