quarkus-graalvm 可以救 Java native 一命

2024-07-16 14:12:26 +08:00
 karottc

前文是这个项目:果然吃内存,一个简单的 Java 程序就占用了 250M 内存

用 quarkus + graalvm 重新了这个项目(顺便学习了下 quarkus, 获益匪浅),功能逻辑全部保持了一致,只是组件根据框架进行了平移(比如 okhttp -> rest-client ).

程序的功能为:

这就是这个程序的所有功能,这版用到的组件和框架为 quarkus + gson + mybaits + jdbc + quarkus-rest-clint(发送网络请求) + jboss(quarkus 的默认日志)

编译环境:linux-x86-64, graalvm-21.(社区版),编译之后的二进制大小是 100M 。编译耗时大概十几分钟。 openjdk version "21.0.2" 2024-01-16 OpenJDK Runtime Environment GraalVM CE 21.0.2+13.1 (build 21.0.2+13-jvmci-23.1-b30) OpenJDK 64-Bit Server VM GraalVM CE 21.0.2+13.1 (build 21.0.2+13-jvmci-23.1-b30, mixed mode, sharing)

启动之后,占用 90M 内存,然后我调用了好几次 rest 请求,内存涨到了 120M ,过了一天程序稳定运行之后内存占用在 40-50M 左右。

虽然和我预期的 20M 内存有差距,但是已经比较满意了。虽然量起来了,内存占用一样会升高,但是没量了会把内存还给操作系统。quarkus 的启动速度确实快,毫秒级。

这次项目的意义,在于让我学会了 quarkus,(除了上面的项目,我还用 quarkus-picocli 写了个命令行工具,也很不错) 不愧是自古评论出人才。


此外,我用 python 实现了上面项目的核心部分,稳定之后内存占用 20M 。


最后,吹一下 quarkus, 在 native 这块很强,和 graalvm 的集成度非常高,比如反射问题单纯用 graalvm 需要繁琐的配置文件,在 quarkus 里面用一个注解就行了,方便很多。

缺点就是编译略慢,而且需要高配机器,配置越高,编译越快。


单纯的 graalvm 还是非常不行, 2024 年,graalvm native image 仍较为勉强 这个帖子也说了,但是和 quarkus 搭配一下就很不错了。

6581 次点击
所在节点    Java
25 条回复
karottc
2024-07-17 16:12:35 +08:00
@janus77 python 不需要编译, 直接瞬间启动
INCerry
2024-07-17 16:58:28 +08:00
@artiga033

我举 AOT 的例子也只是贴近更小的体积和内存占用,实际上直接跑个 ASP.NET Core ( DATAs GC 模式)不走 AOT 内存也只是会多个 10M 左右的水平,只是发布会多个 runtime 的体积。

从题主的需求来说,桌面端不用考虑,go 的桌面端几乎等于没有,而且基本没有动态代码功能。ASP.NET Core + Native AOT 写写题主要求的已经足够,而且编程效率比 Go 高多了,另外.NET AOT 有 Static PGO 功能,一样可以对热点代码高度优化。
byte10
2024-07-22 10:16:51 +08:00
@sagaxu vertx 使用 GraalVM 编译麻烦吗?
CodeCodeStudy
2024-07-25 16:23:57 +08:00
编译十几分钟也太长了吧
layxy
292 天前
用 java 就是图的他的动态能力,单纯想要低内存降低包大小,还是 go 比较好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1057699

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX