V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX  ›  Java

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

  •  
  •   abcbuzhiming · 2021-08-12 10:43:35 +08:00 · 4258 次点击
    这是一个创建于 960 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    你要想瘦身源代码那还可以去开发者社区讨论讨论,你要想瘦身运行时占用,那建议直接换掉 Java——Spring 程序的资源占用没有比非 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   ·   我们的愿景   ·   实用小工具   ·   5824 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:15 · PVG 14:15 · LAX 23:15 · JFK 02:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.