首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么GraalVM (SubstrateVM)原生映像在运行时使用的内存比相应的JIT构建要少得多?

GraalVM是一种高性能的通用虚拟机,它支持多种编程语言,并提供了SubstrateVM作为其原生映像技术。原生映像是指将应用程序及其依赖项编译成本地机器码,以实现更快的启动时间和更低的内存消耗。

相比于使用JIT(即时编译)构建的应用程序,GraalVM原生映像在运行时使用的内存要少得多的原因有以下几点:

  1. AOT编译:GraalVM的SubstrateVM使用AOT(Ahead-of-Time)编译技术,即在应用程序运行之前将其编译成本地机器码。这样做的好处是,应用程序在运行时不需要进行即时编译,从而减少了内存的使用。
  2. 优化的静态分析:SubstrateVM对应用程序进行静态分析,识别出不需要的代码和依赖项,并将其从原生映像中剔除。这样可以减少内存占用,并提高应用程序的运行效率。
  3. 垃圾回收优化:GraalVM的SubstrateVM针对原生映像进行了优化,采用了更加紧凑的垃圾回收算法,减少了内存碎片和垃圾回收的开销,从而降低了内存的使用。
  4. 静态库链接:SubstrateVM将应用程序及其依赖项静态链接成一个单独的可执行文件,避免了动态链接库的加载和内存占用。

总结起来,GraalVM的SubstrateVM原生映像在运行时使用的内存比相应的JIT构建要少得多,主要得益于AOT编译、优化的静态分析、垃圾回收优化和静态库链接等技术。这使得原生映像具有更低的内存消耗,更高的运行效率,并适用于对内存占用有严格要求的场景,如嵌入式设备、云函数等。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云原生应用平台(TKE App):https://cloud.tencent.com/product/tke-app
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

过两年 JVM 可能就要被 GraalVM 替代了

JVM 全称 Java 虚拟机,我们都知道,Java 程序是运行在虚拟机上,虚拟机提供 Java 运行时,支持解释执行和部分JIT)即时编译器,并且负责分配和管理 Java 运行所需内存,我们所说各种垃圾收集器都工作在...GraalVM AOT 编译实际上是借助了 SubstrateVM 编译框架,可以将 SubstrateVM 理解为一个内嵌精简版 JVM,包含异常处理,同步,线程管理,内存管理(垃圾回收)和...SubstrateVM 启动时间非常短,内存开销非常。用这种方式编译出 Java 程序行时间可与C语言持平。...下图是使用即时编译(JVM运行)与 AOT (原生可执行程序)两种方式 CPU 和内存使用情况对比,可以看出来,AOT 方式下 CPU 和内存使用都非常。...除了运行时占用内存之外,用这种方式最终生成可执行文件也非常小。这对于云端部署非常友好。

4.6K11

GraalVM(云原生时代Java)和IoT在边缘侧落地与实践

GraalVM - 云原生时代Java “一次编写,到处运行“是Java语言特性,这一重特性依靠是JVM虚拟机 在讨论GraalVM之前,我们先聊下Java代码是怎么运行?...实际运行时,虚拟机会执行方法区内代码。Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。...GraalVM带来哪些神奇黑魔法‍♂️ 更快、更轻量化应用 GraalVM高性能JIT编译器可以生成优化本地机器代码,由于采用了先进编译器优化和积极复杂内联技术,运行速度更快,产生垃圾更少...GraalVM AOT 编译实际上是借助了 SubstrateVM 编译框架,可以将 SubstrateVM 理解为一个内嵌精简版 JVM,包含异常处理,同步,线程管理,内存管理(垃圾回收)和 JNI...SubstrateVM 启动时间非常短,内存开销非常。用这种方式编译出 Java 程序行时间可与C语言持平。

88720

Java 革新之路:GraalVM 原生镜像

尽管 JVM 解释器性能很好,但还是不如运行已编译代码快。这就是为什么 Oracle JVM(HotSpot)也包含了即时(JIT)编译器,它可以在程序执行时将应用程序代码编译成机器码。...GraalVM 原生镜像默认在运行时进行类初始化,以确保正确行为。但是,如果原生镜像可以证明某些类可以安全地初始化,它就会在构建时对它们进行初始化。...这里有一个例子: JIT原生镜像使用 CPU 和内存对比 上图显示了 Web 服务器在 JVM 上(左)和作为原生可执行文件(右)行时行为。...这就是为什么它比应用程序代码、库和 JVM 总和得多。在某些场景中,例如在资源受限环境中,应用程序体积可能是一个很重要因素。UPX等工具可以进一步压缩原生可执行文件体积。...我们还减少了大约 10%内存使用调试原生镜像生成可执行文件,可以在命令行中使用“gdb”(在 Linux 和 macOS 上),或者使用 GraalVM VS Code 扩展。

1.3K40

Spring6 正式发布!重磅更新,是否可以拯救 Java

PathMatchingResourcePatternResolver 使用 NIO 和模块路径 API 进行扫描,分别支持 GraalVM 本地映像和 Java 模块路径中类路径扫描。...有两种编译 Java 应用程序方法:使用即时编译 (JIT) 或提前编译 (AOT)。第一种是默认模式,Java Hotspot 虚拟机使用在运行时将字节码转换为机器码。...后者由新颖 GraalVM 编译器支持,并允许在构建时将字节码直接静态编译为机器码。...技术在运行时内存占用低,启动速度快,逐渐来满足 Java 在云原生时代需求,对于大规模使用 Java 应用商业公司可以考虑尽早调研使用 JDK17,通过云原生技术为公司实现降本增效。...GraalVM 提供两种运行 Java 应用程序方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译本机可执行文件。

7.2K00

Spring6 AOT 提前编译

在程序运行前编译,可以避免在运行时编译性能消耗和内存消耗可以在程序运行初期就达到最高性能,程序启动速度快运行产物只有机器码,打包体积小AOT缺点由于是静态提前编译,不能根据硬件情况或程序运行情况择优选择机器指令序列...,理论峰值性能不如JIT没有动态能力,同一份产物不能跨平台运行第一种即时编译 (JIT) 是默认模式,Java Hotspot 虚拟机使用在运行时将字节码转换为机器码。...技术在运行时内存占用低,启动速度快,逐渐来满足 Java 在云原生时代需求,对于大规模使用 Java 应用商业公司可以考虑尽早调研使用 JDK17,通过云原生技术为公司实现降本增效。...1.2、GraalvmSpring6 支持 AOT 技术,这个 GraalVM 就是底层支持,Spring 也对 GraalVM 本机映像提供了一流支持。...GraalVM 提供两种运行 Java 应用程序方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译本机可执行文件。

25820

2020年你将会选择哪个微服务框架?

通过其良好文档,全面的各方面整合类库,Spring使开发人员可以有效地创建和维护应用程序,并提供平坦学习曲线。 Spring在运行时使用反射执行DI。...我使用OpenJDK Docker映像运行了所有应用程序。如果该框架支持生成本机GraalVM映像,我也比较了它们性能。 我在以下几个方面对比了它们性能: 把上述示例应用程序开发出来多久?...本机映像启动时间在1.39秒(Quarkus)和1.46秒(使用JDBCMicronaut)之间,OpenJDK实现要快得多。 所有框架运行时使用内存使用情况非常相似。...同样,仅使用7 MB(Quarkus)和27 MB(Micronaut使用JPA)内存原生GraalVM映像表现大大优于OpenJDK。...这甚至同一个应用程序作为本机映像运行得多,该应用程序平均花费368 MB内存。 但是,Micronaut却非常浪费。

2.7K11

轻量灵动:革新轻量级服务开发

这意味着你可以将 GraalVM 作为运行时引擎嵌入到你应用程序中,从而实现更高灵活性和自定义性。 1.3.5 云原生支持: GraalVM 具有与云原生应用程序开发和部署相关特性。...2.7 本机映像构建配置 maven常用配置 如果要将其他参数传递给本机图像生成器,请 在插件配置中使用 --...如果启用调试信息生成,请在插件配置中提供以下内容: true 如果要使用参数文件构建原生图像,请在插件配置中提供以下内容: <useArgFile...内存占用:GraalVM AOT 编译可以减少应用程序内存占用,因为本地机器码通常解释执行字节码更加紧凑。这可以提高应用程序可扩展性和资源利用率。...在云原生下,Java升级到最新版本并使用GraalVM可以提高Java应用性能、体验新特性、提高资源利用率和适应万物云原生能力。

30310

Java在云原生破局利器——AOT(JIT与AOT)

JIT与AOT区别 提前编译是相对于即时编译概念,提前编译能带来最大好处是Java虚拟机加载这些已经预编译成二进制库之后就能够直接调用,而无须再等待即时编译器在运行时将其编译成二进制机器码。...AOT优点 在程序运行前编译,可以避免在运行时编译性能消耗和内存消耗 可以在程序运行初期就达到最高性能,程序启动速度快 运行产物只有机器码,打包体积小 AOT缺点 由于是静态提前编译,不能根据硬件情况或程序运行情况择优选择机器指令序列...因此在Java诞生至今几十年里,AOT编译方式和Java可以说是“一毛钱关系都没有”,那么为什么今天我们又要提起以AOT方式运行Java程序呢,是JIT它不香么?...HighPerformance:高性能,首先它提供了一个高性能JIT引擎,让Java语言在GraalVM上执行时候效率更高速度更快 ;其次就是提供了SubstrateVM,通过Graal Compiler...=> 在运行期动态生成或者是动态获取字节码程序,无法构建成 Native Image。 Java动态特性,包括反射、JNI、代理,都需要通过配置文件在构建前实现声明好。

2.3K30

Spring Boot3 新玩法,AOT 优化!

JIT 编译器在程序运行时根据需要将代码片段编译成机器码,以提高程序执行效率。JIT 编译器通常用于解释型语言或动态语言执行环境中,可以在运行时将解释代码转换为机器码,从而提高程序执行速度。...AOT 编译器在程序构建或安装阶段将代码转换为机器码,然后在运行时直接执行机器码,而无需再进行编译过程。这种静态编译方式可以提高程序启动速度和执行效率,但也会增加构建和安装时间和复杂性。...生成 GraalVM 原生镜像配置:使用 RuntimeHints 实例生成 GraalVM 原生镜像配置文件。...AOT 编译器无法确定动态调用类和方法。 属性文件:属性文件内容可以在运行时更改。由于作用时机问题,AOT 编译器无法确定动态使用属性文件。...这使得 GraalVM 成为一个更加通用和灵活虚拟机。 内存占用:GraalVM内存占用方面相对较低,这是由于其编译器技术和优化策略改进。

1.1K10

Java一分钟之-GraalVM:高性能运行时与编译器

GraalVM通过其独特即时编译(JIT)和提前编译(AOT)技术,为应用程序带来了显著性能提升和跨语言互操作性。...高性能:通过高级编译技术,GraalVM能够显著提高应用程序启动速度和运行时性能。Native Image:AOT编译功能,可将Java应用编译成独立、接近零启动时间原生可执行文件。...Native Image构建失败问题:初次尝试使用Native Image构建应用时,常因依赖问题或配置不当导致构建失败。 解决:确保所有依赖都支持原生映像构建。...内存与资源消耗误解误解:误以为Native Image会无条件减少所有应用内存占用。 澄清:虽然启动时内存占用低,但运行时内存消耗取决于应用逻辑,复杂应用可能不会显著减少。...; }}使用以下命令行构建原生映像:native-image --no-fallback -H:Class=HelloWorld构建成功后,将生成一个名为hello-world可执行文件(Linux

36610

OracleJVM你知道,GraalVM你知道吗?

GraalVM目的是为开发人员提供一种统一行时环境,以简化应用程序开发和部署。 GraalVM核心是一个即时编译器(JIT),它可以将源代码编译成高效机器码,以便在运行时进行高效执行。...内存管理:GraalVM垃圾回收器JVM更加高效,可以更好地管理内存。这使得在处理大量数据时,GraalVM可以提供更好性能和更低内存消耗。 4....如何使用GraalVM? 要使用GraalVM,您需要安装相应软件包并配置您开发环境。一旦安装完成,您可以使用您喜欢编程语言编写应用程序,并使用GraalVM将其编译和执行。...云原生应用:GraalVM可以与云原生技术结合使用,如Kubernetes。这使得开发者可以轻松地部署和管理云原生应用,提高应用可用性和可扩展性。 6....总之,GraalVM使用场景非常广泛,可以应用于各种需要高性能计算、实时响应、多语言支持、容器化技术、云原生应用以及AI和机器学习场景。

35610

标准化原生 Java:拉进 GraalVM 和 OpenJDK 距离

由于容器启动频率更高,固定 JVM 启动成本在总运行时间中所占百分变得更加显著。另外,Java 应用程序仍然需要内存来进行 JIT 编译。那么,如何让 Java 应用程序在容器中高效运行呢?...首先,越来越多 Java 应用程序以微服务形式运行,工作负载单体应用程序。所以,它们应用程序数据集更小,使用内存也更少。...后面这些是必需,因为将所有功能编译到可执行文件中会使其动态 Java 更大、更慢。JIT 编译器会为当前硬件和运行时环境特定功能生成代码。...这种组合效果最大限度地减少了 GraalVM 启动时间和内存占用。 不幸是,构建时初始化面临问题不会比前两个需求。...原生 Java 显然存在这种权衡——编译时间并不会减少,只是从运行时 JIT 编译转移到构建 AOT 编译。它还需要更长时间,因为构建时初始化封闭式分析和验证 JIT 编译复杂得多

77420

Spring6和SpringBoot3新特性-你不得不了解AOT原来这么简单

1.AOT概述 1.1 JIT和AOT关系 1.1.1 JIT    JIT(Just-in-time) 动态编译,即时编译,也就是边运行边编译,也就是在程序运行时,动态生成代码,启动比较慢,编译时需要占用运行时资源...使用Native image,开发人员可以将Java应用程序作为本地应用程序来构建和部署,从而获得更好性能和更好用户体验。...你会发现速度会快很多 五、RuntimeHints   与常规 JVM 运行时相比,将应用程序作为本机映像运行需要额外信息。例如,GraalVM 需要提前知道组件是否使用反射。...同样,除非明确指定,否则类路径资源不会在本机映像中提供。因此,如果应用程序需要加载资源,则必须从相应 GraalVM 原生图像配置文件中引用它。...APIRuntimeHints在运行时收集反射、资源加载、序列化和 JDK 代理需求。

2.3K30

Spring Boot 3.2 正式发布,一波新特性,开箱即用!

我们不打算深入细节,官方 JEP 提供了很好解释: https://openjdk.org/jeps/444 GraalVM 和本机镜像 GraalVM 是一种高性能 JDK,可以使用替代即时 (JIT...Native Image 是一种提前将 Java 代码编译为独立可执行文件(称为本机映像技术。该可执行文件包括应用程序类、其依赖项中类、运行时库类以及来自 JDK 静态链接本机代码。...它不在 Java VM 上运行,但包含来自不同运行时系统必要组件,如内存管理、线程调度等。与 JVM 相比,生成程序具有更快启动时间和更低行时内存开销。...现在让我们在 GraalVM 上运行它。 首先,我们需要构建一个 GraalVM 本机映像:(此命令可能需要几分钟)然后运行:(使用应用程序名称而不是“app”) ..../build/native/nativeComplie/app 它也可以工作,并且启动时间要快得多,这符合声明“与 JVM 相比,生成程序具有更快启动时间和更低行时内存开销”。

3.2K10

Spring新版本抛弃JVM,可独立部署,网友:自立门户???

这些本机 Spring 应用程序可以部署为独立可执行文件(无需安装 JVM),并提供有趣特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低内存消耗,但所需构建时间和运行时优化次数少于...上使用 Spring Boot 和 GraalVM 构建原生微服务。...据悉,原生功能工作范围 Spring 更广,因为原生涉及到更广泛 JVM 生态系统,所以官方一直在与 GraalVM 团队合作,以改善原生镜像兼容性和资源消耗。...Spring 构建原生应用最简单方式。...提前转换 本机不同于 JVM:类路径在构建时是固定,例如需要反射或资源进行配置,没有类延迟加载(可执行文件中附带所有内容在启动时都加载到内存中),并且可以调用一些代码在构建时。

1.6K20

Spring 官宣,抛弃原生 JVM!网友:这是单干啊!

这些本机 Spring 应用程序可以部署为独立可执行文件(无需安装 JVM),并提供有趣特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低内存消耗,但所需构建时间和运行时优化次数少于...Spring Boot 和 GraalVM 构建原生微服务。...据悉,原生功能工作范围 Spring 更广,因为原生涉及到更广泛 JVM 生态系统,所以官方一直在与 GraalVM 团队合作,以改善原生镜像兼容性和资源消耗。...提前转换 本机不同于 JVM:类路径在构建时是固定,例如需要反射或资源进行配置,没有类延迟加载(可执行文件中附带所有内容在启动时都加载到内存中),并且可以调用一些代码在构建时。...这就是为什么我们与 GraalVM 团队进行深入合作以缩小这一差距原因。在接下来几个月中,这项合作将专注于为更广泛 JVM 生态系统改善本机测试和本机配置。

1.7K20

Spring Native 中文文档

GraalVM 项目也有一些缺点和权衡,希望随着时间推移有所改进。构建本地映像是一个繁重过程,常规应用程序慢,预热后行时优化也更少。最后,比起 JVM 很多场景下还不成熟。...--allow-incomplete-classpath允许使用不完整类路径构建映像,并在首次访问它们时(而不是在构建映像时)在运行时报告类型解析错误。...--report-unsupported-elements-at-runtime 报告不支持方法和字段在第一次访问时在运行时使用情况,而不是在映像构建期间显示为错误。...如果可以在构建本机映像时执行检查,那么这是最佳选择,那么在运行时该状态检查不需要反射配置。实现此优化: 在一种类型静态块/字段中执行状态检查。...10.1.4 尽可能尝试使用功能性方法 对于在运行时执行代码,请尽可能使用 lambda 和方法引用之类功能方法,而不是尽可能使用反射,因为这些结构会被原生镜像静态分析自动理解。

10.1K10

Spring新版本抛弃JVM,可独立部署,网友:自立门户???

这些本机 Spring 应用程序可以部署为独立可执行文件(无需安装 JVM),并提供有趣特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低内存消耗,但所需构建时间和运行时优化次数少于...上使用 Spring Boot 和 GraalVM 构建原生微服务。...据悉,原生功能工作范围 Spring 更广,因为原生涉及到更广泛 JVM 生态系统,所以官方一直在与 GraalVM 团队合作,以改善原生镜像兼容性和资源消耗。...Spring 构建原生应用最简单方式。...提前转换 本机不同于 JVM:类路径在构建时是固定,例如需要反射或资源进行配置,没有类延迟加载(可执行文件中附带所有内容在启动时都加载到内存中),并且可以调用一些代码在构建时。

84030

Spring 官宣,干掉原生 JVM!

这些本机 Spring 应用程序可以部署为独立可执行文件(无需安装 JVM),并提供有趣特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低内存消耗,但所需构建时间和运行时优化次数少于...上使用 Spring Boot 和 GraalVM 构建原生微服务。...据悉,原生功能工作范围 Spring 更广,因为原生涉及到更广泛 JVM 生态系统,所以官方一直在与 GraalVM 团队合作,以改善原生镜像兼容性和资源消耗。...Spring 构建原生应用最简单方式。...提前转换 本机不同于 JVM:类路径在构建时是固定,例如需要反射或资源进行配置,没有类延迟加载(可执行文件中附带所有内容在启动时都加载到内存中),并且可以调用一些代码在构建时。

1.2K40

Spring Boot3,启动时间缩短 10 倍!

在运行上,GraalVM 同时支持 JIT 和 AOT 两种模式: JIT 是即时编译(Just-In-Time Compilation)缩写。它是一种在程序运行时将代码动态编译成机器码技术。...所以 JIT 启动会比较慢,因为编译需要占用运行时资源。我们平时使用 Oracle 提供 Hotspot JVM 就属于这种。...与即时编译(JIT)不同,即时编译是在程序运行时动态地将代码编译成机器码。AOT 编译器在程序构建或安装阶段将代码转换为机器码,然后在运行时直接执行机器码,而无需再进行编译过程。...减少内存占用:编译成本地代码后,应用程序通常会有更低行时内存占用,因为它们不需要 JVM 额外内存开销。...即时性能:虽然 JVM 可以通过JIT(Just-In-Time)编译在运行时优化代码,但 Native Image 提供了即时、预先优化性能,这对于需要快速响应应用程序特别有用。

30910
领券