前几年,我一直期待 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 在解决内存占用问题上是不积极的。
101
layxy 348 天前
spring 全家桶本来就不省内存,想省内存用 quarkus+graalvm
|
102
afeiche 348 天前
应该是 spring 的锅,这东西一开始的定位就是替换 j2ee ,内存敏感可以直接上 vert.x,或者用 quarkus
|
103
keymao 348 天前
@ChaYedan666 大项目也没必要追求启动速度啊... 搞不太懂 这玩意儿又不是 app
|
104
kd9yYw2RyhQwAwzn 348 天前
提升启动速度的话 要不要试下 https://wiki.openjdk.org/display/crac 编译比 native build 要快一点
|
108
banmuyutian 348 天前
@chengxiao
少刷抖音吧 2333 |
109
diagnostics 348 天前
@chengxiao #100 抖音骗傻子,你难道也是傻子吗?你都按常识知道可以配置输出 SQL 了,难道想的不是发抖音的人是骗傻子吗?
|
110
Masoud2023 348 天前
又没人限制你必须用 Jvm ,为什么还要自己虐待自己?
|
111
diagnostics 348 天前
你都看 JEP 了,认真花点时间看看 graal 解决了什么很难吗?伸手就要啊。
|
112
Masoud2023 348 天前
@chengxiao #100 这个调下 mybatis 的 mapper 日志等级就 ok ,没那么麻烦
|
113
xiaocaiji111 348 天前 1
99%的场景下启动速度没那么重要, 比如别的语言启动 10s ,java 启动 1 分钟,依然可以接受。发布的时候又不是一台台替换的,而且替换后也不能立刻给用户用,要线上验证没问题,然后再去批量滚动替换剩余的。所以很多人说启动快,用户影响小,感知小,难道就是立马替换掉给用户用吗?
另外个人小项目,能预感到复杂度的,不建议使用 Spring ,java 也有其他轻量级框架可以用的。Java 初始内存占用多,甚至少了启动不起来,但是我们线上也用有 Go ,初始内存占用少,量上来也一样占用很多。另外大内存应用用 go 明显不如 java 的 gc 平滑。 |
114
dragondove 348 天前
我搜索了一下 Vert.x 的文章,问题应该不在 java 上,而是 spring 本身功能太多,可以看下这篇 https://www.jetdrone.xyz/2018/08/10/Vertx-native-image-10mb.html 作者最终只用了 10M 内存就跑起来了一个连接数据库的应用
|
115
wuxqing 348 天前
可以试试 https://helidon.io/ ,Oracle 开源,基于 jdk21 ,Helidon & GraalVM Native 内存占用可以小到 29M
|
116
fovecifer 348 天前 1
目前阻止我完全转向 golang 的阻力主要来自于 java 生态中几个比较优秀的基础库,例如 Apache Lucene/caffeine
|
117
zorui 348 天前
编译时间太长了也是硬伤。。
|
118
bitmin 348 天前
编译速度、启动速度不影响线上应用,但是影响我开发体验
|
119
clorischan 348 天前
|
120
linyimin520812 348 天前
之前搞过一个 spring demo ,配置了 2 个 Bean —— TestComponent1 和 TestComponent2 ,初始化方法(@Postconstruct)中休眠 5 秒,然后 TestComponent2 依赖 TestComponent1 ,模拟 Bean 的初始化慢问题。使用 graalvm 启动,启动速度并没有优化多少,还是得至少需要 10 秒
|
121
keepRun OP @linyimin520812 不至于吧,你这情况肯定是配置有问题,换成 native 启动速度应该很快的
|
122
wWjd5V5L0636B5YV 347 天前
@chengxiao 你看的是恶意诱导学生贷款的千锋的抖音吧 千锋赔命!出生千锋赔命
|
123
whp1473 347 天前
spring 问题,你用 netty 直接写个 http 试试,非常小
|
124
julyclyde 347 天前
但其实启动速度也不是啥问题
又不是经常启动 |
125
xiaocaiji111 347 天前
@bitmin 实际差别不大,不如脚本语言改了就能看结果。编译型的都慢,比如用 java 和 go 写的项目,使用 IDEA 和 Goland 编译+启动整体时间差不多。当然 go 编译好启动更快。Java 配置好,编译会自动重新加载 Class 。
|
126
kingwrcy 347 天前
2024 年了,你还在为 200m 内存担心个啥? 丐版 vps 都 256m 了
这个根本不是个事,java 生态这么庞大,你专注在 crud 了,不也是节省你的时间了吗? 换成 go,啥都得从头来,每个语言总归有对应的优缺点吧. 话说 200m 内存真不算大吧 |
129
privil 347 天前
别整 graalvm 你换 jdk openj9 内存占用好很多
|
130
cncnjcjclii 347 天前 via Android
java 一开始设计的时候就是让程序员能更方便的进行多线程编程 每个对象都有 wait notify 每个对象都可以是互斥锁 为了实现这个功能 所有对象上面都维护了一份锁信息 加大了内存占用
|
131
jry 347 天前 via iPhone
PHP 第一,不请求不占内存哈哈
|
132
patrickyoung 347 天前 via iPhone
@Nazz #90 你猜为什么 splunk 卖那么贵
|
134
wpf375516041 274 天前
|
135
lvjing2 267 天前 via Android
koupleless.io 可以了解下的,关注启动速度和内存占用的。是蚂蚁集团开源的,可以让存量应用 10 倍提升的框架
|