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 在解决内存占用问题上是不积极的。

17224 次点击
所在节点    程序员
137 条回复
keepRun
2024-01-04 19:34:58 +08:00
@bjfane 可以看下这个项目,利用 spring 提供的 proxy 、reflect 钩子注册需要使用到代理、反射的地方,最终运行一个 native 程序
keepRun
2024-01-04 19:35:13 +08:00
ufan0
2024-01-04 19:59:55 +08:00
遇到了一样的场景(使用 native 重构应用),虽然个人对这个结果是早有预见,但还是比较失落。
正在分别使用 quarkus 和 rust 重构,看看是否能带来内存和性能上的极大提升。
chaofanx
2024-01-04 20:02:39 +08:00
quarkus 号称云原生 java
keepRun
2024-01-04 20:12:03 +08:00
@ufan0 quarkus 可能会更好点,spring 内存占用可能还是优化不了
kenvix
2024-01-04 20:31:17 +08:00
你先把你的 spring 扔了用轻量框架再说; spring 自己就是个内存大户
buffzty
2024-01-04 20:39:47 +08:00
java 内存不是叫大 是非常大。一套 k8s 主节点所有服务才 1 个 G ,java 随便写点东西 2G 起步,不给多点 死给你看。
有得必有失,根据应用场景选,java 作为企业级大杀器 大厂有钱使劲造 稳定就行
itning
2024-01-04 20:43:03 +08:00
内存很值钱吗?
VYSE
2024-01-04 21:32:57 +08:00
JEB 加载个微信 APK, 得上 128G 内存
iseki
2024-01-04 21:43:08 +08:00
Graal 也没有魔法啊,能优化优化速度完全是仗着把初始化好的 heap 存起来了。春天包含这老多东西,那内存不可能小啊
Nazz
2024-01-04 21:49:02 +08:00
@bthulu 你猜为什么很多公司不愿意用 ELK
keepRun
2024-01-04 22:11:35 +08:00
@Nazz 我就是因为嫌 elk 占用内存太大用了 loki+grafana+promtail 来做日志分析
cabing
2024-01-04 22:58:34 +08:00
小项目使用 go 也很方便。
GeekGao
2024-01-04 23:08:25 +08:00
早在 JDK 1.5 的时候我就觉得这内存吃不起啊,所以就玩起了 Python ,以及这两年的 Golang
90xchun
2024-01-04 23:10:12 +08:00
内存使用和 graalvm 用不用关系不大,你自己 dump 下内存堆就可以了,spring 里面 jar 包太多了,native 后会直接被 graalvm 直接加载到内存里面,且一直不得释放,内存占用肯定下不来,小的 web 项目真没必要上 spring boot 全家桶,可以试试 https://github.com/94fzb/simplewebserver 这个库,内存 16m ,就启动的了,自己程序优化的好 32m ,就能流畅运行了
Nazz
2024-01-04 23:38:59 +08:00
@keepRun 我打算试试 OpenObserve ,Rust 写的,采集程序可以用 iLogTail ,连 Kafka 都省了
wangtian2020
2024-01-05 00:03:07 +08:00
速度从来都不是问题, 速度只会越来越快.
saberscarlet
2024-01-05 00:33:21 +08:00
最近刚好把一个 springboot 的 iot 项目( 10 多个服务) 改造成 native ,累个半死,32c256g 机器 gradle 不开多线程要编 50 多分钟,开了也要 18 分钟
someonedeng
2024-01-05 00:59:01 +08:00
这个锅应该 spring 来接,或者其实不该接。

内存敏感就不该选 spring 呢? vertx 、直接 netty 都能搞,或者写写 go :doge
chengxiao
2024-01-05 07:51:32 +08:00
有个问题啊, 没写过 java,无意间刷抖音刷到个视频
说写 spring 用 mybatis orm 想输出 执行的 sql 语句,需要装一个 IDE 插件.....这东西配不出来么???还需要借助 IDE 才能实现??

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

https://tanronggui.xyz/t/1005841

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

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

© 2021 V2EX