quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.87k stars 2.71k forks source link

Native compilation issue with Apple M1 #24695

Closed metacosm closed 2 years ago

metacosm commented 2 years ago

Describe the bug

Playing with native compilation on M1 Mac. The same Java code works fine on Intel but fails on M1 at runtime with the following error:

2022-04-01 15:16:49,698 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.lang.InternalError: Enclosing method not found
        at java.lang.Class.getEnclosingMethod(DynamicHub.java:1390)
        at sun.reflect.generics.scope.ClassScope.computeEnclosingScope(ClassScope.java:50)
        at sun.reflect.generics.scope.AbstractScope.getEnclosingScope(AbstractScope.java:77)
        at sun.reflect.generics.scope.AbstractScope.lookup(AbstractScope.java:95)
        at sun.reflect.generics.factory.CoreReflectionFactory.findTypeVariable(CoreReflectionFactory.java:110)
        at sun.reflect.generics.visitor.Reifier.visitTypeVariableSignature(Reifier.java:165)
        at sun.reflect.generics.tree.TypeVariableSignature.accept(TypeVariableSignature.java:43)
        at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)
        at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138)
        at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
        at sun.reflect.generics.repository.ClassRepository.computeSuperclass(ClassRepository.java:104)
        at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:86)
        at java.lang.Class.getGenericSuperclass(DynamicHub.java:1028)
        at com.fasterxml.jackson.core.type.TypeReference.<init>(TypeReference.java:33)
        at io.fabric8.kubernetes.client.utils.Serialization$3.<init>(Serialization.java:396)
        at io.fabric8.kubernetes.client.utils.Serialization.clone(Serialization.java:396)
        at io.fabric8.kubernetes.client.utils.CreateOrReplaceHelper.createOrReplace(CreateOrReplaceHelper.java:43)
        at io.fabric8.kubernetes.client.dsl.base.BaseOperation.createOrReplace(BaseOperation.java:318)
        at io.fabric8.kubernetes.client.dsl.base.BaseOperation.createOrReplace(BaseOperation.java:83)
        at io.fabric8.kubernetes.client.dsl.base.BaseOperation.createOrReplace(BaseOperation.java:308)
        at io.fabric8.kubernetes.client.dsl.base.BaseOperation.createOrReplace(BaseOperation.java:83)
        at io.quarkiverse.operatorsdk.runtime.CRDUtils.apply(CRDUtils.java:44)
        at io.quarkiverse.operatorsdk.runtime.CRDUtils.lambda$applyCRD$0(CRDUtils.java:29)
        at io.quarkiverse.operatorsdk.runtime.CRDUtils$$Lambda$2ac59862167fe79c9b047049574e40aa025f30ec.accept(Unknown Source)
        at java.util.HashMap.forEach(HashMap.java:1421)
        at io.quarkiverse.operatorsdk.runtime.CRDUtils.applyCRD(CRDUtils.java:24)
        at io.quarkiverse.operatorsdk.runtime.OperatorProducer.applyCRDAndRegister(OperatorProducer.java:58)
        at io.quarkiverse.operatorsdk.runtime.OperatorProducer.operator(OperatorProducer.java:44)
        at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.create(Unknown Source)
        at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:111)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:32)
        at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
        at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
        at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:32)
        at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.get(Unknown Source)
        at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.get(Unknown Source)
        at io.quarkiverse.operatorsdk.runtime.AppEventListener_Bean.create(Unknown Source)
        at io.quarkiverse.operatorsdk.runtime.AppEventListener_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:111)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:32)
        at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
        at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
        at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:32)
        at io.quarkiverse.operatorsdk.runtime.AppEventListener_Observer_onStartup_9c5d3dd7eff7dbe02976f59f48aec5b70eb9c99f.notify(Unknown Source)
        at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:320)
        at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:302)
        at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:73)
        at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:128)
        at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:97)
        at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
        at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
        at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
        at io.quarkus.runtime.Application.start(Application.java:101)
        at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:103)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:67)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:120)
        at io.quarkus.runner.GeneratedMain.main(Unknown Source)

The code can be found at https://github.com/quarkiverse/quarkus-operator-sdk, in particular the samples/exposedapp operator.

Expected behavior

Native compilation should work just as well on Intel and M1 chips… ;) (Of course, this might be a GraalVM issue).

Actual behavior

Native binary fails at runtime.

How to Reproduce?

Output of uname -a or ver

Darwin rainbow.home 21.4.0 Darwin Kernel Version 21.4.0: Mon Feb 21 20:36:53 PST 2022; root:xnu-8020.101.4~2/RELEASE_ARM64_T8101 arm64

Output of java -version

openjdk version "17.0.3" 2022-04-19 OpenJDK Runtime Environment GraalVM CE 22.2.0-dev (build 17.0.3+4-jvmci-22.1-b03) OpenJDK 64-Bit Server VM GraalVM CE 22.2.0-dev (build 17.0.3+4-jvmci-22.1-b03, mixed mode, sharing)

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.7.5.Final

Build tool (ie. output of mvnw --version or gradlew --version)

Maven home: /opt/homebrew/Cellar/maven/3.8.4/libexec Java version: 17.0.3, vendor: GraalVM Community, runtime: /Users/claprun/.sdkman/candidates/java/22.2.0.dev.r17-grl Default locale: en_FR, platform encoding: UTF-8 OS name: "mac os x", version: "12.3", arch: "aarch64", family: "mac"

Additional information

No response

quarkus-bot[bot] commented 2 years ago

/cc @geoand, @iocanel

geoand commented 2 years ago

cc @gastaldi @zakkak

jerboaa commented 2 years ago

I was curious and was trying to reproduce on Linux aarch64. This does seem to need some additional setup. What setup does it need (I don't have a Kubernetes cluster handy)?

$ ./target/quarkus-operator-sdk-samples-exposedapp-3.1.0-SNAPSHOT-runner
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2022-04-05 10:27:26,053 WARN  [io.fab.kub.cli.Config] (main) Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring.
2022-04-05 10:27:26,054 WARN  [io.fab.kub.cli.Config] (main) Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring.
2022-04-05 10:27:26,061 INFO  [io.qua.ope.run.OperatorProducer] (main) Quarkus Java Operator SDK extension 3.1.0-SNAPSHOT (commit: 65d5d51 on branch: main) built on Tue Apr 05 10:20:39 EDT 2022
2022-04-05 10:27:26,221 INFO  [io.qua.it.ope.cli.run.OpenShiftClientProducer] (main) Closing OpenShift client
2022-04-05 10:27:26,222 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): io.javaoperatorsdk.operator.OperatorException: Couldn't retrieve the currently connected namespace. Make sure it's correctly set in your ~/.kube/config file, using, e.g. 'kubectl config set-context <your context> --namespace=<your namespace>'
    at io.javaoperatorsdk.operator.api.config.ResourceConfiguration.getEffectiveNamespaces(ResourceConfiguration.java:69)
    at io.quarkiverse.operatorsdk.runtime.QuarkusControllerConfiguration.getEffectiveNamespaces(QuarkusControllerConfiguration.java:132)
    at io.javaoperatorsdk.operator.processing.event.source.informer.InformerManager.initSources(InformerManager.java:46)
    at io.javaoperatorsdk.operator.processing.event.source.informer.ManagedInformerEventSource.<init>(ManagedInformerEventSource.java:33)
    at io.javaoperatorsdk.operator.processing.event.source.controller.ControllerResourceEventSource.<init>(ControllerResourceEventSource.java:34)
    at io.javaoperatorsdk.operator.processing.event.EventSources.initControllerEventSource(EventSources.java:27)
    at io.javaoperatorsdk.operator.processing.event.EventSourceManager.<init>(EventSourceManager.java:43)
    at io.javaoperatorsdk.operator.processing.Controller.<init>(Controller.java:73)
    at io.javaoperatorsdk.operator.Operator.register(Operator.java:158)
    at io.javaoperatorsdk.operator.Operator.register(Operator.java:130)
    at io.quarkiverse.operatorsdk.runtime.OperatorProducer.applyCRDAndRegister(OperatorProducer.java:63)
    at io.quarkiverse.operatorsdk.runtime.OperatorProducer.operator(OperatorProducer.java:44)
    at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.create(Unknown Source)
    at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.create(Unknown Source)
    at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:111)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:32)
    at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
    at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
    at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:32)
    at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.get(Unknown Source)
    at io.quarkiverse.operatorsdk.runtime.OperatorProducer_ProducerMethod_operator_d877ef444f5ca4c581391752b2ae226e12100a41_Bean.get(Unknown Source)
    at io.quarkiverse.operatorsdk.runtime.AppEventListener_Bean.create(Unknown Source)
    at io.quarkiverse.operatorsdk.runtime.AppEventListener_Bean.create(Unknown Source)
    at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:111)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:32)
    at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
    at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
    at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:32)
    at io.quarkiverse.operatorsdk.runtime.AppEventListener_Observer_onStartup_9c5d3dd7eff7dbe02976f59f48aec5b70eb9c99f.notify(Unknown Source)
    at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:320)
    at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:302)
    at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:73)
    at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:128)
    at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:97)
    at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
    at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
    at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
    at io.quarkus.runtime.Application.start(Application.java:101)
    at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:103)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:67)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:120)
    at io.quarkus.runner.GeneratedMain.main(Unknown Source)

$ mvn --version
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 17.0.2, vendor: Eclipse Adoptium, runtime: /home/tester/mandrel-java17-22.0.0.2-Final
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-348.12.2.el8_5.aarch64", arch: "aarch64", family: "unix"
galderz commented 2 years ago

Aside from what @jerboaa suggests, it seems you're using a GraalVM master snapshot (GraalVM CE 22.2.0-dev). What's the rationale behind that? Are you trying to test out the latest fixes for the upcoming M1 support (https://github.com/oracle/graal/issues/2666)?

We are aware of some issues with master related to reflection, that we're investigating separately (cc @zakkak), independent of M1 specific issues. The issue shown here does smell a bit like that.

@metacosm It might be interesting to see if you have the issue above in a non-M1 env (e.g. as @jerboaa suggested linux/aarch64 or other x86).

metacosm commented 2 years ago

Aside from what @jerboaa suggests, it seems you're using a GraalVM master snapshot (GraalVM CE 22.2.0-dev). What's the rationale behind that? Are you trying to test out the latest fixes for the upcoming M1 support (oracle/graal#2666)?

Yes, trying native compilation on my M1 laptop.

We are aware of some issues with master related to reflection, that we're investigating separately (cc @zakkak), independent of M1 specific issues. The issue shown here does smell a bit like that.

I'm not using master, this is with 2.7.5.Final.

@metacosm It might be interesting to see if you have the issue above in a non-M1 env (e.g. as @jerboaa suggested linux/aarch64 or other x86).

As mentioned in the description, the same code compiles and works just fine on an Intel architecture so my take is that this is an M1-specific issue.

metacosm commented 2 years ago

I was curious and was trying to reproduce on Linux aarch64. This does seem to need some additional setup. What setup does it need (I don't have a Kubernetes cluster handy)?

@jerboaa What processor is this targeting? The application seems to be working fine for you, at least up to that point. As the app is an operator, if you're not connected to a Kubernetes cluster, it won't go past this step.

jerboaa commented 2 years ago

I was curious and was trying to reproduce on Linux aarch64. This does seem to need some additional setup. What setup does it need (I don't have a Kubernetes cluster handy)?

@jerboaa What processor is this targeting? The application seems to be working fine for you, at least up to that point. As the app is an operator, if you're not connected to a Kubernetes cluster, it won't go past this step.

@metacosm OK. It's a Linux aarch64 system. So from the sounds of it it seems to be an aarch64 Mac specific issue.

/proc/cpuinfo is:

# cat /proc/cpuinfo 
processor   : 0
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 1
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 2
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 3
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 4
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 5
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 6
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 7
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1
galderz commented 2 years ago

I'm not using master, this is with 2.7.5.Final.

Right, I meant about graalvm master having issues with Quarkus master, due to changes in graalvm master itself. I'd expect those issues to also appear with Quarkus 2.7.x.

I'll keep this issue assigned to me since I'm doing M1 testing as we speak.

galderz commented 2 years ago

@metacosm I've just tried with GraalVM master built 7th April and I see the same as @jerboaa:

2022-04-14 13:40:07,909 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): io.javaoperatorsdk.operator.OperatorException: Couldn't retrieve the currently connected namespace. Make sure it's correctly set in your ~/.kube/config file, using, e.g. 'kubectl config set-context <your context> --namespace=<your namespace>'

I think your issue is fixed as a result of the work done to support Apple M1, https://github.com/oracle/graal/issues/2666.

Can you try with the latest dev release here and check if you see the same thing?

metacosm commented 2 years ago

Yep, it starts properly now. I haven't checked further yet but at least the initial problem is fixed. Gotta say the M1s are impressive, a similar build takes more than 10 minutes on my Intel laptop:

========================================================================================================================
GraalVM Native Image: Generating 'quarkus-operator-sdk-samples-exposedapp-4.0.0-SNAPSHOT-runner' (executable)...
========================================================================================================================
[1/7] Initializing...                                                                                    (5.3s @ 0.30GB)
 Version info: 'GraalVM 22.2.0-dev Java 17 CE'
 C compiler: cc (apple, arm64, 13.1.6)
 Garbage collector: Serial GC
 2 user-provided feature(s)
  - io.quarkus.runner.AutoFeature
  - io.quarkus.runtime.graal.ResourcesFeature
[2/7] Performing analysis...  [*18:29:45,471 INFO  [org.jbo.threads] JBoss Threads version 3.4.2.Final
**********]                                                             (26.4s @ 2.42GB)
  13,791 (82.28%) of 16,761 classes reachable
  22,549 (66.30%) of 34,008 fields reachable
  85,599 (56.61%) of 151,210 methods reachable
     920 classes,   143 fields, and 9,782 methods registered for reflection
      65 classes,    76 fields, and    56 methods registered for JNI access
[3/7] Building universe...                                                                               (2.8s @ 3.14GB)
[4/7] Parsing methods...      [**]                                                                       (4.4s @ 3.49GB)
[5/7] Inlining methods...     [*****]                                                                    (8.3s @ 3.98GB)
[6/7] Compiling methods...    [******]                                                                  (33.4s @ 2.86GB)
[7/7] Creating image...                                                                                 (54.8s @ 2.85GB)
  30.55MB (42.95%) for code area:   54,938 compilation units
  34.11MB (47.95%) for image heap:   9,425 classes and 434,226 objects
   6.48MB ( 9.11%) for other data
  71.14MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area:                               Top 10 object types in image heap:
   2.34MB com.oracle.svm.core.reflect                          6.49MB byte[] for code metadata
   2.14MB io.fabric8.kubernetes.api.model                      3.89MB java.lang.Class
   1.79MB sun.security.ssl                                     3.46MB java.lang.String
   1.06MB java.util                                            3.46MB byte[] for java.lang.String
 746.37KB com.sun.crypto.provider                              3.30MB byte[] for general heap data
 705.96KB com.oracle.svm.core.code                             2.75MB java.lang.reflect.Method
 532.03KB io.quarkus.runtime.generated                         1.16MB com.oracle.svm.core.hub.DynamicHubCompanion
 522.13KB java.lang                                          872.12KB byte[] for reflection metadata
 463.35KB sun.security.x509                                  681.73KB java.lang.String[]
 452.00KB io.netty.buffer                                    629.72KB java.util.HashMap$Node
      ... 497 additional packages                                 ... 3141 additional object types
                                           (use GraalVM Dashboard to see all)
------------------------------------------------------------------------------------------------------------------------
                        13.9s (9.8% of total time) in 46 GCs | Peak RSS: 4.28GB | CPU load: 3.10
------------------------------------------------------------------------------------------------------------------------
...
Finished generating 'quarkus-operator-sdk-samples-exposedapp-4.0.0-SNAPSHOT-runner' in 2m 21s.