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

17093 次点击
所在节点    程序员
137 条回复
keepRun
2024-01-04 15:42:39 +08:00
再提下官方进展:
官方在推进 java 使用值类型,这可以提高 java 执行效率(变量分配到栈上而不是堆,降低 gc 压力,提高 cpu 执行效率),推测由于逃逸分析更方便,一定程度上会降低一点内存占用,这个预计下一个 lts 会上线。

project leyden:探索渐进式约束 java 的动态特性换取更好的执行效率、性能占用、启动速度等问题,这个进度太慢了,起码得等到下下个 lts 。

其它的看过也忘了,基本上语法上不会有大的改动,优化主要在 jvm\gc 上,没太多亮点。
bthulu
2024-01-04 15:45:44 +08:00
内存从来都不是问题, 内存只会越来越便宜.
keepRun
2024-01-04 15:49:46 +08:00
@bthulu 虽然如此,但总有内存敏感型场景
salmon5
2024-01-04 15:53:58 +08:00
小内存推荐 Serial GC...
kneo
2024-01-04 15:55:33 +08:00
再耐心一点,未来可期。
keepRun
2024-01-04 15:58:55 +08:00
@salmon5 我测试过,Serial GC 内存占用更大
keepRun
2024-01-04 16:00:02 +08:00
@kneo 已经结束辣😁,看看 jep ,未来 5 年内存占用问题是难有大的变化的
xiangyuecn
2024-01-04 16:00:09 +08:00
你的实际业务估计也就占用个 10-20M 内存,跟 java 本身关系不大,100M 内存也能跑很多业务+流量,就看你愿不愿意手撸 java 代码
keepRun
2024-01-04 16:04:17 +08:00
@xiangyuecn 手撸我还不如换成 golang 生态
StoneHuLu
2024-01-04 16:07:40 +08:00
我写 c#的 但我自己家里服务器部署的一些智能家居 api 我都用 golang 写的,镜像 17mb ,运行内存才几十 mb 不到,换 c#的镜像就得 250mb ,启动内存就得上百 mb
LykorisR
2024-01-04 16:08:27 +08:00
问题在于你用 spring 这种大型框架解决一个小问题,必然有大量的组件是无用占用
sephiroka
2024-01-04 16:09:14 +08:00
时间与空间不可兼得,更何况现在的内存便宜
chunqicoder
2024-01-04 16:10:54 +08:00
spring 本身就不是个小项目
icyalala
2024-01-04 16:14:34 +08:00
时间换空间:用你重写 go 的开发时间,换程序内存占用空间...
chendy
2024-01-04 16:16:44 +08:00
都上 spring 了,就别说省内存的事了…
如果真的内存敏感,试试隔壁 php 或者 go 或者 node 或者别的啥,一样的内存,java 可能应用都起不来他们可能还能顺便跑个 MySQL
啥场景用啥工具,用 java 干活说 java 吃内存,就好像说开大挂买菜说大挂废油一样…
ChaYedan666
2024-01-04 16:20:06 +08:00
都用 spring 了。就别在乎内存了。
另外我一直不太懂,为什么要在小项目上追求启动速度
keepRun
2024-01-04 16:20:06 +08:00
@chendy 以前期待 graalvm 能让 spring 降降内存,结果降了个寂寞,以后我死了这条心了,用 java 就别想降内存
keepRun
2024-01-04 16:21:07 +08:00
@ChaYedan666 我这是测试,其实我是不在意其启动速度,但是云原生时代,启动速度快有很大的好处,对资源弹性伸缩比较好
INCerry
2024-01-04 16:22:57 +08:00
可以选择迁移到 C# .NET 上面,内存占用更低,也比迁移到 node.js go 这些更简单。
keepRun
2024-01-04 16:25:44 +08:00
@INCerry 更倾向于迁移到 golang ,nodejs ,c#感觉国内用得少

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

https://tanronggui.xyz/t/1005841

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

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

© 2021 V2EX