Java 运行包精简探索(GraalVM)

【折腾GraalVM二】GraalVM下Web后端框架与数据库DAO层框架的技术选型(2023-09) GraalVM下Web框架与数据库DAO层框架的技术选型 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:jianshu.com/p/f78a016b30fe

f809321c4ea0f743d0846f4069fbc863.jpeg


前言

在热心群友的提示下,入了 GraalVM 的坑。本来以为花个三两天应该就能搞定,没想到这一搞就是一个周,终于取得了阶段性的胜利。

编注:此文为运行包精简主题的一篇,其他精简方法请参见文末。

背景如下:

> 最近由于某些原因,需要做一个自带运行环境的程序。由于各种原因,选定了 Java 和 Python 作为备选语言。但是 Java 由于 JRE 的臃肿(100M+)以及 Spring Boot 的日渐臃肿(helloworld 15M),需要在这两方面进行 size 的缩减。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

环境

  • 系统 :Ubuntu 16.04

  • GraalVM :GraalVM Community 21.3.0 (Based on OpenJDK 11.0.13)

https://www.graalvm.org/downloads/

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

环境准备

参考:https://www.graalvm.org/docs/getting-started/

  • 关键配置

  • 环境变量设置

export JAVA_HOME=/path/to/<graalvm>
export PATH=/path/to/<graalvm>/bin:$PATH

安装 native-image

gu install native-image

安装 native-image 需要的组件

apt-get install build-essential libz-dev zlib1g-dev

注意 :这里有个其他文章都没有提到的坑。ld 需要更新到 2.26+,不然在构建过程中会报告莫名其妙的异常(这里我耗了大半天)。

apt-get install binutils-2.26

另一个坑

最开始我是在一台 aliyun 的机器上实验的,没有注意到内存问题,在实验过程中遇到异常中断。排查 syslog 发现是 OOMKiller。排查发现我的可用内存只有 4G。

后改为在本机机器 VMware 里的 Ubuntu 操作,内存分配到 8G。经观察,native-image 打包过程中会用到 5.2G 左右的内存,所以这里要注意一下。

至此,环境准备完成。

打包

helloworld 的尝试就跳过了,网上一搜一堆。先了解一下打包命令。

214b1ba77f524d5aa6f838c5df02ca6f.png

https://www.graalvm.org/uploads/quick-references/native-image-quick-reference-v2_A4.pdf

项目依赖

7ab57f69e4d289f91e986ad324c38583.png

主要用到了 solon、solon-api、h2、weed3、logback、slf4j、jlhttp 等包。

首先,通过 Maven 把我的项目 solondemo 打包为可以运行的 jar,确保通过。

java -jar solondemo.jar

可以正常运行并访问。然后把 solondemo.jar 上传到前面准备好的 GraalVM 环境。

首先,需要使用 GraalVM 提供的配置工具,对想要打包的程序的一些静态分析无法分析到的信息进行采集。

如果你确认项目没有使用任何反射、代理等特性,可以省略这一步。执行

java -agentlib:native-image-agent=config-output-dir=./config/ -jar solondemo.jar

执行后,最好能跑一跑 testcase,尽量保证代码覆盖率 100%,避免打包后遇到 classnotfound。

执行完成后,终止执行。

如果需要多次运行采集信息 可以使用如下命令再次执行,工具会自动合并采集结果而不是覆盖。

java -agentlib:native-image-agent=config-merge-dir=./config/ -jar solondemo.jar

执行结束,config 下生成如下 5 个文件:

jni-config.json
predefined-classes-config.json
proxy-config.json
reflect-config.json
resource-config.json
serialization-config.json

坑又来了

根据网上的 说法,可以通过指定 -H:ConfigurationFileDirectories=./config 的方式来使用前面生成的配置文件。

但是,最后老是会把 -H:ConfigurationFileDirectories= 认为是指定的生成文件名,然而根据文档,-H:Name=xxx 才是指定输出文件名的参数。

注意 :这个问题是开始在 CentOS 上操作遇到的,最后我在 Ubuntu 上又尝试用这种方式指定配置文件的时候,它生效了,原因未知。

我采用了另外一种配置方式。把这些文件打包到 jar 包的 META-INF/native-image 目录下。

2fb536bb0a1fcdaf99eaf10180ced6ce.png

打包命令:

native-image  -jar solondemo.jar --allow-incomplete-classpath -H:+ReportExceptionStackTraces --enable-http

这个命令也是经过反复多次尝试最终得出的可用命令,尝试的过程就略去3W字了。

注意 :如果你的应用需要对外提供 HTTP 服务,必须加上配置 --enable-http。如果提供 HTTPS 服务,则必须加 --enable-https。否则哪怕运行起来了访问也永远是 500。打包成功,目录下生成 solondem 文件。

执行运行:运行成功了,但是插件没加载。翻阅 solon 源码,发现插件加载的流程大致如下:

3548832042948293cc7da2a87519d619.png

通过反复添加日志排查,发现:

在 graalvm native-image 下运行,这里扫描到 META-INF/solon 这个目录的 type,不是 file/jar,而是 resource。

e56eadfe09f0646b94f6fd90cc472ddf.jpeg

所以到了这里自然就无法遍历目录下的文件了。于是我尝试让 resource 类型也走 file 的方式去扫描。

6892f2763013a28425904d8337b1b01e.png

调研搜索后发现,GraalVM 内部资源管理自己实现了一套 FileSystem,URL 描述符定义为 resource,有一套自定义的 API(由于时间有限,暂未深入研究)。

对本来是目录类型的 resource 使用 File 方式去处理,得到的结果是 file not exists!但是对于确定的文件,是可以正常读取的。

于是我考虑预处理,在 GraalVM 外面就先把能扫描到的文件清单提取出来,通过配置的方式,插件扫描的时候直接返回预置的文件清单。

因为本地执行是可以正常扫描的,所以我在扫描结束的时候,增加一个输出:

ece4e6806aa83ffc98f0c3e6be80879b.png

然后在配置中添加:

2abe62c7e65d9541c2ebe17abe62ecda.jpeg

scan 流程做如下修改

d0b13a63ce9f88a08f1148fd5c83cb3a.png

插件扫描成功并运行。

44678d9a0784271ea4c3ca99f41049f8.png

扫描注解也有同样的问题,排查过程与配置文件扫描类似,解决方案已与配置文件扫描的解决方案合并,略去 3万字。

至此,主框架已经可以 run 起来了,但是嵌入式数据库 h2 还在作妖。

调研发现 Github 已经有人提过这个问题:

https://github.com/h2database/h2database/issues/2207

但是我尝试按照他们说的 使用 1.4.199 版本,却仍然各种异常。没办法,下载 h2 源码 加 log 排查吧。

39d4ff506e578ad4185fceb230493a01.png

首先,这里报空指针,那么唯一的可能就是 defaultProvider 为空。分析 defaultProvider 初始化过程:

a1670c7f513d8a9462ca5991062c0cdc.png

发现了 Class.forName,以及吃掉了异常:

e.printStackTrace();

打包,再来运行:

Caused by: java.lang.ClassNotFoundException
......
org.h2.store.fs.disk.FilePathDisk

好嘛。native-image 的 agent 居然没有把这个扫出来。手动把这些添加到 reflect-config.json 里面,再打包运行。又报了个别的 class not found。再添加,再打包。

[
........,
{
    "name": "org.h2.store.fs.FilePathDisk",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathMem",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  }  ,
  {
    "name": "org.h2.store.fs.FilePathMemLZF",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathNioMem",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathNioMemLZF",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathNioMapped",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathAsync",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathZip",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathRetryOnInterrupt",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathNio",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.store.fs.FilePathSplit",
    "methods":[{"name":"<init>","parameterTypes":[] }]
  },
  {
    "name": "org.h2.mvstore.db.MVTableEngine",
    "methods":[{"name":"<init>","parameterTypes":[] }],
    "allDeclaredFields":true
  }
]

成了!

05e02da3ed1f3ad55f1ce988c8df0b84.png

访问接口、增删改查、静态页面 、日志都 OK 了。

dd335b6c6e7b21f05fbee2fd2a07c023.png 8402e49b4d3f78b2da3eeb9c85a2e9ef.png 978b401518cb8fadb85634892d1afb11.png

幸福来得如此突然。

总结

最终可用的打包命令

native-image  -jar solondemo.jar --allow-incomplete-classpath -H:+ReportExceptionStackTraces --enable-http

ld 需要升级到 2.26+

root@ubuntu:/home/hx/graalvm/demo3# ld -version

GNU ld (GNU Binutils for Ubuntu) 2.26.1

Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

其他注意事项

  • -agentlib:native-image-agent 不一定能检查出所有的反射;

  • GraalVM 有自己的文件系统实现,暂未找到遍历目录的方法;

  • 第三方包不能运行时,大概率是由于反射没有检查到导致的 class not found;

  • 排查第三方包问题时,一定要注意被吃掉的 Exception;

  • native-image 打包时需要 5G+ 内存。

补充

1. native-image后序列化失败问题(比如 JSON.toJSONString(JavaBean))

fastjson1.2.68 版本下在程序启动时增加如下代码:

ParserConfig.getGlobalInstance().setAsmEnable(false);
SerializeConfig.getGlobalInstance().setAsmEnable(false);

2. 反射方法报错

需将反射类手动配置到 reflect-config.json 文件中,也可在编译打包成 jar 时添加配置

-agentlib:native-image-agent=config-output-dir=../META-INF/native-image

后打包,然后 java -jar 或 java -cp 运行起来后,执行对应测试用例后,会自动将反射类信息生成到。

reflect-config.json 文件中(但真的不一定)。配置文件样例:

[
    {
        "name":"com.test.A",
        "allDeclaredFields":true,
        "allPublicFields":true,
        "queryAllPublicMethods":true,
        "methods":[
            {"name":"getA","parameterTypes":[] }, 
            {"name":"getD","parameterTypes":[] }, 
            {"name":"getF","parameterTypes":[] }, 
            {"name":"getI","parameterTypes":[] }, 
            {"name":"getQ","parameterTypes":[] }, 
            {"name":"getR","parameterTypes":[] }, 
            {"name":"getT","parameterTypes":[] }, 
            {"name":"getY","parameterTypes":[] }, 
            {"name":"getU","parameterTypes":[] }, 
            {"name":"getV","parameterTypes":[] }
        ]
    }
]

3. GraalVM 有自己的文件系统实现

暂未找到遍历目录的方法(即上文说说的).

如果你的程序中有涉及 ClassLoad.getResource("com.org") 这样的代码并打算对齐返回的结果以 File 或 jar 文件的方式扫描 com.org 下的所有类文件时会报错。

解决方式如上文所说,手动配置需要扫描的类文件,然后读取该配置(替代 getResource 方式)。

4. 控制 native 化后的二进制程序内存大小(配置参数不多说,一看就明白)

样例:

./solondemo -Xmx16m -Xms16m -XX:MaxDirectMemorySize=8m

上文提到的 solon scan 方法 支持预配置代码已提交到:

https://gitee.com/noear/solon

文中提到的 solondemo 项目,已经提交到:

https://gitee.com/mantouchong/solondemo

其他探索

  • java运行包精简探索(一):https://www.jianshu.com/p/f1da836fb4d6

  • java运行包精简探索(二):https://www.jianshu.com/p/5e3b1913cf3b



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

d059a6a1d6a0b459c0e3514a0f7f8aab.png

已在知识星球更新源码解析如下:

94a642cb0443faacdbf8fa1d67ab2f29.jpeg

da424b86276b20bb454c39a573ecb777.jpeg

cbb13f5a408bb799b8496f5fb33d8643.jpeg

8c1536969c6d2a4d59afe584e015ebab.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
JVM 的“救世主”来了?---GraalVM 集成入门 本文简单地介绍了 GraalVM 的使用,但 GraalVM 的 Native Image 目前并不完善,比如对 Spring 的支持还很有限,Spring 有对应的)工程,该工程还没有 Release,问题很多。不过在今年晚些时候应该可以 Ready,届时我们再一起体现下 Spring Native 的魅力。 阅读详情

相关推荐

GraalVM入门以及环境搭建

GraalVM是开发人员编写和执行Java代码的工具。具体来说,GraalVM是由Oracle创建的Java虚拟机(JVM)和Java开发工具包(JDK)。它是一个高性能的运行时,可以提高应用程序的性能和效率。GraalVM的目标包括:编写一个更快、更易于维护的编译器,提高在JVM上运行的语言的性能,减少应用程序启动时间,将多语言支持集成到Java生态系统中,以及为此提供一组编程工具。GraalVM向JDK添加了一个优化编译器,它为各种语言提供性能优化,并为多语言应用程序提供互操作性。...

m0_50281408的博客 1万+

springboot3.2.4+Mybatis-plus在graalvm21环境下打包exe

springboot3.2.4+Mybatis-plus在graalvm21环境下打包exe

lgbisha的博客 2660

GraalVM入门到精通

GraalVM入门到精通 JavaFX转exe Java转exe GraalVM

qq_16093119的博客 6188

Spring3新特性:Graalvm打包Springboot+Mybatis;Graalvm打包成Docker

无法读取外部 DTD ‘mybatis-3-mapper.dtd’, 因为 accessExternalDTD 属性设置的限制导致不允许 ‘http’ 访问。如果你确定从 ‘http’ 地址下载 DTD 文件是安全的,可以配置解析器以允许对 ‘http’ 的访问。暂不支持mybatis-plus。用不了反射,所以需要这个文件去。用powerShell打开。说不支持http协议。

weixin_43914278的博客 4163

SpringBoot3 + GraalVm原生镜像 从环境安装到打包测试(超详细)

SpringBoot3 集成GraalVm 从环境安装到打包测试

yangchuang11的博客 9161

以GraalVM原生镜像的方式运行Spring Boot应用程序

这个话题我已经琢磨了很久了!在过去的一年里,随着我越来越多地将注意力转移到DevOps的话题上,我没有时间真正做点什么。但我从未真正离开过Spring的世界。随着2020年的开始,我准备回来看看这个领域是否有新的发展。而且还有!2019年Spring一号站台,安迪·克莱门特和Sébastien Deleuze就如何将Spring Boot应用程序作为GraalVM本机映像运行进行了一次精彩的演讲。两者还推动了关于GitHub上GraalVM支持的Spring实验项目,在那里您可以密切关注每一步的进展。

m0_56175058的博客 1119

graalvm以nacos为注册中心打包dubbo项目解析

上链接!!! https://github.com/yangzehan/dubbo-nacos-native.git pom文件 pom文件中有一个需要注意的点 <compilerArgs> <arg>-parameters</arg> </compilerArgs> 假如你希望用上tri带的rest发布接口的模式,这个参数需要加上 不然访问接口会报错Name for argument of type [java.lang.String

asddd44的博客 1251

Linux环境下GraalVM native-image将jar包编译为二进制

Linux 下安装 GraalVM 比 Windows 下简单,只要安装 GraalVM 然后安装 native-image,最后编译 jar 即可。 安装 GraalVM GraalVM ce Java8 Linux 下载地址 # 解压 tar -xzf graalvm-ce-java8-linux-amd64-19.3.6.tar.gz 添加环境变量 export JAVA_HOME=[GraalVM根目录的路径] export PATH=$PATH:$JAVA_HOME/bin # 让修改后的环境变

杰森写代码 7861

java运行包精简探索(graalvm)

java运行包精简探索(graalvm)

Turn X7 2436

GraalVM 安装及运行Python

文章目录关于 GraalVM安装GraalVM Python使用 ginstall 安装第三方包graalpython 交互模式下执行 python 代码 关于 GraalVM GraalVM : a high-performance JDK distribution It is designed to accelerate the execution of applications written in Java and other JVM languages while also providing

AI工程化、开源分享、文档翻译、代码笔记 3643

手把手教你用SpringBoot+Vue3+Docker从零搭建一个在线OJ系统(附完整源码)

本文详细介绍了如何使用SpringBoot、Vue3和Docker从零搭建一个在线OJ系统,涵盖前后端开发、判题机实现及Docker容器化部署。通过完整的源码和实战步骤,帮助开发者掌握OJ系统的核心架构与关键技术,适用于算法训练、编程竞赛等场景。

weixin_42648844的博客 297

Java GraalPy 开发相关org.graalvm.polyglot包说明手册

GraalVM Maven生态体系构建了一个高性能多语言运行时平台,通过统一基础设施、工具链和安全模型实现语言无缝互操作。核心组件包括:1)多语言引擎(JavaScript/Python/Ruby等),支持零序列化成本互操作;2)安全隔离机制(Isolates)保障多租户安全;3)开发者工具(DAP/LSP协议支持)提供统一调试分析能力;4)可观测性模块(Insight/Heap)实现运行时监控;5)TCK测试套件保证语言实现兼容性。该生态通过Maven聚合依赖和原型模板大幅降低多语言应用开发门槛。

肖哥弹架构博客 1554

基于深度强化学习的无地图移动机器人导航:让机器人在未知环境中智能前行

虽然仍然面临sim-to-real差距、安全性保证等挑战,但随着算法的不断改进和计算能力的提升,基于DRL的无地图导航技术将在服务机器人、工业自动化、太空探索等领域发挥越来越重要的作用,为人类生产和生活带来更大便利和价值。对于复杂环境下的动态目标导航问题,研究人员提出了多智能体协同控制算法(如Teamwork-Net算法),通过多个智能体分别控制机器人的运动速度与运动方向,协同实现更高效、更稳定的导航性能。深度强化学习结合了深度学习的感知能力和强化学习的决策能力,非常适合解决无地图导航问题。

weixin_45131592的博客 903

GraalVM学习系列一:GraalVM介绍及安装方法,有了这个教程,可避免很多坑,本人亲自操作+淌雷后的经验

什么是GraalVM呢? 这个东西好啊,这个东西是一个超级虚拟机,可虚可实,怎么说呢,它可以运行脚本代码,可以运行跨平台代码,最牛B的是,它TM还能把这些代码编译成机器码,你说上哪说理去,执行效率CUA的一下就上去了,速度可媲美C++,就是这么不讲武德。 它可以运行什么代码呢? 有:Java, Python, Ruby, JavaScript & Node.js, R, LLVM 这玩意儿都谁在用呢? 首先说的是以“福报”著称的阿里巴巴,用这玩意儿干啥呢?用他们自己开发的SOFA Boot

Jeffong的博客 1万+

pi/4QPSK调制解调原理

文章目录1. π/4\pi/4π/4QPSK 信号的调制原理2. 匹配滤波器与成形滤波器 1. π/4\pi/4π/4QPSK 信号的调制原理 减小相位突变量的QPSK由偏置键控QPSK(OK-QPSK)和 π/4\pi/4π/4偏置的QPSK( π/4\pi/4π/4QPSK)。由于 π/4\pi/4π/4QPSK是用差分相位编码产生的(因此也叫做 π/4\pi/4π/4DQPSK),能有效地进行差分解调和鉴频器解调,在一些不易提取相干载波的场合很有用。 在常规的QPSK中,输入数据经过串/并变换后,分成

gemengxia的博客 2万+

Java本地AI推理初体验:Jlama+LangChain4j构建离线问答系统

Jlama 是专为 Java 生态设计的现代化大型语言模型(LLM)推理引擎,旨在让开发者无需依赖外部服务即可直接在 Java 应用中运行本地化模型推理。本文将结合Jlama + langchain4j 实现一个本地可运行的简单问答Demo。

2501_92589102的博客 408

使用 GraalVM 将基本的 Java 项目打包成 EXE

使用 GraalVM 将基本的 Java 项目打包成 exeGraalVM 的环境搭建使用 GraalVM 将基本的 Java 项目打包成 exe使用 GraalVM 将 JAR 转化为 exe GraalVM 的环境搭建 GraalVM 有两种版本,Community 和 Enterprise。其中,前者对应于 OpenJDK,后者对应 Oracle JDK。需要根据自己的需要进行选择,本文以 GraalVM Enterprise 21.3.0 为例。 GraalVM 版本选择网址:https://w

暗诺星刻的博客 8857

基于51单片机的智能台灯设计:嵌入式程序设计实现

随着智能家居和物联网的快速发展,智能台灯作为一种典型的智能家居产品,已成为现代家庭中不可或缺的设备。传统的台灯只能提供简单的照明功能,而智能台灯不仅具备基础的照明功能,还能根据用户的需求进行自动调节,比如自动调节亮度、色温,甚至具备定时开关、远程控制等智能功能。本文将介绍如何基于51单片机设计一款智能台灯。我们将涉及硬件设计、嵌入式系统架构、传感器选择、调光控制、语音识别、远程控制等方面,详细阐述如何实现这些功能,并给出相关的代码和实现步骤。

2201_76125393的博客 837

使用 GraalVM 将纯 JavaFX 项目打包成 EXE

使用 GraalVM 将纯 JavaFX 项目打包成 exeGraalVM 的环境搭建使用 GraalVM 打包不含 FXML 的纯 JavaFX 项目使用 GraalVM 打包含 FXML 的纯 JavaFX 项目测评在 IntelliJ IDEA 中直接运行生成 JAR 包后运行GraalVM 打包后运行总结   GraalVM 可以使得 Java 应用可以脱离 JVM 来运行。换句话说,它可以使 Java 应用在没有 Java 环境中运行。不过目前,这项技术还有很多的问题。由于 GraalVM 使用的

暗诺星刻的博客 1万+

测绘程序设计——试题一:出租车轨迹数据计算

仅展示试题1的原文,如需了解其余内容,请自行购买图书李老师著作主页-http://ybli.users.sgg.whu.edu.cn/book/

chengzilhc的博客 892

SDR 和 DDR 的区别

SDR 和 DDR 的差别,最明显提现在传输速率和频率上。DDR SDRAM与SDRAM的基本结构是相似的,最根本的区别在于DDR 支持在一个时钟周期内传输两次数据,,SDR 只能传输一次数据。

串起点滴 1961

深入探索GraalVM与Java应用的提前编译(AOT)

GraalVM是一个高性能的多语言虚拟机,支持Java、JavaScript、Python、Ruby、R、C++等多种编程语言。它通过提供一个统一的运行时环境,使得不同语言的代码可以无缝交互。GraalVM的核心特性之一是其JIT编译器,它能够生成高度优化的机器码,从而提升应用的执行效率。提前编译(AOT)是指在应用运行之前,将其编译成机器码的过程。与传统的JIT编译相比,AOT编译可以显著减少应用的启动时间,并提供更稳定的性能。GraalVM通过其。

weixin_53840353的博客 1732

MAC-H3C官网inode客户端下载安装

MAC-H3C官网inode客户端下载安装

兴趣是最好的老师 1万+

在 GraalVM 静态编译下无侵入实现可观测探索

GraalVM静态编译Aliware背景介绍随着云原生浪潮的蓬勃发展,利用云原生技术为企业应用提供极致的弹性能力是企业数字化升级的核心诉求。但 Java 作为一种解释执行+运行时实时编译的语言,相比于其他静态编译型语言天生具有如下不足,严重影响了其快速启动与扩缩容效果。冷启动问题Java 程序启动运行详细过程如图 1 所示:图 1:Java 程序的启动过程分析[1]Java 应用在启动时首先需要...

阿里巴巴中间件 1078

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 告别丑陋判空,一个Optional类就能搞定!
下一篇: 项目终于用上了插入式注解,真香!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值