V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
selfcreditgiving
V2EX  ›  问与答

什么情况,占用内存 2 个 G! springboot 这么耗资源嘛

  •  1
     
  •   selfcreditgiving · 2020-09-24 02:52:37 +08:00 · 4407 次点击
    这是一个创建于 1549 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了一个 springboot 的小采集程序,使用了 netty (采集 tcp 协议数据)、jpa (保存数据库)。
    占用内存为什么这么高呢,是不是需要优化,删除没用的包什么的。

    我其他用 纯 java 实现的 同样功能的采集程序,只占 200M 左右(下图 colloect 开头的,和 route 开头的)。

    其他的用 node 实现的就更小了,第二张图,同样的功能 java 和 node 程序内存占用对比。node 只有 30 几 M 。

    springboot 和其他 java 程序:

    pm2springboot

    java 程序和 node 程序:
    java_vs_node

    18 条回复    2020-09-24 16:44:59 +08:00
    Cooky
        1
    Cooky  
       2020-09-24 07:44:16 +08:00 via Android
    spring 就是这么大!
    zachlhb
        2
    zachlhb  
       2020-09-24 07:58:07 +08:00 via Android
    没错,就是这么骚气
    SoulSleep
        3
    SoulSleep  
       2020-09-24 08:02:30 +08:00
    2 个 G 有点多了吧,如果只是爬虫,100-200M 应该是够了的,加了 jpa 和 netty 的包大概也就多几十 M
    所以 300M-500M 足够....

    一个是看你是否给 jvm 分的多了...

    另外 netty 是不是没释放资源,这个涉及到堆外内存的使用

    我理解的是这样,如有不对楼下补充
    des
        4
    des  
       2020-09-24 08:13:17 +08:00
    据说是默认会吃掉四分之一的内存,另外 springboot 确实是很吃资源
    supermoonie
        5
    supermoonie  
       2020-09-24 08:17:09 +08:00 via iPhone
    我用 netty 写了一个抓包工具,用 springboot 保存 req res 数据并负责展示,运行下来也就 700 多 M,你这个怕是内存没管理好吧,内存分析工具分析下,看看占用内存的是哪些对象
    des
        6
    des  
       2020-09-24 08:17:50 +08:00
    找到四分之一的说法的来源了
    https://stackoverflow.com/questions/38564648
    hand515
        7
    hand515  
       2020-09-24 08:33:06 +08:00
    带上 JVM 参数才好分析
    wangyanrui
        8
    wangyanrui  
       2020-09-24 08:36:04 +08:00 via Android
    不限内存大小,默认最大为机器内存的四分之一
    手动 gc 一下估计能少不少😂
    cheng6563
        9
    cheng6563  
       2020-09-24 08:44:17 +08:00 via Android
    用-Xmx 限制内存使用
    用 g1gc
    passerbytiny
        10
    passerbytiny  
       2020-09-24 08:46:09 +08:00 via Android
    JVM 默认占用物理内存的 4/1 至 1/2,可手动调控——这是 Java 人员的基本功。
    free9fw
        11
    free9fw  
       2020-09-24 08:57:42 +08:00
    java 本来就是上个世纪的,又老又笨重,打印个值都要写一大串。。。什么时候淘汰它
    selfcreditgiving
        12
    selfcreditgiving  
    OP
       2020-09-24 09:29:08 +08:00 via Android
    @des 默认分配那么多内存啊。服务器是 32g 内存的,已经跑了很多 docker 容器了,这个程序是直接跑在宿主机上的。
    如果按比例分配是不是要放在容器里就会占用少一点。
    selfcreditgiving
        13
    selfcreditgiving  
    OP
       2020-09-24 09:38:36 +08:00
    @wangyanrui #8
    @cheng6563 #9
    @passerbytiny #10
    可以设置的啊,多谢。现学的 java,不太熟悉
    SingeeKing
        14
    SingeeKing  
       2020-09-24 10:55:15 +08:00 via iPhone   ❤️ 1
    @selfcreditgiving 没必要专门为了这个放容器,可以直接调 JVM 参数的
    blackboom
        15
    blackboom  
       2020-09-24 10:58:36 +08:00   ❤️ 1
    springboot 吃内存,可以选择 OpenJ9 表现明显。
    594duck
        16
    594duck  
       2020-09-24 11:21:36 +08:00   ❤️ 1
    @free9fw 奋斗的青年啊,你在搞笑么。号称要淘汰 JAVA 的十几种语言今天能顶的上来的有哪个,别一天天天的瞎想


    @selfcreditgiving 什么都用容器解决最后会什么都解决不了。
    mazyi
        17
    mazyi  
       2020-09-24 12:39:24 +08:00 via iPhone
    水平差别怪框架
    azygote
        18
    azygote  
       2020-09-24 16:44:59 +08:00 via iPhone
    估计是内存泄露了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2560 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:28 · PVG 12:28 · LAX 20:28 · JFK 23:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.