Integrated: 8369654: javac OutOfMemoryError for complex intersection type

Vicente Romero vromero at openjdk.org
Mon Nov 3 18:35:02 UTC 2025


On Wed, 29 Oct 2025 22:16:25 GMT, Vicente Romero <vromero at openjdk.org> wrote:

> 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

This pull request has now been integrated.

Changeset: 9f972008
Author:    Vicente Romero <vromero at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/9f972008ff2beb4b69855f4c42b8a664a6b8bc95
Stats:     161 lines in 3 files changed: 147 ins; 2 del; 12 mod

8369654: javac OutOfMemoryError for complex intersection type

Reviewed-by: liach, mcimadamore

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

PR: https://git.openjdk.org/jdk/pull/28050


More information about the compiler-dev mailing list