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

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

  •  3
     
  •   keepRun · 2024-01-04 15:34:20 +08:00 · 16702 次点击
    这是一个创建于 372 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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