abcbuzhiming
V2EX  ›  Java

有没有办法对 Spring 进行"瘦身"?不去定制代码的前提下。

  •  
  •   abcbuzhiming · Aug 12, 2021 · 5473 views
    This topic created in 1735 days ago, the information mentioned may be changed or developed.
    Spring 现在也是个庞然大物了,一个非常简单的 Api 跑起来背着一大坨依赖,内存占用几百 M 那都算是少的。我在网上找了找优化方案也没啥结果,Spring 内部基础功能太多导致它自身消耗很大,GraalVM 这东西看着很美,实际远没到可以使用的状态。

    我甚至都起过吧 Spring 换掉的想法,但是 Spring 的 IOC 确实好用,而且其它家的这种框架,也没找到一个公认的经过工业环境考验的东西。

    感觉 Spring 在 Java 的世界不说对手了,连第二名都找不到
    30 replies    2021-08-18 16:19:17 +08:00
    rykinia
        1
    rykinia  
       Aug 12, 2021
    你如果只是要注入的话,可以用 guice https://github.com/google/guice

    或者更激进点,注入都不要了,用 vert.x
    cubecube
        2
    cubecube  
       Aug 12, 2021
    几百兆夸张了,spring boot 空项启动目大概 50M 内存。
    dqzcwxb
        3
    dqzcwxb  
       Aug 12, 2021   ❤️ 4
    又要功能多又要瘦
    那我诚招妹子,要求简单,腰细胸大即可
    fkdog
        4
    fkdog  
       Aug 12, 2021
    micronaut
    hcen1997
        5
    hcen1997  
       Aug 12, 2021
    换个思路, 是不是以前的代码没有 ioc 功能
    ioc 功能是不是在现在的软件开发当中是非常重要的,
    那么实现这个功能就要一定的代码量,
    abcbuzhiming
        6
    abcbuzhiming  
    OP
       Aug 12, 2021
    @cubecube 空项目有啥用呢,你加个最基础的 web 依赖试试
    ikas
        7
    ikas  
       Aug 12, 2021
    功能多怎么就消耗内存了?只用 ioc,那么只引入 context 就好了,也就几个核心依赖
    pengtdyd
        8
    pengtdyd  
       Aug 12, 2021
    杞人忧天 代码优化 1w 遍,远没有花钱买个好一点的服务器强
    ufan0
        9
    ufan0  
       Aug 12, 2021
    1. 一个非常简单的 Api 跑起来背着一大坨依赖,内存占用几百 M 那都算是少的
    你所谓的几百 M 是直接在 Linux 上看的吧,怀疑你的查看方式,其并非真实内存占用。

    2. 想瘦身,多排除依赖,但是效果并不明显,因为这个内存占用并没有几年前的帖子说的那么高。

    3. 不喜欢 Spring 家族考虑一下 Vert.x,我们网关 All in Vert.x 了,但是仅觉得写异步顺手。
    zoharSoul
        10
    zoharSoul  
       Aug 12, 2021
    @cubecube #2 你加上 web 试试, 轻松好几百
    Cbdy
        11
    Cbdy  
       Aug 12, 2021 via Android
    Spring 官方的例子,一个 CURD 的 demo,启动内存可以控制在 20M
    chendy
        13
    chendy  
       Aug 12, 2021
    瘦身的方向和目标是什么?如果是减少内存使用的话,其实直接加参数就能限制住,顶多内存不够用频繁 gc 导致性能下降
    sagaxu
        14
    sagaxu  
       Aug 12, 2021 via Android   ❤️ 1
    别折腾了,换 Go 吧
    renyijiu
        15
    renyijiu  
       Aug 12, 2021
    micronaut quarkus 为什么没有呢?
    Ayanokouji
        16
    Ayanokouji  
       Aug 12, 2021
    Spring Native
    zoharSoul
        17
    zoharSoul  
       Aug 12, 2021
    @Cbdy #11 我点开看了下, 是堆内存在 20mb, 进程内存 100 多 mb 呢 好不好
    zoharSoul
        18
    zoharSoul  
       Aug 12, 2021
    @zoharSoul #17 根据 RSS (常驻集大小)值在 150-190MB 范围内
    Lemeng
        19
    Lemeng  
       Aug 12, 2021
    最不喜欢折腾如我。
    liuhan907
        20
    liuhan907  
       Aug 12, 2021
    想要启动内存低换个 .NET5 用 ASP.NET 写呗,基本啥都有。
    sue0917
        21
    sue0917  
       Aug 12, 2021
    思考这些东西不如加钱升级内存
    jack778
        22
    jack778  
       Aug 12, 2021
    用 jfinal 吧,作者有强迫症,只需要导入核心包,核心包不依赖任何第三方 jar.
    cheng6563
        23
    cheng6563  
       Aug 12, 2021
    换 openj9 的 jvm,内存给你干一半下来。
    nekoneko
        24
    nekoneko  
       Aug 12, 2021
    还想用 spring 还要瘦身那就 spring native
    然后可以考虑 quarkus,国内文档少
    securityCoding
        25
    securityCoding  
       Aug 12, 2021
    @sagaxu +1,换 go 可以多活几年
    passerbytiny
        26
    passerbytiny  
       Aug 12, 2021 via Android
    你要想瘦身源代码那还可以去开发者社区讨论讨论,你要想瘦身运行时占用,那建议直接换掉 Java——Spring 程序的资源占用没有比非 Spring Java 程序的高。

    此外,Java 内存占用只是预分配占用高,实际上并不高。通过合理配置 JVM 参数,几十 M 内存就能支撑起小型服务器。
    mmdsun
        27
    mmdsun  
       Aug 12, 2021 via Android
    vert.x,akka,jooby 也行。不过占用也高,只能看 spring native 出来后了。

    要是 java 系找不到除 spring 好用的框架就看.net 系列,java 程序员基本上可以无缝对接,比如:

    [asp.net core] 这个 web api 和 spring boot 差不多,外国框架热度已经超过 spring 了
    https://dotnet.microsoft.com

    数据访问层,相当于 spring data jpa:
    https://docs.microsoft.com/zh-cn/ef/core/

    [Web 性能排名:]
    vert,x 前 20,spring 在后面 50 左右,asp.net 前十:

    https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=composite
    jin7
        28
    jin7  
       Aug 13, 2021
    换 c#
    zzzmh
        29
    zzzmh  
       Aug 13, 2021
    jvm openj9 是一个方法,放在 docker 里运行限制内存优先 swap 是一个方法,这 2 个也可以结合一起用。
    如果要治本,换 go 也可以,一定要 java,自己写 servlet,没开玩笑,servlet 真的可以实现 springboot 所有功能,只要你有本事和耐心写。。。不用 tomcat 都行,自己写 http 服务。就是累挺,有这时间,不如买个内存大点的服务器
    Joker123456789
        30
    Joker123456789  
       Aug 18, 2021
    不知道你为什么会对 IOC 有如此强的依赖, 如果可以不用 IOC 的话,vert.x 是个好选择。 或者你可以自己写一个 vert.x plus,给 vert.x 加上 IOC 的特性,作为分支发布。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   6127 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 132ms · UTC 02:39 · PVG 10:39 · LAX 19:39 · JFK 22:39
    ♥ Do have faith in what you're doing.