V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
keepRun
V2EX  ›  程序员

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

  •  3
     
  •   keepRun · 348 天前 · 16248 次点击
    这是一个创建于 348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几年,我一直期待 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 在解决内存占用问题上是不积极的。

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

    另外个人小项目,能预感到复杂度的,不建议使用 Spring ,java 也有其他轻量级框架可以用的。Java 初始内存占用多,甚至少了启动不起来,但是我们线上也用有 Go ,初始内存占用少,量上来也一样占用很多。另外大内存应用用 go 明显不如 java 的 gc 平滑。
    dragondove
        114
    dragondove  
       348 天前
    我搜索了一下 Vert.x 的文章,问题应该不在 java 上,而是 spring 本身功能太多,可以看下这篇 https://www.jetdrone.xyz/2018/08/10/Vertx-native-image-10mb.html 作者最终只用了 10M 内存就跑起来了一个连接数据库的应用
    wuxqing
        115
    wuxqing  
       348 天前
    可以试试 https://helidon.io/ ,Oracle 开源,基于 jdk21 ,Helidon & GraalVM Native 内存占用可以小到 29M
    fovecifer
        116
    fovecifer  
       348 天前   ❤️ 1
    目前阻止我完全转向 golang 的阻力主要来自于 java 生态中几个比较优秀的基础库,例如 Apache Lucene/caffeine
    zorui
        117
    zorui  
       348 天前
    编译时间太长了也是硬伤。。
    bitmin
        118
    bitmin  
       348 天前
    编译速度、启动速度不影响线上应用,但是影响我开发体验
    clorischan
        119
    clorischan  
       348 天前
    @clorischan #32
    这里弄错了. asp.net core aot 编译不含第三方库的仅包含几个简单 API 的文件大概是~10M 左右, 运行内存十几 M,
    linyimin520812
        120
    linyimin520812  
       348 天前
    之前搞过一个 spring demo ,配置了 2 个 Bean —— TestComponent1 和 TestComponent2 ,初始化方法(@Postconstruct)中休眠 5 秒,然后 TestComponent2 依赖 TestComponent1 ,模拟 Bean 的初始化慢问题。使用 graalvm 启动,启动速度并没有优化多少,还是得至少需要 10 秒
    keepRun
        121
    keepRun  
    OP
       348 天前 via Android
    @linyimin520812 不至于吧,你这情况肯定是配置有问题,换成 native 启动速度应该很快的
    wWjd5V5L0636B5YV
        122
    wWjd5V5L0636B5YV  
       347 天前
    @chengxiao 你看的是恶意诱导学生贷款的千锋的抖音吧 千锋赔命!出生千锋赔命
    whp1473
        123
    whp1473  
       347 天前
    spring 问题,你用 netty 直接写个 http 试试,非常小
    julyclyde
        124
    julyclyde  
       347 天前
    但其实启动速度也不是啥问题
    又不是经常启动
    xiaocaiji111
        125
    xiaocaiji111  
       347 天前
    @bitmin 实际差别不大,不如脚本语言改了就能看结果。编译型的都慢,比如用 java 和 go 写的项目,使用 IDEA 和 Goland 编译+启动整体时间差不多。当然 go 编译好启动更快。Java 配置好,编译会自动重新加载 Class 。
    kingwrcy
        126
    kingwrcy  
       347 天前
    2024 年了,你还在为 200m 内存担心个啥? 丐版 vps 都 256m 了

    这个根本不是个事,java 生态这么庞大,你专注在 crud 了,不也是节省你的时间了吗?

    换成 go,啥都得从头来,每个语言总归有对应的优缺点吧.

    话说 200m 内存真不算大吧
    991547436
        127
    991547436  
       347 天前
    991547436
        128
    991547436  
       347 天前
    @StoneHuLu 用 c#的 NPOI 加载了个 10MB 的 xlsx ,内存占用直接到 600MB
    privil
        129
    privil  
       347 天前
    别整 graalvm 你换 jdk openj9 内存占用好很多
    cncnjcjclii
        130
    cncnjcjclii  
       347 天前 via Android
    java 一开始设计的时候就是让程序员能更方便的进行多线程编程 每个对象都有 wait notify 每个对象都可以是互斥锁 为了实现这个功能 所有对象上面都维护了一份锁信息 加大了内存占用
    jry
        131
    jry  
       347 天前 via iPhone
    PHP 第一,不请求不占内存哈哈
    patrickyoung
        132
    patrickyoung  
       347 天前 via iPhone
    @Nazz #90 你猜为什么 splunk 卖那么贵
    keepRun
        133
    keepRun  
    OP
       346 天前
    @privil openj9 用起来有啥要特殊配置的地方吗?
    wpf375516041
        134
    wpf375516041  
       274 天前
    lvjing2
        135
    lvjing2  
       267 天前 via Android
    koupleless.io 可以了解下的,关注启动速度和内存占用的。是蚂蚁集团开源的,可以让存量应用 10 倍提升的框架
    higker
        136
    higker  
       69 天前
    @yolee599 牛逼的
    higker
        137
    higker  
       69 天前
    @jry 我认同
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4089 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:27 · PVG 13:27 · LAX 21:27 · JFK 00:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.