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

250M 的 Java 程序,用 go 重构,只需要 8M

  •  
  •   karottc ·
    karottc · 2024-07-21 21:48:39 +08:00 · 24052 次点击
    这是一个创建于 411 天前的主题,其中的信息可能已经有所发展或是发生改变。

    把之前的 java 程序,这周学了下 golang ,然后用 golang 重构了下,稳定运行之后内存占用 8M 。

    前文:

    果然吃内存,一个简单的 Java 程序就占用了 250M 内存

    quarkus-graalvm 可以救 Java native 一命

    程序功能如下:

    • 每 10 分钟抓取某个链接的数据
    • 抓取到的内容和 mysql 里面已有的内容作对比
    • 存在就更新,不存在就插入到 mysql 中
    • 每天早上 10 点发送一个企业微信通知
    • 提供一个 rest 接口,上面的功能,可以通过定时触发,也可以通过接口手动触发(保留为了调试和验证程序情况,稳定之后几乎不会调用)。
    • 使用了 gin + gorm + cron 库(因为之前的 java 程序用了 sprinboot, 所以 go 我也特地选了大的库来使用)。

    这几天的结果如下:

    java springboot: 250M

    java (无框架):90M

    java, quarkus + graalvm + native: 50M

    python: 20M

    go: 8-10M 。


    本来想用下 rust, 发现如果不系统的学习,根本没发写出正常的程序,暂时放弃了。


    go 在资源受限的情况下,确实表现很好。之前我是排斥学 go 的,这次做项目发现,也不是不能接受。我之前写 C 的,要啥啥没有,现在有了 go, 就是 c with gc ,而且库多(相比于 c )。而且交叉编译非常方便。

    不过工作中暂时用不到 go ,玩完了。 我还是选择 kotlin

    第 1 条附言  ·  2024-07-22 20:22:33 +08:00

    今天借助chatGPT,用rust 重构了一版,功能完全是等同的,内存消耗:14M。比go 大,但是执行程序小了很多,只有7M。

    内存更大可能是因为我选的库和依赖和实现的问题的,因为我只是之前学过rust 教程,并不能独立写出rust程序,必须要通过chatGPT的帮助才行。


    到目前为止,用java、go、rust 都写了一版,这个系列可以结贴了。

    这个项目非常小,但是完全可以作为学习后端web开发的起手入门项目,涉及到的知识点和CRUD操作都有了。开发的过程也本着一个原则的:方便后续迭代和维护,方便增加新功能。 (所以那些用shell 命令来做相同的事的,虽然可以,但是不符合这个原则,所以没有去尝试)

    有兴趣有时间来做不同语言的实验(目前只做了感兴趣的这几个语言,别的语言平台,比如.net 之类的,欢迎各位来分享结果),只是为了以后碰到各种情况的时候,做合适的技术选型。

    当然很多结论是我个人的主观感受,当然涉及到个人看法肯定都是主观的,我年纪越大现在反而越讨厌那些看似中立的观点(实际啥用都没有)。

    152 条回复    2024-07-24 12:30:14 +08:00
    1  2  
    DOLLOR
        101
    DOLLOR  
       2024-07-22 12:20:31 +08:00
    @abcbuzhiming
    你这说法并不能反驳呀。
    经济不好、产能过剩,企业反而更要节约成本、降本增效才对。
    哪有企业在经济危机了,还扩招几批各个平台的程序员,卷那几个内存的?
    decken
        102
    decken  
       2024-07-22 12:23:00 +08:00
    @idblife #71 内存翻倍 整体费用不是翻倍 你去看看云厂商的定价 4core 8g 和 4core 16G 差价并不大
    abcbuzhiming
        103
    abcbuzhiming  
       2024-07-22 12:40:25 +08:00
    @DOLLOR 很简单嘛,按你这个解释,既然要降本增效,阿里应该就直接把 web 版的淘宝砍掉,那岂不是降的更多呢?

    经济不好的情况下,企业当然会选择降本,但是这个降本的途径,会从其他渠道走。相反的是。在经济不好的时期,但凡可以引来流量和更多用户的渠道,都必须重视,不光阿里,好几家大厂都开始增强自己的 web 端。为啥,缺流量了呗,每个入口都必须重视了呗。这就是你不干有的是帕鲁干
    zpxshl
        104
    zpxshl  
       2024-07-22 12:49:18 +08:00 via Android
    @abcbuzhiming 淘宝没落跟 pc 端关系也不大。 它核心竞争对手
    zpxshl
        105
    zpxshl  
       2024-07-22 12:49:44 +08:00 via Android
    @zpxshl 拼多多,也没搞 pc 端。
    sagaxu
        106
    sagaxu  
       2024-07-22 12:51:06 +08:00   ❤️ 1
    @idblife 以我了解的某个 800 万/年的机房为例,1U 服务器的年成本,采购价 5 万按 5 年生命周期算每年 1 万,托管费 5000 ,总成本每年 15000 ,内存按 256G 算,1 万左右,分摊到 5 年每年 2000 ,占年均摊成本的 13%。

    5000 万年成本的机房,内存大概占六七百万,省一半就是省三四百万。如果配的是 128G 内存,能省一两百万。

    实际上不可能全部拿来跑业务服务,很多是拿去跑 DB 等基础设施的,以上节省费用还要减半。
    5000 万里省个几十万到一两百万,不知道你的 2000 万是怎么计算出来的。
    abcbuzhiming
        107
    abcbuzhiming  
       2024-07-22 12:55:56 +08:00
    @zpxshl
    淘宝的没落和 PC Web 端是没有关系,有关系的是他没落后的态度,按 101 楼说的,你没落了更应该减员增效对吧,为啥还回来重新升级 PC web 。

    本质是上升期看不上那点入口,那点流量,下降期就必须重视了。

    PDD 的崛起也是差不多的道理——市场一直有低成本的需求,淘宝在上升期是看不上的,就像 92 楼那位老兄说:他会在这个时期考虑为用户节省吗?反正又没竞争对手怎么都能增长。结果 PDD 就跳出来了。

    市场就是这样,你永远想不到刺头会从哪里蹦出来,需求是客观存在的。经济高速发展期,可能用户的需求反而得不到满足,因为这个时期作为商家都忙着吃肉,谁关心你用户怎么想呢?但是经济进入衰退那就要绞尽脑汁去掏以前看不上的“某一小撮群体”手里的钢镚了
    DOLLOR
        108
    DOLLOR  
       2024-07-22 13:02:33 +08:00
    @abcbuzhiming
    砍东西肯定要先砍成本高的。
    web 版本身成本就低,性价比也不错。

    把其他成本高的开发砍了之后,最后留下来的,反而正是 web 、webview 、electron 这些东西,而不是去卷那几个内存。
    murmur
        109
    murmur  
       2024-07-22 13:03:16 +08:00
    @abcbuzhiming 淘宝现在是没活了啊,自己搞产品转型失败,放弃低端用户,把假货和山寨下放到咸鱼,咸鱼体验一坨屎,客服更是摆设,本体促销跟计算题一样,四处投资然后空降把产品搞黄,钱全浪费了

    但是这玩意跟技术、electron 有半点关系么,他但凡少投资点产品,把钱拿来做正经的促销,早行了
    bk201
        110
    bk201  
       2024-07-22 13:47:45 +08:00
    分析了太浅了,那为什么造成这样的现象呢?
    SouthRiverMatt
        111
    SouthRiverMatt  
       2024-07-22 13:53:43 +08:00
    有没有可能 php 是世界上最好的语言(
    ily433664
        112
    ily433664  
       2024-07-22 13:55:32 +08:00
    @idblife #80 你自己看一下不就知道了,对于高配云服务器来说,内存费用只占比较小的一部分
    bugfan
        113
    bugfan  
       2024-07-22 14:05:41 +08:00   ❤️ 1
    golang 就是现代化的 C 语言
    artiga033
        114
    artiga033  
       2024-07-22 14:09:43 +08:00 via Android
    都在争论企业怎么怎么样,资本家确实不在乎这点成本。可你们不混开源社区的吗?我个人选择自用的开源软件时都是绕着 Java,Python,Node.js 走,除非实在没有替代,企业吃得起个人用户可不一定,假如是树莓派之类的场景下那是跑 java 好还是跑 golang 好?

    这么一想我脑子里有印象的 java 开源项目基本都是 kafka,lucene 这些基本只有企业级使用场景的,企业选择 java 无可厚非,但是其他语言的开源软件生态明显比 java 好多了。
    INCerry
        115
    INCerry  
       2024-07-22 14:15:51 +08:00   ❤️ 1
    还是那句话,不如用 C# .NET ,开发效率高,资源占用还低
    murmur
        116
    murmur  
       2024-07-22 14:25:08 +08:00
    @artiga033 你说的对,但是现在所有软件开发, 除了国内因为政策原因没放开的地方,全是黑海

    已经没多少粥可以分了

    这次信创转型是最后一次机会,老企业 gov 系统重构

    至于互联网,就现在的大公司 app ,立刻瘦身 50%,对于企业裁员增效,对于用户享受真的小而美 app ,不好吗

    真就是没需求在那硬造需求,没痛点硬在那重构,不折腾干嘛,等着被优化么
    kenvix
        117
    kenvix  
       2024-07-22 15:05:59 +08:00
    魔怔 go 小子一天都在吹些什么东西,我建议直接 cgi ,没人访问零内存占用
    yazinnnn0
        118
    yazinnnn0  
       2024-07-22 18:02:49 +08:00
    怎么从黑 java(spring)一转黑苹果了.....
    GoRoad
        119
    GoRoad  
       2024-07-22 18:17:25 +08:00   ❤️ 1
    作者几句话,论坛吵翻天,几天一次,快速拿币
    murmur
        120
    murmur  
       2024-07-22 18:20:21 +08:00
    @yazinnnn0 黑安卓资源占用多,内存大,不就是吹苹果好,这年头还有什么移动设备内存硬盘双吃紧的

    不会是鸿蒙吧,鸿蒙这种放弃所有兼容性,行政力量要求所有 app 重做,并且砍掉自己功能的,第二家都做不出来
    repus911
        121
    repus911  
       2024-07-22 18:24:17 +08:00
    以前 python 写的程序常驻内存 400-500M ,换了 go ,大概 50-100M
    itakeman
        122
    itakeman  
       2024-07-22 19:01:19 +08:00 via Android
    @Chinsung 说 java 触发你逆鳞了?
    itakeman
        123
    itakeman  
       2024-07-22 19:01:45 +08:00 via Android
    一对 Javaer 好急哟,急得不得了
    ymy3232
        124
    ymy3232  
       2024-07-22 19:41:25 +08:00
    成本里,最贵的是人工(牛马除外),其次是带宽,其他 cpu 、gpu 、内存、硬盘啥的,在前两个面前不值得一提
    jeesk
        125
    jeesk  
       2024-07-22 21:20:22 +08:00
    对比一下:
    巴菲特买一套房子: 可能只需要 1s.
    网红买一套房可能: 可能要半年
    我等牛马: 应该要很多年才能付清欠款。


    上面的目的都是买一套房而已, 就像你就是采集一个数据而已。 巴菲特问你们, 你们为什么不能 1s 买一套房呀? 你们怎么回答?


    再举个例子:
    java : 第一个版本 1996 年就出来了
    golang: 2010 第一个版本才出来。

    就像娶老婆一样, 别人 15 年年就娶了老婆,孩子都很大了。15 年后,一个小伙子还没结婚, 选择的有很多,既可以选择比自己大 15 岁的女人,也可以选择和自己一样大的女人。然后小伙子给这次结婚的人科普, 你看现在的小姑娘多漂亮, 你老婆太丑了, 为什么你们不换。 这里的问题在于, 有的人可以随便换老婆(比如马斯克), 有的人就只能这样过一辈子了。 这里换成企业看看? 为什么有的企业能够直接从 java 换到 go, 有的就只能用一直用 java 了?
    itakeman
        126
    itakeman  
       2024-07-22 21:24:06 +08:00 via Android
    @kenvix 人家说实话,也是吹?见不得说实话? block 了
    xjzshttps
        127
    xjzshttps  
       2024-07-22 22:40:50 +08:00
    不写 Java 所以不了解具体情况,
    有一个疑问,Java 内存占用大是只是运行时占用?
    是否会随着业务量大而同样同比例的增加?

    例如高业务量的后端程序,go 占用 10G 内存,Java 是同样 10G+200M 运行时,不到 11G ,还是会同样同比例增加内存占用,达到 20G 甚至更高?
    karottc
        128
    karottc  
    OP
       2024-07-22 23:03:43 +08:00
    @xjzshttps 就是基础运行时大,go=10G, java=10G+200M 。不会同比例增加。
    jqtmviyu
        129
    jqtmviyu  
       2024-07-23 00:03:09 +08:00
    加上 .net 和 nodejs 吧, 好奇这两个.

    自从学了 python, 这种简单的脚本类任务连 nodejs 都嫌弃麻烦了.
    sagaxu
        130
    sagaxu  
       2024-07-23 00:06:45 +08:00
    @karottc Go=10G 时,Java 非 native 估计 20G 左右了
    mightybruce
        131
    mightybruce  
       2024-07-23 00:20:05 +08:00   ❤️ 2
    人家背地里谈论,孔乙己原来也是计算机硕士,但终究是因为打撸啊撸时间太长,忘了新生代和老年代的区别,去 IT 类培训学校做了一名学生



    幸而凭着一手垃圾回收算法进入了一家名叫外包的典当行,从此温饱不愁。但是有一个毛病就是,经常内存泄露



    上线的程序运行了几天,stackOverflowError 和 OutOfMemoryError 三次直接让 2 核 4G 的保险箱启动不了,再找他时,已经微信不回,电话不接了



    如是几次,掌柜的直接给他三个铜板求他回家了,据说差点跪下



    那时 IT 的小村子不算小,也许走路需要很长时间,但是信息的传播速度不得不让人心服口服,村东头到村西头都知道了孔乙己这个人,所以开始变得温饱不接了



    孔乙己没有法,便免不了写写文章骗一下村北头中关村的技术小白。



    文章写的好,间或有人给打赏一二,也够在 stackflow 酒坊买上一杯哈啤和半碟花生米了



    在酒坊里,品行却比别人都好,就是从不拖欠



    虽然间或没有现钱,暂时记在名单上,但不出一月,定然还清,从门口的挂牌上拭去了孔乙己的名字



    孔乙己填了一个空投,吃着花生,涨红的脸渐渐复了原,旁人就问:"孔乙己,你当真会写 java 代码吗"



    孔乙己看着问他的人,显出不屑置辩的神气



    他们便接着说道,“你怎的连个稳定工作也搞不到呢?”



    孔乙己立刻显出颓唐不安模样,脸上笼上了一层灰色,嘴里说些话,这回可是全是詹姆斯·高斯林( java 之父)缺德,jvm 搞的那么复杂之类,一些不懂了。在这时候,众人也都哄笑起来:店内外充满了快活的空气。



    在这些时候,我可以附和着笑,老板娘是决不责备的。而且老板娘见了孔乙己,也每每这样问他,引人发笑。



    孔乙己自己知道不能和他们谈天,便只好向孩子说话。有一回对我说道,“你学过 java 编程么?”我略略点一点头。他说,“学过编程,……我便考你一考。-Xms 和-Xmn 分别指的什么吗”



    我想,臭名昭著的一个人还来考我!便语气轻慢的说:"分别指的是初始化堆内存大小和新生代大小"



    孔乙己显出极高兴的样子,"那这两个有什么关联和区别,知道不"



    我想格鲁特一样低能的人还来问我,便撇撇嘴,不予理睬。



    孔乙己等了许久,很恳切的说道,“不知道罢?……我教给你,记着! JVM 内存大小=年轻代大小 + 年老代大小 + 持久代大小,是包含的关系,在内存优化的过程中是极有用的,没事多看看 java 一日一条公众平台,学习一下 java 成神之路,以后总会用到滴”说完得意洋洋捡起一个花生米丢入嘴中



    如是这样的沟通经常出现在孔乙己身边,往往引来大家的笑语



    "你这么懂 JVM ,为啥经常犯内存异常的错误呢"



    "内存溢出错误怎么叫错误。。。程序员的事,能算错误吗"



    接连便是难懂的话,什么"强引用","弱引用","虚引用“之类的。引得众人都哄笑起来



    有几回,酒坊里的小年轻听得笑声,也赶热闹,围住了孔乙己



    他便给他们发一些 java 一日一条的平台的文章,大家看完文章,仍然不散,都看着孔乙己的 V**账号



    “不行,我这 V**宽带只有一兆,自己都不够用,不能共享,改天写个爬虫,爬一些文章发到平台上,大家一起看”



    于是这一群小年轻都在笑声里走散了



    有一天,大约是年关前的两三天,老板娘正在慢慢的结账,取下粉板,忽然说,“孔乙己长久没有来了。还欠十九杯酒钱呢!”



    我才也觉得他的确长久没有来了。



    一个上网的人说道,“他怎么会来?……他打折了腿了”



    老板娘说“哦”



    “他这次不做爬虫了,改偷别人账号了,据说这次偷了川普的脸谱账号,还说要支持国产中兴呢”



    "后来怎么样?"



    "怎么样?先吊起来,后来是打,直接浩克变身开大打了半夜"



    "后来呢?"



    "后来幸亏灭霸来了,才救下了他,但也打折了一条腿"



    老板娘再也不问,仍然慢慢的往门牌上写某某今天赊了一杯哈啤
    mightybruce
        132
    mightybruce  
       2024-07-23 00:26:34 +08:00   ❤️ 1
    javaer 请继续表演哈哈,除了那些吃到早年电商红利的那批人挺 java 的确没问题,其他人我只有鄙夷的态度来看。
    HaroldFinchNYC
        133
    HaroldFinchNYC  
       2024-07-23 06:18:44 +08:00
    @saranz #2 请教一下,solid 最大的问题是缺乏配套的 UI framework ,比如 antd 和 arco design ,都没有 solid

    其实我还学过 solid ,然后发现不想手写 css ,就放弃了

    所以,这个问题:请问你用 solid ,有什么好的 UI framework 推荐吗

    谢谢
    saranz
        134
    saranz  
       2024-07-23 07:28:58 +08:00
    @HaroldFinchNYC 直接用 css 库咯。

    https://picturepan2.github.io/spectre/index.html
    https://bulma.io/
    https://designmodo.github.io/Flat-UI/
    https://bulma.io/

    我常用这几个,你也可以用 bootstrap 这此老牌库。
    layxy
        135
    layxy  
       2024-07-23 09:13:04 +08:00
    我对 go 很纠结,语法简单,写个小项目还好或者个人项目还行,逻辑复杂了看着那么多 error 有点烦
    yuheCai
        136
    yuheCai  
       2024-07-23 09:35:17 +08:00
    @HaroldFinchNYC 现在有 solid + tailwind 的组合起来的用法。但也只是解决了 UI
    gerefoxing
        137
    gerefoxing  
       2024-07-23 10:28:31 +08:00
    经典三大主题:内存占用,前端加密,跨域问题
    Chinsung
        138
    Chinsung  
       2024-07-23 10:56:15 +08:00
    @itakeman #122 孝
    Chinsung
        139
    Chinsung  
       2024-07-23 10:59:34 +08:00   ❤️ 3
    @itakeman #123 这 OP 天天发这种主题的帖子踩一捧一,摆明了就是带节奏,你要么是 OP 的小号,要么就是他的纯种野生大孝子,我 java python go 都用,php 也用,你这上来就一定 javaer 急了的🎩,和 OP 一样经典的贴吧套路啊。大孝子
    lirijie1
        140
    lirijie1  
       2024-07-23 11:08:30 +08:00
    就你这个需求点,代码行数少>内存占用
    goodspb
        141
    goodspb  
       2024-07-23 11:22:01 +08:00
    @irezpeng #33 所以原型要用什么画?
    cstj0505
        142
    cstj0505  
       2024-07-23 11:28:35 +08:00
    @idblife 老板会想赶紧切成汇编,比你什么 go 内存大小,速度快到不知道哪里去,这 2000 万会所嫩模不香嘛
    HaroldFinchNYC
        143
    HaroldFinchNYC  
       2024-07-23 11:37:49 +08:00
    @saranz
    @yuheCai

    感谢二位,那就用 tailwind 吧
    xjzshttps
        144
    xjzshttps  
       2024-07-23 11:45:47 +08:00
    @karottc 感谢,那高负载服务端使用倒是没大问题。
    MoYi123
        145
    MoYi123  
       2024-07-23 11:51:27 +08:00
    还是 go 没什么话语权, 我看 rua 友天天脚踩一切语言, 也没人反驳, 反对就是不懂 PL 的菜鸟.
    ClarkAbe
        146
    ClarkAbe  
       2024-07-23 11:58:46 +08:00
    @boqiqita 您确定吗?! 他说的不是二进制, 是内存!
    Tenlearn
        147
    Tenlearn  
       2024-07-23 12:13:31 +08:00
    @javak 我输出个 1+1 用个 spring boot 对比 Javac java ,结论是 spring boot 垃圾,搞这么多没用的依赖占用还大,这叫研究?
    Od37v61n5s89gXx8
        148
    Od37v61n5s89gXx8  
       2024-07-23 21:05:05 +08:00 via iPhone
    好处就是可以糊弄客户工作量和复杂度了啊,毕竟本站大多数人都从没想过安卓手机动辄 8G 内存甚至 12G,16G 是因为 JAVA 太占资源不得已而为之的
    bitfly
        149
    bitfly  
       2024-07-23 22:13:42 +08:00
    C#的确省过 java,php 也是,但这 3 个语言都有个共同麻烦点,就是需要依赖平台框架,op 用 go 和 r 语言的目的就是脱离平台框架,go 确实好学易懂,写 sql 也很湿滑,的确是不二选择,c 就算了,难度系数 * N
    maxzhang1985
        150
    maxzhang1985  
       2024-07-24 09:52:02 +08:00
    Go 的组件生态也很完善啊, 我框架不好用可以自己搞, 我用自己的跑业务已经好多年了,宣传一波
    https://github.com/yoyofx/yoyogo
    kenvix
        151
    kenvix  
       2024-07-24 12:26:53 +08:00
    @murmur #120 homo 作为 webapp 为核心的 os ,内存硬盘也不可能会吃紧的
    kenvix
        152
    kenvix  
       2024-07-24 12:30:14 +08:00
    @itakeman #123 也不知道是哪个🤡先急了呢
    1  2  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1166 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:51 · PVG 07:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.