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

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

15524 次点击
所在节点    程序员
137 条回复
me1onsoda
316 天前
@keepRun #3 Java 没有必要适用于任何场景。。。
INCerry
316 天前
@StoneHuLu 自己写小程序不要用 asp.net core ,asp.net core 功能太多了,还有很多动态特性,杀鸡焉用牛刀,直接用轻量级的 http server ,然后再 AOT 编译,编译出来也就十几 MB ,运行内存也就几十 MB 。
我用 C# 整了个远程唤醒应用在我家路由器跑着。
INCerry
316 天前
@keepRun c# 比 golang nodejs 还是多得多的
keepRun
316 天前
@me1onsoda 已经意识到了
keepRun
316 天前
@INCerry 感觉国内没啥公司用 c#吧,golang 起码字节主要再用,而且国人开源也给力
wxyrrcj
316 天前
solon
gitrebase
316 天前
@keepRun #25 我感觉就算不算字节,用 Go 的都比用 C# 的多吧……
qwertty01
316 天前
@keepRun #17 首先你要搞清楚 graalvm spring java 是三个东西。应该是用 spring 就别想降内存。你完全可以使用纯 java 写个 webserver ,然后到时候再来说用 java 就别想降内存
Lambdua
316 天前
java 有轻量级的 web 框架吧,有尝试过吗
keepRun
316 天前
@qwertty01 你说的没错,我用 quarkus 做了个 demo ,比我上面那个项目还简单,内存占用编译成 native 是 57m
keepRun
316 天前
@Lambdua 测了下 quarkus ,不过非常粗略
clorischan
316 天前
@INCerry #22
asp.net core 也支持 native aot 了. 只做简单的几个 api, 不依赖第三方库的话, 编辑出来文件只有几百 K, 运行内占用十几 M
INCerry
316 天前
@keepRun go 才多少人用呀 拿互联网来说 一个公司能有多少个 go 岗位(我拿前司来说 中国互联网百强企业 写 go 一般都是基础设施组 就寥寥那么几个人专职写 go 除了某几个头铁的 都不会用 go 来写业务的) 另外编程又不止互联网
Plutooo
316 天前
之前我跟 OP 也有同样的期待,那这么说的话 graalvm 除了启动速度方面还有什么大提升的地方
yazinnnn0
316 天前
要不试试 quarkus?

docker run --cpus=0.1 --memory=20m --name quarkus -p 80:8080 yazi/sample:1.0
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2024-01-04 08:46:58,037 INFO [io.quarkus] (main) sample 1.0 native (powered by Quarkus 3.6.4) started in 0.284s. Listening on: http://0.0.0.0:8080
2024-01-04 08:46:58,037 INFO [io.quarkus] (main) Profile prod activated.
2024-01-04 08:46:58,037 INFO [io.quarkus] (main) Installed features: [cdi, hibernate-orm, hibernate-reactive, kotlin, reactive-pg-client, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]


CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
185ccb037e19 quarkus 0.00% 12.16MiB / 20MiB 60.80% 993kB / 1.55MB 0B / 0B 42

yazinnnn0@cs-679368844937-default ~ [SIGINT]> wrk -t4 -d1s -c100 http://localhost:80/hello
Running 1s test @ http://localhost:80/hello
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 127.19ms 114.59ms 430.17ms 55.63%
Req/Sec 234.82 160.64 0.87k 78.57%
765 requests in 1.01s, 79.94KB read
Requests/sec: 755.88
Transfer/sec: 78.98KB


简单试了下 demo, 容器可以给 20M 内存
keepRun
316 天前
@INCerry java 写后端业务还是强,生态太猛了,golang 如果 5 年后生态发展起来,是会威胁到 java 的生存空间的
keepRun
316 天前
@yazinnnn0 quarkus 我不是很熟,之前写了个 demo 占用 57m ,可能我没配置好,目前看来,spring 框架有点重,对内存占用不太好
INCerry
316 天前
@keepRun 这个大可放心 不会威胁到生存空间 go 和 java 的定位不一样 go 没办法像 C# java 一样高效
hakr
316 天前
你编译了多久........
28Sv0ngQfIE7Yloe
316 天前
使用 Spring 这种「企业级」的框架注定了无法轻量。为特定的场景做合适的技术选型是必修课。

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

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

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

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

© 2021 V2EX