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

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

  •  
  •   karottc ·
    karottc · 57 天前 · 17421 次点击
    这是一个创建于 57 天前的主题,其中的信息可能已经有所发展或是发生改变。

    把之前的 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 条附言  ·  56 天前

    今天借助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  
       56 天前
    @abcbuzhiming
    你这说法并不能反驳呀。
    经济不好、产能过剩,企业反而更要节约成本、降本增效才对。
    哪有企业在经济危机了,还扩招几批各个平台的程序员,卷那几个内存的?
    decken
        102
    decken  
       56 天前
    @idblife #71 内存翻倍 整体费用不是翻倍 你去看看云厂商的定价 4core 8g 和 4core 16G 差价并不大
    abcbuzhiming
        103
    abcbuzhiming  
       56 天前
    @DOLLOR 很简单嘛,按你这个解释,既然要降本增效,阿里应该就直接把 web 版的淘宝砍掉,那岂不是降的更多呢?

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

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

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

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

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

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

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

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

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

    已经没多少粥可以分了

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

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

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

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


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


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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



    老板娘说“哦”



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



    "后来怎么样?"



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



    "后来呢?"



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



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

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

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

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

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