./native-image时实际执行的命令
graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/bin/java
第一个参数
#-XX:+UseParallelGC 是 Java 虚拟机(JVM)的一个选项,用于指定垃圾收集器的类型。
# 这个选项启用了并行垃圾收集器,这是一种利用多个 CPU 核心来加速垃圾收集的方式,
# 从而提高应用程序的性能。这种垃圾收集器在处理大量内存和多核心处理器的系统上表现良好,
# 特别是对于需要高吞吐量的服务器应用程序。然而,它可能会导致应用程序的暂停时间增加,
# 因为在垃圾收集期间,应用程序的所有线程都会被暂停。
-XX:+UseParallelGC
# -XX:+UnlockExperientalVMOptions是一个JVM(Java虚拟机)选项。它用于解锁试验性的JVM选项。
# 用于解锁对实验性虚拟机选项的访问。这个选项允许你使用那些被标记为实验性的 JVM 选项,
# 这些选项通常用于测试新的功能或者优化。这些选项可能在未来的 Java 版本中发生变化,
# 或者完全被移除,因此在生产环境中使用这些选项需要谨慎。
-XX:+UnlockExperimentalVMOptions
#-XX:+EnableJVMCI 是一个 JVM (Java 虚拟机) 选项。
# 这个选项用于启用 JVMCI (Java Virtual Machine Compiler Interface),
# 这是一个用于连接 JVM 和 Java 编译器的接口。启用这个选项后,
# JVM 可以使用 JVMCI 连接的编译器来进行即时编译 (JIT) 或者提前编译 (AOT)。
-XX:+EnableJVMCI
#Dtruffle.xxx和Dgraalvm.xxx相关的应该都是truffle框架相关的参数
-Dtruffle.TrustAllTruffleRuntimeProviders=true
-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime
-Dgraalvm.ForcePolyglotInvalid=true
-Dgraalvm.locatorDisabled=true
#--add-exports它的作用是指定将某个模块中的所有非公开 API 导出给所有未命名模块。
# 例如,--add-exports java.base/jdk.internal.misc=ALL-UNNAMED
# 就是将 java.base/jdk.internal.misc 模块中的所有非公开 API 导出给所有未命名模块
--add-exports=java.base/com.sun.crypto.provider=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.access=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.event=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.loader=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.logger=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.misc=org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile,org.graalvm.nativeimage.pointsto
--add-exports=java.base/jdk.internal.module=org.graalvm.nativeimage.base,org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.org.objectweb.asm=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.perf=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.platform=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.ref=org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile
--add-exports=java.base/jdk.internal.reflect=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.util=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.vm.annotation=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal.vm=org.graalvm.nativeimage.builder
--add-exports=java.base/jdk.internal=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.invoke.util=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.net.www=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.net=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.nio.ch=org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile
--add-exports=java.base/sun.reflect.annotation=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.reflect.generics.factory=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.reflect.generics.repository=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.reflect.generics.scope=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.reflect.generics.tree=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.security.jca=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.security.provider=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.security.ssl=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.security.util=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.security.x509=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.text.spi=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.util.calendar=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.util.cldr=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.util.locale.provider=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.util.locale=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.util.resources=org.graalvm.nativeimage.builder
--add-exports=java.base/sun.util=org.graalvm.nativeimage.builder
--add-exports=java.management/com.sun.jmx.mbeanserver=org.graalvm.nativeimage.builder
--add-exports=java.management/sun.management=org.graalvm.nativeimage.builder,org.graalvm.nativeimage.pointsto
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.aarch64=jdk.graal.compiler,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.amd64=jdk.graal.compiler,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code.site=jdk.graal.compiler,org.graalvm.nativeimage.builder
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code.stack=jdk.graal.compiler,org.graalvm.nativeimage.builder
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code=jdk.graal.compiler,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile,org.graalvm.nativeimage.pointsto,org.graalvm.truffle.compiler
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.common=jdk.graal.compiler,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.pointsto
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.aarch64=jdk.graal.compiler
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.amd64=jdk.graal.compiler
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.riscv64=jdk.graal.compiler
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot=jdk.graal.compiler,org.graalvm.nativeimage.builder
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.meta=jdk.graal.compiler,org.graalvm.nativeimage.base,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.objectfile,org.graalvm.nativeimage.pointsto,org.graalvm.truffle.compiler
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.riscv64=jdk.graal.compiler,org.graalvm.nativeimage.builder
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.runtime=jdk.graal.compiler,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.pointsto
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.services=jdk.graal.compiler,org.graalvm.nativeimage.builder
--add-exports=jdk.jfr/jdk.jfr.events=org.graalvm.nativeimage.builder
--add-exports=jdk.jfr/jdk.jfr.internal.event=org.graalvm.nativeimage.builder
--add-exports=jdk.jfr/jdk.jfr.internal.jfc=org.graalvm.nativeimage.builder
--add-exports=jdk.jfr/jdk.jfr.internal=org.graalvm.nativeimage.builder
--add-exports=jdk.management/com.sun.management.internal=org.graalvm.nativeimage.builder
#用于控制是否使用 JVMCI 编译器作为 JVM 的即时 (JIT) 编译器。
-XX:-UseJVMCICompiler
#用于设置每个线程的 Java 栈大小。在这个例子中,10m 表示每个线程的栈大小被设置为 10 兆字节。
-Xss10m
#用于设置 JVM 可用的最大物理内存的百分比。例如,如果你设置 -XX:MaxRAMPercentage=60.0,
# 那么 JVM 将尝试使用最多 85% 的物理内存。
-XX:MaxRAMPercentage=85.0
#用于控制垃圾收集(GC)和应用程序代码执行的时间比例。这个参数的值是一个整数,
# 表示应用程序代码执行时间与垃圾收集时间的比例。例如,
# -XX:GCTimeRatio=9 表示 1/10 的时间用于垃圾收集,而剩余的 9/10 的时间用
-XX:GCTimeRatio=9
#你在 JVM 启动参数中设置了这个选项,一旦 JVM 因为内存溢出(OutOfMemoryError)
# 而无法继续运行,JVM 就会立即退出。通过使用这个参数,你可以更早地发现这些问题,
# 从而避免应用程序在关键时刻崩溃。
-XX:+ExitOnOutOfMemoryError
#当你在 JVM 启动参数中设置了这个选项,
# Java 将在 “headless” 模式下运行。这意味着 Java 将不会使用图形用户界面(GUI)系统资源。
-Djava.awt.headless=true
#下面五个属性是指定运行环境为GraalVM,并配置对应的详细信息
'-Dorg.graalvm.vendor=GraalVM Community'
-Dorg.graalvm.vendorurl=https://www.graalvm.org/
'-Dorg.graalvm.vendorversion=GraalVM CE 22-dev+27.1'
-Dorg.graalvm.version=dev
-Dcom.oracle.graalvm.isaot=true
#这个参数允许你指定一个自定义的类加载器(class loader)
# 来替代 Java 虚拟机(JVM)的默认类加载器。
-Djava.system.class.loader=com.oracle.svm.hosted.NativeImageSystemClassLoader
#用于控制类数据共享 (CDS)。当设置为 -Xshare:off 时,
# Java HotSpot VM 将不会尝试使用共享类数据。会导致应用启动和运行速度变慢。
-Xshare:off
#影响 Java 对象序列化的行为,让java代码即使没有找到没有参数的构造函数,也可以创建对象。
-Djdk.reflect.useOldSerializableConstructor=true
#延迟 Lambda 表达式的初始化,在真正需要使用 Lambda 表达式的时候才进行初始化。
-Djdk.internal.lambda.disableEagerInitialization=true
-Djdk.internal.lambda.eagerlyInitialize=false
-Djava.lang.invoke.InnerClassLambdaMetafactory.initializeLambdas=false
-Djava.lang.invoke.MethodHandle.DONT_INLINE_THRESHOLD=-1
--add-modules=ALL-DEFAULT
#当程序运行中找不到所需module时,Java会使用module-path来查找,
# 通常是应用、库和框架module。它将module-path上的所有制品,甚至是普通 JARs,
# 转换成自动module,实现渐进模块化。
--module-path
/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/builder/svm.jar:/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/builder/native-image-base.jar:/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/builder/objectfile.jar:/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/builder/svm-foreign.jar:/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/builder/pointsto.jar
#在Java 9及更高版本中,你可以使用模块化JAR(包含模块描述符的JAR)作为模块。
# 例如,如果你有一个名为hello.world的模块在hello.jar文件中,
# 你可以使用以下命令来运行它:java --module-path hello.jar --module hello.world
--module
org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner
-keepalive
/var/folders/n_/klffvb9j0tg8td2yw8x2_3rr0000gn/T/.native_image10214313091152991450alive
上面命令中需要关注主要还是–module命令,从第三章可以看出来其实生成可执行文件的入口函数就在NativeImageGeneratorRunner文件中,这里可以看出来graalvm的实现方式。(当然还有其他涉及到性能优化的命令,如: -Djdk.internal.lambda.disableEagerInitialization | -Djava.awt.headless=true | -XX:MaxRAMPercentage 等)
其中部分命令没有说明,感觉是graalvm的命令,官网和代码中没有明确说明其作用。
第二个参数
#
#下面命令基本都是和graalvm相关的,可以参考下面链接
#https://github.com/oracle/graal/blob/8a010c6c2d3886237cceaf12d3f9966503a0e5a6/docs/reference-manual/native-image/guides/build-native-shared-library.md
#https://github.com/oracle/graal/blob/9ec5ca83e88cd819a1a9e350d268c3845ad7a6e5/substratevm/docs/module-system/ModuleSystemSupportHosted.md
-imagecp/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/bin
-imagemp/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/library-support.jar
-H:CLibraryPath=/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/clibraries/darwin-aarch64
-H:Path@driver=/Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/bin
-H:Class@explicit main-class=HelloWorld
#指定可执行文件的名称
-H:Name@main-class lower case as image name=helloworld
-H:ImageBuildID@driver=afe85bb4-cac4-22f3-b447-8af426d752bb
-H:Features@jar:file:///Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/library-support.jar
!/META-INF/native-image/com.oracle.svm/thirdparty/native
-image.properties+api=com.oracle.svm.thirdparty.gson.GsonFeature
-H:Features@jar:file:///Users/xxx/soft/graal/sdk/mxbuild/darwin-aarch64/GRAALVM_6723241A54_JAVA22_STAGE1/graalvm-6723241a54-java22-24.0.0-dev/Contents/Home/lib/svm/library-support.jar
!/META-INF/native-image/com.oracle.svm/polyglot/native-image.properties+api=com.oracle.svm.polyglot.groovy.GroovyIndyInterfaceFeature,com.oracle.svm.polyglot.scala.ScalaFeature
-H:Color@driver=always
-H:+BuildOutputProgress@driver
-H:+BuildOutputLinks@driver
后续内容可通过知识星球查看:
https://t.zsxq.com/153Fqg272