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

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

  •  3
     
  •   keepRun · 2024-01-04 15:34:20 +08:00 · 16701 次点击
    这是一个创建于 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  
    keepRun
        1
    keepRun  
    OP
       2024-01-04 15:42:39 +08:00
    再提下官方进展:
    官方在推进 java 使用值类型,这可以提高 java 执行效率(变量分配到栈上而不是堆,降低 gc 压力,提高 cpu 执行效率),推测由于逃逸分析更方便,一定程度上会降低一点内存占用,这个预计下一个 lts 会上线。

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

    其它的看过也忘了,基本上语法上不会有大的改动,优化主要在 jvm\gc 上,没太多亮点。
    bthulu
        2
    bthulu  
       2024-01-04 15:45:44 +08:00
    内存从来都不是问题, 内存只会越来越便宜.
    keepRun
        3
    keepRun  
    OP
       2024-01-04 15:49:46 +08:00
    @bthulu 虽然如此,但总有内存敏感型场景
    salmon5
        4
    salmon5  
       2024-01-04 15:53:58 +08:00
    小内存推荐 Serial GC...
    kneo
        5
    kneo  
       2024-01-04 15:55:33 +08:00
    再耐心一点,未来可期。
    keepRun
        6
    keepRun  
    OP
       2024-01-04 15:58:55 +08:00
    @salmon5 我测试过,Serial GC 内存占用更大
    keepRun
        7
    keepRun  
    OP
       2024-01-04 16:00:02 +08:00
    @kneo 已经结束辣😁,看看 jep ,未来 5 年内存占用问题是难有大的变化的
    xiangyuecn
        8
    xiangyuecn  
       2024-01-04 16:00:09 +08:00
    你的实际业务估计也就占用个 10-20M 内存,跟 java 本身关系不大,100M 内存也能跑很多业务+流量,就看你愿不愿意手撸 java 代码
    keepRun
        9
    keepRun  
    OP
       2024-01-04 16:04:17 +08:00
    @xiangyuecn 手撸我还不如换成 golang 生态
    StoneHuLu
        10
    StoneHuLu  
       2024-01-04 16:07:40 +08:00
    我写 c#的 但我自己家里服务器部署的一些智能家居 api 我都用 golang 写的,镜像 17mb ,运行内存才几十 mb 不到,换 c#的镜像就得 250mb ,启动内存就得上百 mb
    LykorisR
        11
    LykorisR  
       2024-01-04 16:08:27 +08:00   ❤️ 9
    问题在于你用 spring 这种大型框架解决一个小问题,必然有大量的组件是无用占用
    sephiroka
        12
    sephiroka  
       2024-01-04 16:09:14 +08:00
    时间与空间不可兼得,更何况现在的内存便宜
    chunqicoder
        13
    chunqicoder  
       2024-01-04 16:10:54 +08:00   ❤️ 1
    spring 本身就不是个小项目
    icyalala
        14
    icyalala  
       2024-01-04 16:14:34 +08:00
    时间换空间:用你重写 go 的开发时间,换程序内存占用空间...
    chendy
        15
    chendy  
       2024-01-04 16:16:44 +08:00   ❤️ 19
    都上 spring 了,就别说省内存的事了…
    如果真的内存敏感,试试隔壁 php 或者 go 或者 node 或者别的啥,一样的内存,java 可能应用都起不来他们可能还能顺便跑个 MySQL
    啥场景用啥工具,用 java 干活说 java 吃内存,就好像说开大挂买菜说大挂废油一样…
    ChaYedan666
        16
    ChaYedan666  
       2024-01-04 16:20:06 +08:00
    都用 spring 了。就别在乎内存了。
    另外我一直不太懂,为什么要在小项目上追求启动速度
    keepRun
        17
    keepRun  
    OP
       2024-01-04 16:20:06 +08:00
    @chendy 以前期待 graalvm 能让 spring 降降内存,结果降了个寂寞,以后我死了这条心了,用 java 就别想降内存
    keepRun
        18
    keepRun  
    OP
       2024-01-04 16:21:07 +08:00
    @ChaYedan666 我这是测试,其实我是不在意其启动速度,但是云原生时代,启动速度快有很大的好处,对资源弹性伸缩比较好
    INCerry
        19
    INCerry  
       2024-01-04 16:22:57 +08:00
    可以选择迁移到 C# .NET 上面,内存占用更低,也比迁移到 node.js go 这些更简单。
    keepRun
        20
    keepRun  
    OP
       2024-01-04 16:25:44 +08:00
    @INCerry 更倾向于迁移到 golang ,nodejs ,c#感觉国内用得少
    me1onsoda
        21
    me1onsoda  
       2024-01-04 16:26:33 +08:00
    @keepRun #3 Java 没有必要适用于任何场景。。。
    INCerry
        22
    INCerry  
       2024-01-04 16:28:30 +08:00   ❤️ 1
    @StoneHuLu 自己写小程序不要用 asp.net core ,asp.net core 功能太多了,还有很多动态特性,杀鸡焉用牛刀,直接用轻量级的 http server ,然后再 AOT 编译,编译出来也就十几 MB ,运行内存也就几十 MB 。
    我用 C# 整了个远程唤醒应用在我家路由器跑着。
    INCerry
        23
    INCerry  
       2024-01-04 16:29:04 +08:00
    @keepRun c# 比 golang nodejs 还是多得多的
    keepRun
        24
    keepRun  
    OP
       2024-01-04 16:31:03 +08:00
    @me1onsoda 已经意识到了
    keepRun
        25
    keepRun  
    OP
       2024-01-04 16:32:08 +08:00
    @INCerry 感觉国内没啥公司用 c#吧,golang 起码字节主要再用,而且国人开源也给力
    wxyrrcj
        26
    wxyrrcj  
       2024-01-04 16:35:10 +08:00
    solon
    gitrebase
        27
    gitrebase  
       2024-01-04 16:38:16 +08:00
    @keepRun #25 我感觉就算不算字节,用 Go 的都比用 C# 的多吧……
    qwertty01
        28
    qwertty01  
       2024-01-04 16:38:31 +08:00   ❤️ 4
    @keepRun #17 首先你要搞清楚 graalvm spring java 是三个东西。应该是用 spring 就别想降内存。你完全可以使用纯 java 写个 webserver ,然后到时候再来说用 java 就别想降内存
    Lambdua
        29
    Lambdua  
       2024-01-04 16:41:51 +08:00
    java 有轻量级的 web 框架吧,有尝试过吗
    keepRun
        30
    keepRun  
    OP
       2024-01-04 16:45:13 +08:00
    @qwertty01 你说的没错,我用 quarkus 做了个 demo ,比我上面那个项目还简单,内存占用编译成 native 是 57m
    keepRun
        31
    keepRun  
    OP
       2024-01-04 16:46:59 +08:00
    @Lambdua 测了下 quarkus ,不过非常粗略
    clorischan
        32
    clorischan  
       2024-01-04 16:47:17 +08:00   ❤️ 1
    @INCerry #22
    asp.net core 也支持 native aot 了. 只做简单的几个 api, 不依赖第三方库的话, 编辑出来文件只有几百 K, 运行内占用十几 M
    INCerry
        33
    INCerry  
       2024-01-04 16:48:41 +08:00   ❤️ 1
    @keepRun go 才多少人用呀 拿互联网来说 一个公司能有多少个 go 岗位(我拿前司来说 中国互联网百强企业 写 go 一般都是基础设施组 就寥寥那么几个人专职写 go 除了某几个头铁的 都不会用 go 来写业务的) 另外编程又不止互联网
    Plutooo
        34
    Plutooo  
       2024-01-04 16:49:46 +08:00
    之前我跟 OP 也有同样的期待,那这么说的话 graalvm 除了启动速度方面还有什么大提升的地方
    yazinnnn0
        35
    yazinnnn0  
       2024-01-04 16:50:16 +08:00
    要不试试 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
        36
    keepRun  
    OP
       2024-01-04 16:51:31 +08:00
    @INCerry java 写后端业务还是强,生态太猛了,golang 如果 5 年后生态发展起来,是会威胁到 java 的生存空间的
    keepRun
        37
    keepRun  
    OP
       2024-01-04 16:53:35 +08:00
    @yazinnnn0 quarkus 我不是很熟,之前写了个 demo 占用 57m ,可能我没配置好,目前看来,spring 框架有点重,对内存占用不太好
    INCerry
        38
    INCerry  
       2024-01-04 16:54:34 +08:00
    @keepRun 这个大可放心 不会威胁到生存空间 go 和 java 的定位不一样 go 没办法像 C# java 一样高效
    hakr
        39
    hakr  
       2024-01-04 16:54:40 +08:00
    你编译了多久........
    28Sv0ngQfIE7Yloe
        40
    28Sv0ngQfIE7Yloe  
       2024-01-04 16:56:07 +08:00
    使用 Spring 这种「企业级」的框架注定了无法轻量。为特定的场景做合适的技术选型是必修课。
    ddkk1112
        41
    ddkk1112  
       2024-01-04 16:56:26 +08:00
    小型 web 项目用得着云原生 微服务吗
    内存 1g 的轻量服务器不够你跑 springboot ?
    28Sv0ngQfIE7Yloe
        42
    28Sv0ngQfIE7Yloe  
       2024-01-04 16:57:24 +08:00
    @gitrebase C#用的比你想象的多吧,游戏这边不少用的
    BBCCBB
        43
    BBCCBB  
       2024-01-04 16:57:49 +08:00   ❤️ 1
    这个内存占用和 java 无关, 大概率是 spring 等框架带来的占用.

    你如果手撸 servlet, 占用也很低..
    keepRun
        44
    keepRun  
    OP
       2024-01-04 16:58:14 +08:00   ❤️ 1
    @Plutooo 我目前只发现启动速度确实有很大优势,但是目前上手门槛还是太高了,且不说很多框架完全没有适配 graalvm ,我为了让 mybatis plus 能够不报错启动做了一大堆适配工作,github 看了不少讨论,在我看来起码还得 3 年 java 生态才能适配好 graalvm ,企业大规模采用的话应该要到 5 年后了。
    graalvm 负面影响是牺牲了 java 的动态性,arthas 这种 debug 神器都没法用了
    coinbase
        45
    coinbase  
       2024-01-04 16:58:39 +08:00
    golang 弱弱的来吊打一下 :)狗头
    keepRun
        46
    keepRun  
    OP
       2024-01-04 16:59:04 +08:00
    @hakr linux 下编译得 5 分钟,之前 windows 下编译 8 分钟
    keepRun
        47
    keepRun  
    OP
       2024-01-04 17:00:00 +08:00
    @Morii 确实是,以前我还有幻想,现在没了
    keepRun
        48
    keepRun  
    OP
       2024-01-04 17:00:44 +08:00
    @ddkk1112 你可以把我这个实验看成 java 如何应对内存敏感型场景
    keepRun
        49
    keepRun  
    OP
       2024-01-04 17:01:17 +08:00
    @coinbase golang web 生态有待加强
    yolee599
        50
    yolee599  
       2024-01-04 17:01:17 +08:00
    是不是写 javaer 只会用 spring 全家桶啊?之前让同事帮忙写一个嵌入式的量产工具,需求是工人在 UI 填入设备序列号,通过 UDP 协议给设备,设备回复结果,超时就通过 UI 提示。等他交给我的时候启动日志就打印了一个大大的 SPRING
    keepRun
        51
    keepRun  
    OP
       2024-01-04 17:02:25 +08:00
    @yolee599 毕竟 spring 实在太方便了,其实 java 生态在你说的这个场景确实有更好的技术选型
    Cat7373
        52
    Cat7373  
       2024-01-04 17:07:22 +08:00
    NodeJS + Koa + Knex 表示一个有几十个接口和十几张表,每分钟访问量大约一两百次的小项目大概需要 80M 内存
    keepRun
        53
    keepRun  
    OP
       2024-01-04 17:09:02 +08:00
    @Cat7373 nodejs 在请求量小的时候的内存占用还是少的
    gitrebase
        54
    gitrebase  
       2024-01-04 17:14:32 +08:00
    @Morii 不好意思我的,其实我想说的是 Web 场景,游戏那块儿确实还得 C#
    gitrebase
        55
    gitrebase  
       2024-01-04 17:18:07 +08:00
    @yolee599 #50 只要不考虑内存什么的,现在写 Java 直接上 Spring Boot 完全没问题啊,Boot 提供了很多开箱即用的东西,没必要说“是不是写 javaer 只会用 spring 全家桶啊?”这种话吧;关于你的同事在“嵌入式”场景下用 Spring 这种重型 framework 可能确实不太妥,但我更倾向于这是使用者的问题
    fuckshiter
        56
    fuckshiter  
       2024-01-04 17:18:42 +08:00
    我觉得这个得看业务跑起来之后的占用,不是看刚启动的
    Cabana
        57
    Cabana  
       2024-01-04 17:20:29 +08:00   ❤️ 1
    要不试试 ktor?
    abcbuzhiming
        58
    abcbuzhiming  
       2024-01-04 17:23:02 +08:00
    @bthulu 云上的内存其实非常有限,越是大企业越在意成本。

    @ChaYedan666 越便宜的产品,消费者反而会越斤斤计较价格。总价 100w 的房子多 1w 少 1w 很多人不会有感觉,总价 10 块钱左右的拖鞋,很多人都会挑来跳去就为了省那一块钱
    keepRun
        59
    keepRun  
    OP
       2024-01-04 17:23:24 +08:00
    @Cabana 这玩意好使么?有没有实际使用的数据发来看看?
    qwertty01
        60
    qwertty01  
       2024-01-04 17:25:09 +08:00
    @keepRun #30 https://openjdk.org/jeps/408 试一下 java-webserver 想要内存小就不要用成熟的框架
    keepRun
        61
    keepRun  
    OP
       2024-01-04 17:26:44 +08:00
    @qwertty01 这个就算了,这个只能临时用用
    Richared
        62
    Richared  
       2024-01-04 17:27:58 +08:00
    手写 servlet,能不用的包就别用,使用 Serial 。应该能省下不少。
    keepRun
        63
    keepRun  
    OP
       2024-01-04 17:30:07 +08:00
    @abcbuzhiming 我也觉得,云厂商为了赚钱内存卖的比较贵,即便是如今内存价格已经降了很多的情况下
    ddkk1112
        64
    ddkk1112  
       2024-01-04 17:39:20 +08:00
    @keepRun
    不觉得你的想法很矛盾吗,一边说内存敏感,一边又要上 spring
    你这不叫 java 应对内存敏感,而是 spring 内存占用测试
    lambdaq
        65
    lambdaq  
       2024-01-04 17:40:36 +08:00
    你跑起来只需要 200M ???我怎么感觉随便一个 java 项目不分配 2G 根本不敢上。。。
    keepRun
        66
    keepRun  
    OP
       2024-01-04 17:43:57 +08:00
    @lambdaq 2g 有点夸张吧,你是依赖过多了吧,调整下最大堆内存大小,可以测试下最大堆内存调低到多少项目才无法启动
    lambdaq
        67
    lambdaq  
       2024-01-04 17:49:36 +08:00
    @keepRun 比如,线上 java 项目的 docker ,你敢不敢只分配 256MB 512MB 1G 就让跑。。。。
    salmon5
        68
    salmon5  
       2024-01-04 17:51:32 +08:00
    确实 springboot 项目 JVM 2G-20G 不等。8G 的居多。
    keepRun
        69
    keepRun  
    OP
       2024-01-04 17:54:31 +08:00
    @lambdaq 不敢,个人项目倒是可以
    nothingistrue
        70
    nothingistrue  
       2024-01-04 18:10:44 +08:00   ❤️ 1
    不要嫌 Java 内存占用大,JVM 可是目前内存占用最小的 VM 。

    相比与其他编码语言,Java 内存占用大,是因为 VM ,而决定 VM 的是 GC 机制,这都跟它的解释性运行架构没关系,所以编译成 native ,并不能减少内存占用。
    morgan1freeman
        71
    morgan1freeman  
       2024-01-04 18:10:44 +08:00
    @gitrebase #55 注意是量产工具,量产工具都是运行在 pc 上面的,内存? who care ? 就是 udp 通信,肯定启一个 springboot 然后 CommandLineRunner 里面 循环发送 udp 就完事了
    yazinnnn0
        72
    yazinnnn0  
       2024-01-04 18:18:23 +08:00
    怼上数据库(postgres)后简单模拟了一下 quarkus 在有限内存的情况

    implementation("io.quarkus:quarkus-hibernate-reactive")
    implementation("io.quarkus:quarkus-resteasy-reactive-jackson")
    implementation("io.quarkus:quarkus-hibernate-reactive-panache-kotlin")
    implementation("io.quarkus:quarkus-kotlin")
    implementation("io.quarkus:quarkus-reactive-pg-client")


    @Entity
    class Todo : PanacheEntity() {
    companion object : PanacheCompanion<Todo>

    var title: String? = null
    var description: String? = null
    var completed: Boolean? = null

    @Column(name = "due_date")
    var dueDate: LocalDate? = null

    @Column(name = "created_at", updatable = false)
    var createdAt: LocalDate? = null

    @Column(name = "updated_at")
    var updatedAt: LocalDate? = null
    }

    @Path("todo")
    class TodoApi {
    @GET
    fun getAll() = Todo.listAll()

    @POST
    fun save(todo: Todo): Uni<Todo> {
    if (todo.id == null) {
    return todo.persistAndFlush<Todo>()
    }
    throw WebApplicationException("id shouldn't exist", 499)
    }

    @GET
    @Path("{id}")
    fun getOne(@RestPath id: Long) = Todo.findById(id)
    }


    version: '3.8'

    services:
    postgres:
    deploy:
    resources:
    limits:
    memory: 100m
    cpus: "0.1"
    image: postgres:latest
    environment:
    POSTGRES_DB: yazinnnn
    POSTGRES_USER: yazinnnn
    POSTGRES_PASSWORD: yazinnnn

    sample:
    image: yazi/sample:1.0
    deploy:
    resources:
    limits:
    memory: 20m
    cpus: "0.1"
    ports:
    - "80:8080"
    depends_on:
    - postgres
    environment:
    "QUARKUS_DATASOURCE_REACTIVE_URL": vertx-reactive:postgresql://postgres/yazinnnn


    ➜ postgres wrk -t 12 -c 100 -d 10s http://localhost/todo 18:09:49
    Running 10s test @ http://localhost/todo
    12 threads and 100 connections
    Thread Stats Avg Stdev Max +/- Stdev
    Latency 536.18ms 143.86ms 999.36ms 75.14%
    Req/Sec 16.39 10.27 80.00 71.69%
    1750 requests in 10.09s, 3.31MB read
    Requests/sec: 173.39
    Transfer/sec: 335.78KB


    ➜ postgres wrk -t 12 -c 100 -d 10s http://localhost/todo/1 18:10:03
    Running 10s test @ http://localhost/todo/1
    12 threads and 100 connections
    Thread Stats Avg Stdev Max +/- Stdev
    Latency 256.09ms 78.20ms 499.31ms 84.83%
    Req/Sec 31.49 17.98 191.00 60.73%
    3686 requests in 10.08s, 705.52KB read
    Requests/sec: 365.55
    Transfer/sec: 69.97KB
    yazinnnn0
        73
    yazinnnn0  
       2024-01-04 18:19:48 +08:00
    @yazinnnn0 #72 看起来 quarkus 给 20m 就可以跑个基本的 crud 程序了

    话说在资源敏感的情况下, 不是该上 rust 吗?
    yalin
        74
    yalin  
       2024-01-04 18:20:52 +08:00
    k8s 容器环境的内存捉襟见肘
    byte10
        75
    byte10  
       2024-01-04 18:28:19 +08:00   ❤️ 1
    可以测试下 vert.x 吗, 这个估计占用也很小,几十 m
    keepRun
        76
    keepRun  
    OP
       2024-01-04 18:52:22 +08:00 via Android
    @byte10 没用过,等个有缘人测试下
    bjfane
        77
    bjfane  
       2024-01-04 19:14:55 +08:00
    graalvm 是不是没法用数据库连接池? 之前好像是。
    keepRun
        78
    keepRun  
    OP
       2024-01-04 19:23:30 +08:00 via Android
    @bjfane 可以的,跟正常使用一样,graalvm 只是限制了反射和代理的使用,如果非要用到反射和代理,得通过 json 文件告知 graalvm
    knightdf
        79
    knightdf  
       2024-01-04 19:23:45 +08:00
    反过来想,是 spring 不适合小项目,小项目就用 go rust
    bjfane
        80
    bjfane  
       2024-01-04 19:26:44 +08:00
    @keepRun 谢谢,大概 10 个月之前折腾过一次,可能是 spring 或者连接池的原因,想弄成 native ,结果不行,就没深究了
    keepRun
        81
    keepRun  
    OP
       2024-01-04 19:34:58 +08:00
    @bjfane 可以看下这个项目,利用 spring 提供的 proxy 、reflect 钩子注册需要使用到代理、反射的地方,最终运行一个 native 程序
    keepRun
        82
    keepRun  
    OP
       2024-01-04 19:35:13 +08:00
    ufan0
        83
    ufan0  
       2024-01-04 19:59:55 +08:00
    遇到了一样的场景(使用 native 重构应用),虽然个人对这个结果是早有预见,但还是比较失落。
    正在分别使用 quarkus 和 rust 重构,看看是否能带来内存和性能上的极大提升。
    chaofanx
        84
    chaofanx  
       2024-01-04 20:02:39 +08:00 via Android
    quarkus 号称云原生 java
    keepRun
        85
    keepRun  
    OP
       2024-01-04 20:12:03 +08:00
    @ufan0 quarkus 可能会更好点,spring 内存占用可能还是优化不了
    kenvix
        86
    kenvix  
       2024-01-04 20:31:17 +08:00
    你先把你的 spring 扔了用轻量框架再说; spring 自己就是个内存大户
    buffzty
        87
    buffzty  
       2024-01-04 20:39:47 +08:00
    java 内存不是叫大 是非常大。一套 k8s 主节点所有服务才 1 个 G ,java 随便写点东西 2G 起步,不给多点 死给你看。
    有得必有失,根据应用场景选,java 作为企业级大杀器 大厂有钱使劲造 稳定就行
    itning
        88
    itning  
       2024-01-04 20:43:03 +08:00
    内存很值钱吗?
    VYSE
        89
    VYSE  
       2024-01-04 21:32:57 +08:00
    JEB 加载个微信 APK, 得上 128G 内存
    iseki
        90
    iseki  
       2024-01-04 21:43:08 +08:00
    Graal 也没有魔法啊,能优化优化速度完全是仗着把初始化好的 heap 存起来了。春天包含这老多东西,那内存不可能小啊
    Nazz
        91
    Nazz  
       2024-01-04 21:49:02 +08:00 via Android
    @bthulu 你猜为什么很多公司不愿意用 ELK
    keepRun
        92
    keepRun  
    OP
       2024-01-04 22:11:35 +08:00
    @Nazz 我就是因为嫌 elk 占用内存太大用了 loki+grafana+promtail 来做日志分析
    cabing
        93
    cabing  
       2024-01-04 22:58:34 +08:00
    小项目使用 go 也很方便。
    GeekGao
        94
    GeekGao  
       2024-01-04 23:08:25 +08:00
    早在 JDK 1.5 的时候我就觉得这内存吃不起啊,所以就玩起了 Python ,以及这两年的 Golang
    90xchun
        95
    90xchun  
       2024-01-04 23:10:12 +08:00 via Android
    内存使用和 graalvm 用不用关系不大,你自己 dump 下内存堆就可以了,spring 里面 jar 包太多了,native 后会直接被 graalvm 直接加载到内存里面,且一直不得释放,内存占用肯定下不来,小的 web 项目真没必要上 spring boot 全家桶,可以试试 https://github.com/94fzb/simplewebserver 这个库,内存 16m ,就启动的了,自己程序优化的好 32m ,就能流畅运行了
    Nazz
        96
    Nazz  
       2024-01-04 23:38:59 +08:00 via Android
    @keepRun 我打算试试 OpenObserve ,Rust 写的,采集程序可以用 iLogTail ,连 Kafka 都省了
    wangtian2020
        97
    wangtian2020  
       2024-01-05 00:03:07 +08:00
    速度从来都不是问题, 速度只会越来越快.
    saberscarlet
        98
    saberscarlet  
       2024-01-05 00:33:21 +08:00 via Android
    最近刚好把一个 springboot 的 iot 项目( 10 多个服务) 改造成 native ,累个半死,32c256g 机器 gradle 不开多线程要编 50 多分钟,开了也要 18 分钟
    someonedeng
        99
    someonedeng  
       2024-01-05 00:59:01 +08:00
    这个锅应该 spring 来接,或者其实不该接。

    内存敏感就不该选 spring 呢? vertx 、直接 netty 都能搞,或者写写 go :doge
    chengxiao
        100
    chengxiao  
       2024-01-05 07:51:32 +08:00
    有个问题啊, 没写过 java,无意间刷抖音刷到个视频
    说写 spring 用 mybatis orm 想输出 执行的 sql 语句,需要装一个 IDE 插件.....这东西配不出来么???还需要借助 IDE 才能实现??
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:04 · PVG 21:04 · LAX 05:04 · JFK 08:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.