RFR: 8369654: javac OutOfMemoryError for complex intersection type

Vicente Romero vromero at openjdk.org
Wed Oct 29 22:25:19 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

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

Commit messages:
 - editing parameter name
 - 8369654: javac OutOfMemoryError for complex intersection type

Changes: https://git.openjdk.org/jdk/pull/28050/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=28050&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8369654
  Stats: 140 lines in 3 files changed: 123 ins; 0 del; 17 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