JVM——SubstrateVM:AOT编译框架
引入
在现代软件开发领域,应用程序的启动性能和内存开销一直是影响用户体验的关键因素。对于 Java 应用程序而言,传统的即时编译(JIT)模式虽然能够在运行时对热点代码进行优化,提高程序的执行效率,但却无法避免在程序启动初期的解释执行阶段所带来的性能开销。此外,Java 虚拟机(JVM)本身的初始化过程也会增加应用程序的启动时间。为了克服这些局限,GraalVM 引入了 SubstrateVM,一个高性能的 Ahead-Of-Time(AOT)编译框架,旨在显著提升 Java 应用的启动性能并降低内存占用。
AOT 编译:挑战即时编译的局限
即时编译的不足
即时编译(JIT)作为一种在程序运行过程中将字节码转换为机器码的技术,已经在现代 JVM 中得到了广泛应用。JIT 编译器能够根据程序的实际运行情况,对热点代码进行优化,从而提高程序的执行效率。
然而,JIT 模式也存在一些明显的局限性:
-
启动性能问题 :在程序启动初期,JVM 需要花费一定的时间来解释执行字节码,直到代码被 JIT 编译器编译为机器码。这段时间内的性能表现往往较差,对于需要快速启动的应用(如云原生应用、微服务等)来说,是一个难以接受的瓶颈。
-
内存占用较大 :JVM 在运行时需要维护大量的内部数据结构,如代码缓存、类加载数据等,这些都会增加应用的内存开销。此外,JIT 编译过程本身也需要消耗一定的内存资源。
AOT 编译的优势与挑战
AOT 编译技术通过在程序运行之前将字节码预编译为机器码,有效地解决了上述问题。
AOT 编译的主要优势包括:
-
快速启动 :由于代码在运行前已经被编译为机器码,程序可以在启动时直接执行优化后的代码,无需经历解释执行和 JIT 编译的过程,从而大幅缩短启动时间。
-
降低内存开销 :AOT 编译避免了运行时 JIT 编译所需的内存,并且可以减少代码缓存等数据结构的内存占用。
然而,AOT 编译也面临着一些挑战:
-
缺乏运行时信息 :与 JIT 编译不同,AOT 编译无法获取程序运行时的具体信息,如类的继承关系、方法的调用频率等。这使得 AOT 编译器难以进行基于运行时 profile 的优化,如投机性优化和虚方法内联。
-
动态特性支持有限 :AOT 编译通常要求程序在编译时是封闭的,即不能动态加载类或进行反射操作。这对于一些高度动态的应用程序可能不太适用。
SubstrateVM 的设计理念与架构
SubstrateVM 的设计目标
SubstrateVM 是 GraalVM 中的一个关键组件,其设计目标是提供一个高启动性能、低内存开销且能够无缝与 C 代码集成的 Java 运行时环境。
与传统的 JVM(如 HotSpot)相比,SubstrateVM 具有以下显著特点:
-
独立的运行时 :SubstrateVM 拥有自己的运行时组件,包括异常处理、同步、线程管理、内存管理(垃圾回收)和 JNI 等,完全脱离了 HotSpot 虚拟机。这使得 SubstrateVM 能够以更轻量级的方式运行 Java 应用,减少不必要的性能开销。
-
静态分析与编译 :SubstrateVM 假设目标程序是封闭的,即在编译时可以确定所有可能执行到的类和方法。通过静态分析,SubstrateVM 能够预先编译整个程序,并将所有必要的类和方法纳入编译范围,从而避免了解释执行的需要。
-
堆快照技术 :在 AOT 编译过程中,SubstrateVM 会执行程序的初始化代码,并将已初始化的堆状态保存为堆快照。在程序启动时,SubstrateVM 可以直接加载这个堆快照,而无需重复执行初始化过程,这进一步缩短了启动时间。
SubstrateVM 的架构组成
SubstrateVM 主要由以下两个部分组成:
-
native image generator :这是 SubstrateVM 的 AOT 编译器,负责将 Java 类文件编译为可执行文件或动态链接库。它本身是一个 Java 程序,利用 Graal 编译器完成实际的代码转换工作。在编译过程中,native image generator 会从程序的入口点出发,通过指针分析(points-to analysis)探索所有可达的代码路径,确保所有可能执行的方法都被编译。
-
SubstrateVM 运行时 :这是一个轻量级的运行时环境,用于执行 AOT 编译后的代码。它提供了必要的系统支持功能,如线程调度、内存分配和垃圾回收等,但去掉了传统 JVM 中许多与 AOT 编译无关的组件,从而减少了内存占用和启动时间。
SubstrateVM 的工作流程
SubstrateVM 的工作流程可以分为以下几个阶段:
-
程序分析与优化 :native image generator 对输入的 Java 类文件进行静态分析,确定程序的封闭性,并构建整个程序的调用图。在这个过程中,它会应用一系列的优化技术,如死代码消除、方法内联等,以提高编译后代码的执行效率。
-
代码生成与堆快照创建 :基于调用图和优化后的代码,native image generator 使用 Graal 编译器将 Java 字节码转换为目标机器的机器码,并将其组织成可执行文件或动态链接库的结构。同时,它会执行程序的初始化代码,并保存初始化后的堆状态为堆快照。
-
运行时加载与执行 :在程序启动时,SubstrateVM 运行时加载 AOT 编译生成的可执行文件或动态链接库,以及对应的堆快照。然后,它直接从程序的入口点开始执行预编译的机器码,无需进行任何解释执行或即时编译。
SubstrateVM 的启动时间与内存开销优化
启动时间优化
SubstrateVM 在启动时间上的优化主要得益于以下几个方面:
-
预编译代码 :由于代码已经在编译时被转换为机器码,程序启动时无需等待即时编译器对代码进行编译,可以直接执行优化后的机器码。
-
堆快照技术 :SubstrateVM 在编译时执行程序的初始化代码,并保存堆快照。在启动时,它可以快速加载这个快照,恢复程序的初始状态,而无需重新执行复杂的初始化逻辑。
通过对比不同运行时环境下的 Hello World 程序启动时间,我们可以直观地感受到 SubstrateVM 的优势:
-
C 程序 :启动时间通常在 10ms 以下。
-
HotSpot JVM 上的 Java 程序 :启动时间约为 40ms。
-
SubstrateVM 上的 Java 程序 :启动时间与 C 程序相近,也在 10ms 以下。
内存开销优化
SubstrateVM 在内存开销方面的优化主要体现在以下几点:
-
精简的运行时组件 :SubstrateVM 去掉了传统 JVM 中许多不必要的组件,如复杂的类加载器、冗余的内存管理模块等,从而减少了内存占用。
-
共享只读数据 :在 AOT 编译过程中,SubstrateVM 将程序中的只读数据(如字符串常量、类元数据等)存储在只读内存区域,这些数据可以在多个进程间共享,进一步降低了内存使用。
同样,通过对比不同运行时环境下的内存开销,我们可以看到 SubstrateVM 的显著优势:
-
C 程序 :内存开销在 500KB 以下。
-
HotSpot JVM 上的 Java 程序 :内存开销约为 24MB。
-
SubstrateVM 上的 Java 程序 :内存开销约为 850KB,远低于 HotSpot JVM。
此外,SubstrateVM 在处理基于 Truffle 的语言实现时,也展现出了卓越的性能。例如,运行在 SubstrateVM 上的 Graal.js(JavaScript 实现)在执行 Hello World 程序时,启动时间低于 10ms,内存开销仅为 4.2MB,与 Google 的 V8 引擎相比,在启动时间相当的情况下,内存开销大幅降低。
Metropolis 项目:Java-on-Java 的探索
Java-on-Java 的愿景
Metropolis 项目是 OpenJDK 社区中的一个重要 initiative,其目标是探索使用 Java 语言来实现 Java 虚拟机本身的可行性。这一愿景,即所谓的 “Java-on-Java”,旨在解决传统 JVM 实现(如 HotSpot,主要使用 C++ 编写)所带来的一系列问题:
-
开发与维护门槛高 :C++ 的复杂性使得对 JVM 的开发和维护需要深厚的 C++ 语言知识,限制了开发者社区的规模。
-
优化技术的局限性 :JVM 的实现语言限制了对某些优化技术的应用。例如,使用 Java 实现的编译器可能更容易与其他 Java 工具和框架集成,并利用 Java 的类型系统和内存管理特性进行优化。
-
与 C++ 生态系统的耦合 :传统 JVM 的开发和更新往往受到 C++ 语言发展和工具链升级的影响,增加了维护的复杂度。
Metropolis 项目与 SubstrateVM 的结合
Metropolis 项目计划通过将 HotSpot JVM 中的 C++ 代码逐步替换为 Java 代码,实现 Java-on-Java 的目标。
在这个过程中,SubstrateVM 扮演了关键角色:
-
AOT 编译的 Graal 编译器 :Metropolis 项目的一个子项目旨在将 Graal 编译器本身使用 SubstrateVM 进行 AOT 编译。这样,Graal 编译器在运行时将不再需要被即时编译,从而避免了其与应用程序争夺编译线程 CPU 资源的问题,显著提高了使用 Graal 编译器的 HotSpot JVM 的启动性能。
-
独立的堆空间 :AOT 编译后的 Graal 编译器将使用独立的堆空间,其在即时编译过程中生成的 Java 对象不再干扰应用程序的堆空间,进一步减少了内存占用和垃圾回收的负担。
Metropolis 项目的发展现状与前景
目前,Metropolis 项目仍处于早期探索和验证阶段。开发团队正在积极研究和解决 Java-on-Java 实现中遇到的各种技术挑战,如如何高效地实现垃圾回收、线程管理等功能,以及如何确保性能不因实现语言的改变而受到影响。
尽管面临诸多挑战,Metropolis 项目为 JVM 的未来发展提供了一条充满潜力的路径。一旦成功实现,它将为 Java 开发者带来以下好处:
-
提升开发效率 :使用 Java 实现的 JVM 更容易被 Java 开发者理解和修改,降低了开发和维护的门槛,加快了新功能的开发和迭代速度。
-
增强可维护性 :统一的代码库语言有助于减少代码的复杂度,提高代码的可读性和可维护性,延长 JVM 的生命周期。
-
促进创新 :Java-on-Java 的实现将为 JVM 的架构创新提供更大的灵活性,使其能够更快地适应新的硬件架构和编程范式的变化。
SubstrateVM 的应用场景与实践
适合的应用场景
SubstrateVM 特别适合以下类型的应用:
-
微服务和云原生应用 :快速的启动时间和低内存开销使得 SubstrateVM 成为微服务架构的理想选择。在云环境中,应用程序需要能够快速响应请求并及时释放资源,SubstrateVM 的特性能够帮助降低运营成本。
-
嵌入式系统和物联网设备 :在资源受限的嵌入式环境和物联网设备中,SubstrateVM 的轻量级特性和高效的资源利用使其能够运行在低功耗、低内存的硬件平台上。
-
命令行工具和桌面应用 :对于需要快速启动的命令行工具和桌面应用,SubstrateVM 可以提供接近原生应用的启动性能,同时保留 Java 的跨平台优势。
实践案例与经验分享
Oracle 数据库中的应用 :Oracle Labs 的团队已经将 Truffle 语言实现嵌入到 Oracle 数据库中,利用 SubstrateVM 的 AOT 编译技术,使得在数据库中运行的存储过程能够以多种编程语言编写,并且具有高效的执行性能和低资源开销。这种创新的应用方式展示了 SubstrateVM 在企业级应用中的巨大潜力。
开发与调试挑战 :由于 SubstrateVM 编译后的程序与传统的 JVM 运行时环境有所不同,开发和调试过程需要适应新的工具和方法。例如,传统的 Java 调试工具可能无法直接用于 SubstrateVM 编译的程序,开发人员可能需要借助 GDB 等低级调试工具,或者利用 Truffle 语言层面的调试支持(如 Chrome DevTools Protocol 集成)。
总结
SubstrateVM 作为 GraalVM 中的 AOT 编译框架,通过其独特的设计理念和架构实现了 Java 应用程序启动性能和内存开销的显著优化。它不仅在技术上突破了传统 JVM 的局限,还为 Java 语言的未来发展开辟了新的道路。Metropolis 项目进一步推动了 Java-on-Java 的探索,有望为 JVM 的开发和应用带来深远的影响。
SubstrateVM 和 Metropolis 项目代表了 Java 虚拟机技术发展的前沿方向。它们不仅为解决传统 JVM 的性能瓶颈提供了创新的解决方案,还为 Java 语言在新兴领域的应用提供了强大的支持。
相关文章:
JVM——SubstrateVM:AOT编译框架
引入 在现代软件开发领域,应用程序的启动性能和内存开销一直是影响用户体验的关键因素。对于 Java 应用程序而言,传统的即时编译(JIT)模式虽然能够在运行时对热点代码进行优化,提高程序的执行效率,但却无法…...
【HarmonyOS 5】鸿蒙Taro跨端框架
Taro跨端框架 支持React语法开发鸿蒙应用,架构分为三层: ArkVM层运行业务代码和React核心TaroElement树处理节点创建和属性绑定TaroRenderNode虚拟节点树与上屏节点一一对应 import { Component } from tarojs/taro export default class MyCompon…...

数据库原理 试卷
以下是某高校教学管理系统的毕业论文指导ER图,数据信息:一名教师指导多名学生,一名学生只能选择一名教师,试分析完成以下各题,如用SQL命令完成的,在SQL Server2008验证后把答案写在题目的下方。 图1 毕业论…...

【Qt开发】对话框
目录 1,对话框的介绍 2,Qt内置对话框 2-1,消息对话框QMessageBox 2-2,颜色对话框QColorDialog 2-3,文件对话框QFileDialog 2-4,字体对话框QFontDialog 2-5,输入对话框QInputDialog 1&…...
Ubuntu上进行VS Code的配置
1. 安装VS code sudo snap install code --classic 2. 安装GCC sudo apt install build-essential 3. 安装VS Code中文包 打开 VS Code 点击左侧活动栏中的扩展图标(或按Ctrl+Shift+X) 在搜索框中输入:Chinese (Simplified) 选择由 Microsoft 提供的 中文(简体)语言包…...
阴盘奇门 api数据接口
阴盘奇门,又称"道家阴盘遁甲"或"法术奇门",与阳盘奇门(奇门排盘)并称"奇门双雄"。由王凤麟教授整合道家三式(奇门、六壬、太乙)精髓创立,独创行为风水与立体全息预测技术,广…...

2025年渗透测试面试题总结-匿名[校招]攻防研究员(应用安全)(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 匿名[校招]攻防研究员(应用安全) 基础部分 1. HTTP状态码 2. HTTP请求方法及作用 3. 网络分层及协议 OW…...

碰一碰发视频系统--基于H5场景开发
#碰一碰发视频# 旨在构建一个基于移动网页(H5)的视频“碰传”交互系统,提供类似华为/苹果设备 NFC 轻碰分享的便捷体验。其核心技术依赖于移动端可用的近场通信(NFC 或 H5 相关 API)和可靠的媒体数据传输方案。实现细节…...

MagicAnimate 论文解读:引入时间一致性的视频人物动画生成方法
1. 前言/动机 问题:现有动画生成方法缺乏对时间信息的建模,常常出现时间一致性差的问题 描述: 现有的动画生成方法通常采用帧变形(frame-warping)技术,将参考图像变形以匹配目标动作。尽管这类方法能生成较…...
QT使用说明
QT环境准备 推荐Ubuntu平台上使用,配置简单,坑少。 Ubuntu 20.04 安装 sudo apt-get install qt5-default -y sudo apt-get install qtcreator -y sudo apt-get install -y libclang-common-8-dev启动 qtcreatorHelloWorld 打开 Qt Creator。选择 …...

数据结构:递归(Recursion)
目录 示例1:先打印,再递归 示例2:先递归,再打印 递归的两个阶段 递归是如何使用栈内存 复杂度分析 递归中的静态变量 内存结构图解 递归:函数调用自己 必须有判断条件来使递归继续或停止 我们现在通过这两个示…...

Cesium快速入门到精通系列教程一:打造第一个Cesium应用
一、打造第一个Cesium应用 1、官方渠道下载Cesium(可选择历史版本) GitHub Releases页面:https://github.com/CesiumGS/cesium/releases 访问 Cesium GitHub Releases,此处列出了所有正式发布的版本。 通过标签&#…...

力扣题解106:从中序与后序遍历序列构造二叉树
一、题目内容 题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说,我们需要利用中序遍历序列和后序遍历序列的特点,通过递归的方法逐步构建出完整的二叉树。 中序遍历序列的特点是:左子树 -> 根节点 -> 右子树。后…...
Vue传参Props还是Pinia
Pinia 适用场景 全局状态管理 多个不相关组件需要共享数据需要跨页面/路由共享状态 复杂状态逻辑 包含多个相互关联的状态有复杂的状态修改逻辑 持久化需求 需要将状态保存到localStorage/sessionStorage页面刷新后需要恢复状态(恢复最后一次修改的状态࿰…...

学习STC51单片机25(芯片为STC89C52RCRC)
每日一言 生活就像弹簧,你弱它就强,你强它就弱,别轻易认输。 ESP8266作为路由器模式(AP模式)也就是在局域网内可以有服务器的作用 那么我们需要将pc作为设备进行连接ESP的发射出来的WIFE 叫做这个AI啥的 也有可能叫做…...

宁夏农业科技:创新引领,赋能现代农业新篇章
在广袤的宁夏大地上,农业科技如同一股强劲的春风,吹拂着每一寸土地,为宁夏的农业发展注入了新的活力与希望。近年来,宁夏农业科技以其独特的创新力和实践力,不断推动着现代农业的转型升级,让这片古老的土地…...

Accelerate 2025北亚巡展正式启航!AI智御全球·引领安全新时代
近日,网络安全行业年度盛会Accelerate 2025北亚巡展正式在深圳启航!智库专家、产业领袖及Fortinet高管、产品技术团队和300余位行业客户齐聚一堂,围绕“AI智御全球引领安全新时代”主题,共同探讨AI时代网络安全新范式。大会聚焦三…...

005学生心理咨询评估系统技术解析:搭建科学心理评估平台
学生心理咨询评估系统技术解析:搭建科学心理评估平台 在心理健康教育日益受重视的当下,学生心理咨询评估系统成为了解学生心理状态的重要工具。该系统涵盖试卷管理、试题管理等核心模块,面向管理员和用户两类角色,通过前台展示与…...
azure devops 系列 - 常用的task
任务在管道中执行操作。例如,任务可以构建应用、与 Azure 资源交互、安装工具或运行测试。任务是定义管道中自动化的构建基块。 运行作业时,所有任务都会按顺序依次运行。要在多个代理上并行运行同一组任务,或者在不使用代理的情况下运行某些任务,使用job。 Build Task …...

贪心算法应用:多重背包启发式问题详解
贪心算法应用:多重背包启发式问题详解 多重背包问题是经典的组合优化问题,也是贪心算法的重要应用场景。本文将全面深入地探讨Java中如何利用贪心算法解决多重背包问题。 多重背包问题定义 **多重背包问题(Multiple Knapsack Problem)**是背包问题的变…...

【保姆级教程】PDF批量转图文笔记
如果你有一个PDF文档,然后你想把它发成图文笔记emmm,最好再加个水印,你会怎么做? 其实也不麻烦,打开PDF文档,挨个截图,然后打开PS一张一张图片拖进去,再把水印图片拖进去࿰…...
Pytest Fixture 是什么?
Fixture 是什么? Fixture 是 Pytest 测试框架的核心功能之一,用于为测试函数提供所需的依赖资源或环境。它的核心目标是: ✅ 提供测试数据(如模拟对象、数据库记录) ✅ 初始化系统状态(如配置、临时文件&a…...
Spring Boot 基础知识全面解析:快速构建企业级应用的核心指南
一、Spring Boot 概述:重新定义 Java 开发 1.1 什么是 Spring Boot? Spring Boot 是基于 Spring 框架的快速开发框架,旨在简化 Spring 应用的初始搭建及开发过程。它通过 「约定优于配置」(Convention Over Configuration&#…...

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握)
数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握) 前言一、什么是集合查询?二、集合操作的三种类型1. 并操作2. 交操作3. 差操作 三、使用集合查询的前提条件四、常见问题与注意事项五、…...
[mcu]系统频率
系统主频的选择直接影响性能、功耗和成本,不同厂商的芯片会根据应用场景设计不同的运行频率。 低频段80MHZ~160MHz 典型频率: 80MHz、120MHz、160MHz 特点: 低功耗,适合电池供电设备 处理能力有限,通常仅支持 单天线…...

clickhouse如何查看操作记录,从日志来查看写入是否成功
背景 插入表数据后,因为原本表中就有数据,一时间没想到怎么查看插入是否成功,因为对数据源没有很多的了解,这时候就想怎么查看下插入是否成功呢,于是就有了以下方法 具体方法 根据操作类型查找,比如inse…...

5G-A:开启通信与行业变革的新时代
最近,不少细心的用户发现手机信号标识悄然发生了变化,从熟悉的 “5G” 变成了 “5G-A”。这一小小的改变,却蕴含着通信技术领域的重大升级,预示着一个全新的通信时代正在向我们走来。今天,就让我们深入了解一下 5G-A&a…...
鸿蒙OS在UniApp中集成Three.js:打造跨平台3D可视化应用#三方框架 #Uniapp
在UniApp中集成Three.js:打造跨平台3D可视化应用 引言 在最近的一个项目中,我们需要在UniApp应用中展示3D模型,并实现实时交互功能。经过技术选型和实践,我们选择了Three.js作为3D渲染引擎。本文将分享我们在UniApp中集成Three.…...
Vue 3 组件化设计实践:构建可扩展、高内聚的前端体系
Vue 3 自发布以来,其引入的 Composition API 与改进的组件模型,为前端架构提供了更强的可组合性、复用性与模块化能力。本文将系统性探讨 Vue 3 如何通过组件化设计,实现复杂应用的解耦、扩展与维护,并结合实际工程经验提供最佳实…...
腾讯云 Python3.12.8 通过yum安装 并设置为默认版本
在腾讯云服务器上,直接通过 yum 安装 Python 3.12.8 可能不可行,因为标准仓库通常不包含最新的 Python 版本。不过,我们可以通过添加第三方仓库或手动安装 RPM 包的方式实现。以下是完整解决方案: 方法 1: 通过第三方仓库安装&am…...