graalvm 拯救了 Java 的启动速度,但没法拯救 Java 的内存占用

2024-01-04 15:34:20 +08:00
 keepRun

前几年,我一直期待 graalvm 把 java 编译成 native image 可以大幅减少 java 的内存占用,直到今天我用 graalvm 把我一个简单的 spring + spring mvc + mybatis plus + mysql 的小项目编译成 native 后(使用 g1gc ,配置最大堆内存 64m ),一测内存占用,好家伙,占用 184m ,优化了个寂寞,直接正常用 jvm 占用也就 200m 。启动速度确实快,285ms 即可完全启动。

我彻底死心了,java 对于请求量小的小型 web 项目内存消耗太大了,以后还是转投 nodejs 、golang 搞这种小项目吧,java 内存消耗太大了。

个人感觉云原生与微服务时代,java 官方对于资源占用问题解决速度还是太慢了,我阅读了 openjdk 社区的几乎所有的 jep ,发现起码未来 5 年,java 在解决内存占用问题上是不积极的。

17236 次点击
所在节点    程序员
137 条回复
layxy
2024-01-05 08:44:04 +08:00
spring 全家桶本来就不省内存,想省内存用 quarkus+graalvm
afeiche
2024-01-05 08:47:57 +08:00
应该是 spring 的锅,这东西一开始的定位就是替换 j2ee ,内存敏感可以直接上 vert.x,或者用 quarkus
keymao
2024-01-05 09:00:00 +08:00
@ChaYedan666 大项目也没必要追求启动速度啊... 搞不太懂 这玩意儿又不是 app
kd9yYw2RyhQwAwzn
2024-01-05 09:00:34 +08:00
提升启动速度的话 要不要试下 https://wiki.openjdk.org/display/crac 编译比 native build 要快一点
zvvvvv
2024-01-05 09:24:09 +08:00
@chengxiao 日志里会输出 sql 语句,但不是完整的,sql 中的变量会用❓作为占位符。
qinxi
2024-01-05 09:29:26 +08:00
@chengxiao #100 技术方面的百度都比抖音靠谱了.
JYii
2024-01-05 09:37:01 +08:00
@chengxiao #100 少刷点抖音吧那还是
banmuyutian
2024-01-05 09:47:34 +08:00
@chengxiao
少刷抖音吧 2333
diagnostics
2024-01-05 09:50:29 +08:00
@chengxiao #100 抖音骗傻子,你难道也是傻子吗?你都按常识知道可以配置输出 SQL 了,难道想的不是发抖音的人是骗傻子吗?
Masoud2023
2024-01-05 09:51:27 +08:00
又没人限制你必须用 Jvm ,为什么还要自己虐待自己?
diagnostics
2024-01-05 09:52:47 +08:00
你都看 JEP 了,认真花点时间看看 graal 解决了什么很难吗?伸手就要啊。
Masoud2023
2024-01-05 09:56:13 +08:00
@chengxiao #100 这个调下 mybatis 的 mapper 日志等级就 ok ,没那么麻烦
xiaocaiji111
2024-01-05 10:10:02 +08:00
99%的场景下启动速度没那么重要, 比如别的语言启动 10s ,java 启动 1 分钟,依然可以接受。发布的时候又不是一台台替换的,而且替换后也不能立刻给用户用,要线上验证没问题,然后再去批量滚动替换剩余的。所以很多人说启动快,用户影响小,感知小,难道就是立马替换掉给用户用吗?

另外个人小项目,能预感到复杂度的,不建议使用 Spring ,java 也有其他轻量级框架可以用的。Java 初始内存占用多,甚至少了启动不起来,但是我们线上也用有 Go ,初始内存占用少,量上来也一样占用很多。另外大内存应用用 go 明显不如 java 的 gc 平滑。
dragondove
2024-01-05 10:20:49 +08:00
我搜索了一下 Vert.x 的文章,问题应该不在 java 上,而是 spring 本身功能太多,可以看下这篇 https://www.jetdrone.xyz/2018/08/10/Vertx-native-image-10mb.html 作者最终只用了 10M 内存就跑起来了一个连接数据库的应用
wuxqing
2024-01-05 10:20:58 +08:00
可以试试 https://helidon.io/ ,Oracle 开源,基于 jdk21 ,Helidon & GraalVM Native 内存占用可以小到 29M
fovecifer
2024-01-05 10:38:17 +08:00
目前阻止我完全转向 golang 的阻力主要来自于 java 生态中几个比较优秀的基础库,例如 Apache Lucene/caffeine
zorui
2024-01-05 10:45:52 +08:00
编译时间太长了也是硬伤。。
bitmin
2024-01-05 11:06:59 +08:00
编译速度、启动速度不影响线上应用,但是影响我开发体验
clorischan
2024-01-05 11:34:55 +08:00
@clorischan #32
这里弄错了. asp.net core aot 编译不含第三方库的仅包含几个简单 API 的文件大概是~10M 左右, 运行内存十几 M,
linyimin520812
2024-01-05 11:37:25 +08:00
之前搞过一个 spring demo ,配置了 2 个 Bean —— TestComponent1 和 TestComponent2 ,初始化方法(@Postconstruct)中休眠 5 秒,然后 TestComponent2 依赖 TestComponent1 ,模拟 Bean 的初始化慢问题。使用 graalvm 启动,启动速度并没有优化多少,还是得至少需要 10 秒

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

https://tanronggui.xyz/t/1005841

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

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

© 2021 V2EX