有没有办法对 Spring 进行"瘦身"?不去定制代码的前提下。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX    Java

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

  •  
  •   abcbuzhiming 2021-08-12 10:43:35 +08:00 5072 次点击
    这是一个创建于 1521 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Spring 现在也是个庞然大物了,一个非常简单的 Api 跑起来背着一大坨依赖,内存占用几百 M 那都算是少的。我在网上找了找优化方案也没啥结果,Spring 内部基础功能太多导致它自身消耗很大,GraalVM 这东西看着很美,实际远没到可以使用的状态。

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

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

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

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

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

    此外,Java 内存占用只是预分配占用高,实际上并不高。通过合理配置 JVM 参数,几十 M 内存就能支撑起小型服务器。
    mmdsun
        27
    mmdsun  
       2021-08-12 18:59:25 +08:00 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  
       2021-08-13 08:39:50 +08:00
    换 c#
    zzzmh
        29
    zzzmh  
       2021-08-13 10:06:28 +08:00
    jvm openj9 是一个方法,放在 docker 里运行限制内存优先 swap 是一个方法,这 2 个也可以结合一起用。
    如果要治本,换 go 也可以,一定要 java,自己写 servlet,没开玩笑,servlet 真的可以实现 springboot 所有功能,只要你有本事和耐心写。。。不用 tomcat 都行,自己写 http 服务。就是累挺,有这时间,不如买个内存大点的服务器
    Joker123456789
        30
    Joker123456789  
       2021-08-18 16:19:17 +08:00
    不知道你为什么会对 IOC 有如此强的依赖, 如果可以不用 IOC 的话,vert.x 是个好选择。 或者你可以自己写一个 vert.x plus,给 vert.x 加上 IOC 的特性,作为分支发布。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1153 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 17:48 PVG 01:48 LAX 10:48 JFK 13:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86