把之前的 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

最新回复 (62)
  • tanranran4月前
    引用2
    大佬可以试下 kotlin native
  • saranz4月前
    引用3
    其实就和 react 一样,业务代码一丢丢,但是库文件占了线上代码的大部分。
    用 Solid 重构之后线上代码变小了很多一个样。
  • boqiqita4月前
    引用4
    试试 shell 命令,估计就几十 kb
  • potatowish4月前
    引用5
    可以再试试用 servlet 实现,少用三方库,springboot 太占内存,
  • arloor4月前
    引用6
    哈哈,我也是一路从 java 走到 go ,后面又走到了 rust ,内存占用真的少。
  • silvernoo4月前
    引用7
    @boqiqita #3 shell 内存全被 curl 占了
  • silvernoo4月前
    引用8
    总结,Java 一坨屎,落后的毒瘤
  • aeiou5204月前
    引用9
    不懂你怎么选的依赖。我这边 springboot 按照你的功能点选依赖 jdbc ,mysql 驱动,starter-web ,打出来的包也就 21mb
  • aeiou5204月前
    引用10
    @aeiou520 哈哈~看错了,以为是打包的
  • sagaxu4月前
    引用11
    quarkus native 应该能优化到 20M 以内
  • keepRun4月前
    引用12
    我为了测试 web 占用大小,还测试过 rust ,可以做到 4m
  • keepRun4月前
    引用13
    这我以前写的应该有点作用:《 graalvm 拯救了 Java 的启动速度,但没法拯救 Java 的内存占用》 https://v2ex.com/t/1005841
  • mark20254月前
    引用14
    @keepRun go, rust 偏底层,写应用业务没那边顺畅,折衷选 TS+nodejs:既有 js 灵活以及 TS 类型保护,也没有 spring 全家桶那么重(占用资源太多)
  • inframe4月前
    引用15
    写代码实现功能,最快的估计还是 python
  • darkengine4月前
    引用16
    没有坏的语言/框架,只有坏的实现。

    这个需求选 Java/SpringBoot 是杀鸡用牛刀。
  • si4月前
    引用17
    打包看了下,JAR 文件 24MB ,运行起来用了 350MB 内存。
  • kk2syc4月前
    引用18
    @inframe 写代码实现功能,最快的是 php ,连代码格式都不需要考虑。打开记事本就能写 /斜眼笑 /狗头
  • karottc楼主4月前
    引用19
    @tanranran 本来想试下的,结果 kotlin native 还不支持 mysql, 只支持 sqlite, 所以优先级往后放了。
  • karottc楼主4月前
    引用20
    @boqiqita 那我不得行,我的出发点还是,要方便后续维护迭代升级,加功能必须要方便。
  • zzzmh4月前
    引用21
    说的没毛病,但我作为一个不会 go 的 java 也要给 java 说几句好话找补一下
    现在服务器没那么贵的离谱的情况下,多 1 个 G 的内存,也没那么重要
    N 年前的 JAVA ,也没比他以前的老同行省内存过,照样不耽误卷死同行,
    个人认为 Java 的优势在培养一个程序员成本低,开发大型项目难度小周期成本低。
    反过来想,理论上假如说你全部手搓代码,C 搓一个程序,肯定比 Java 性能强 N 倍,多系统运行不在话下,但培养一个员工的成本血贵,开发大型项目时间周期太长,这些成本远超内存上的这点小钱
  • bronyakaka4月前
    引用22
    非要用 springboot 这种重量级框架那还怪 java 吃内存干什么,java 技术栈也有很多轻量级框架。go 写 web 真的超级难用,只适合很简单的业务逻辑
  • keepRun4月前
    引用23
    现在手机普遍都 12g 内存了,内存其实很便宜,国内的流量带宽才是跟金子一样
  • march19934月前
    引用24
    内存虽然越来越便宜,但是 CPU 的 cacheline 其实近十年也没有太大的长进,省内存可能会带来性能上的优势
  • youyang4月前
    引用25
    @keepRun 运营商还天天说亏损呢
  • jackmod4月前
    引用26
    golang 学起来确实快,需求驱动,入门不到 4 小时。
    我也准备把 python 写的差不多稳定的原型改成 go 作为学习。
    至于 rust ,真就下次一定了(
  • darrh004月前
    引用27
    gin 和 springboot 相比,完善度有多少?
  • maigebaoer4月前
    引用28
    @bronyakaka 同意。Go 写 web 真的不够酸爽
  • qping4月前
    引用29
    @karottc 没用过 kotlin native ,为什么会不支持 mysql ,是 kotlin native 不能用 mysql 的 jdbc 驱动包了?
  • Leviathann4月前
    引用30
    @qping kotlin native 是用 llvm 编译成机器码的,怎么支持运行在 jvm 上的 jar 文件
  • qping4月前
    引用31
    @Leviathann 了解了,看起来是只能用一些 kotlin 的标准库了,不过问 chatgpt 说是可以用 c/c++的 mysql 客户端
  • BeiChuanAlex4月前
    引用32
    如果这么说,如果用 c 写,那么不是内存占用更少了 250M 的 Java 程序,用 go 重构,只需要 8M
  • SeaTac4月前
    引用33
    你站一天天的都是什么牛鬼蛇神
  • irezpeng4月前
    引用34
    哈哈哈哈,语言无好坏,喜欢博主这种折腾的精神,无非就是多学一门语言而已,以前看左耳朵耗子博客,大佬也同时学了多门语言,还运用的不错 rust 就是跟着左耳朵耗子入坑的,个人主职也是 Java ,除了 Java ,我 vue3 、node 、typescript 、js 、html 、cs 、rust 、shell 、python 也是能通水平、同时我原型也画的还可以,工具只是实现目的的工具
  • chendy4月前
    引用35
    连续剧是吧?楼主和 HotSpot 内存占用的爱恨情仇
    [Java 很强,但是 Java 的路还很长]( https://v2ex.com/t/950472)
    [quarkus-graalvm 可以救 Java native 一命]( https://v2ex.com/t/1057699)
    [果然吃内存,一个简单的 Java 程序就占用了 250M 内存]( https://v2ex.com/t/1055770)

    可以理解楼主的心情,因为我年轻的时候也喜欢抠这些东西,什么内存占用什么 gc 时间什么线程池参数
    所以还是建议把精力用在更有深度的地方,别天天跟这些玩具较劲
  • msg70864月前
    引用36
    等人长大了就知道,能早点下班,能多拿点钱,比什么都重要。
    要是 Java 能让我一年多拿十万块钱,别说 250M 内存了,250G 内存我都喂给你。
  • dbpe4月前
    引用37
    @chendy +1 现在写复杂业务..搞 java...简单就 GO,影音相关就 C/c++
  • bhoppi4月前
    引用38
    每次见到这种讨论都会有很多人说 Spring 太重了云云。我没学过 Spring ,
  • bhoppi4月前
    引用39
    我之前在别的语言用过不少很重的框架,基本上不用的模块是不会占用
  • bhoppi4月前
    引用40
    抱歉,不经常在 V2EX 发言,感觉 V2EX 的移动网页版有问题,一不小心就把文字发出去了,而且我没找到删除和修改的地方,因此请忽略上两层的回复。
    我想表达的是,每次这种讨论都会有很多人说 Spring 太重了,我就有疑惑,我没用过 Spring 但也用过别的语言的比较重的框架,基本上不用的模块是不会占用内存的。难道 Spring 的设计是,不管你用不用里面的功能,只要引入了库,就会造成大量的基础开销么?
  • flytsuki4月前
    引用41
    有空对比一下 dotnet aot 么。。
  • skull4月前
    引用42
    为老板省钱的其一方法就是优化掉自己
  • Ayanokouji4月前
    引用43
    @bhoppi spring 采用单例模式,如果启用了(绝大数模块是引入即启用),就会自动创建模块所需的 bean
  • Daniel174月前
    引用44
    最近为啥这么多吐槽 Java 内存占用的,Java 内存占用多又不是现在才出现的
  • suyuyu4月前
    引用45
    要不怎么会说 PHP 是世界上最好的语言 (
  • sagaxu4月前
    引用46
    @bhoppi Spring 不重,Spring Boot 很重,启动时扫描每个包每个类,大量使用反射和字节码动态生成织入。在运行时,哪怕只处理一个最简单的 http 请求,它也引入了完整的 tomcat ,执行到你的方法的时候,调用链路深度已经好几十层了。如果访问 DB ,标准姿势是用 JPA ,那就引入 hibernate 那套大家伙了,从 HQL 编译到 SQL ,一级缓存默认开启,不都得消耗内存?更别说有的项目还开二级缓存和查询缓存。Spring 家族是 J2EE 的一个草根实现,各种组件都选取了很重很企业级的实现,默认开启的东西很多,用不到的功能,它也可能占用着内存。大量的类也会占用很多内存,哪怕只调用了一个方法,类加载器不也得把它载入内存么?
  • wysnxzm4月前
    引用47
    @Daniel17 #43 -Xmx 不知道是什么的大有人在,不要太高估平均水平啦
  • xingjue4月前
    引用48
    go 编译速度快 资源占用少 无虚拟机 这的确是当前云原生的优势,java 这几点没法比
  • hitoto4月前
    引用49
    @chendy +1
  • tsvico4月前
    引用50
    杀鸡用牛刀,你就别怪刀重。要不试试 php 或者 C
  • Seria4月前
    引用51
    这功能,用 PHP 不好咩?
  • brookegas4月前
    引用52
    看到好多 Javaer 老气横秋教训 op 的,有点三季人的即视感。

    “PHP 是世界上最好的语言”,现在可以直接改为“Java 是世界上最好的语言”了。
    Java 过于简单,以至于吸引和堆积了大量的跨行业转码人士,他们是重要的屎山贡献者,也是最努力为 Java 辩护和战斗的群体;他们缺乏学习其他语言的能力和动力;由于低门槛易替代,他们也是 35 岁就能轻易被无情替换的螺丝钉。
    看到有人发帖说 Java 不好,第一个跳出来反击并对 op 冷嘲热讽的就是他们。

    “百万漕工衣食所系” “挡人财路犹如杀人父母”

    只能说,理解并祝福吧。。。
  • listen2wind4月前
    引用53
    @Daniel17 这种让我想起来一个段子,一个人说我哥能吃一碗饭,另一个人说我哥能吃一盆饭,再另一个人说我哥能吃答辩 250M 的 Java 程序,用 go 重构,只需要 8M
  • murmur4月前
    引用54
    @xingjue 企业开发不需要云原生啊,单体应用配个好数据库服务器能扛起绝大多数中小企业应用
  • neptuno4月前
    引用55
    企业倒是不在乎内存,你这个属于个人需求,确实适合用 go 。我部署在 nas 的程序,都是 java ,不用在乎内存,熟悉的语言好维护,出了问题改的快。
  • HaibaraDP4月前
    引用56
    技术选型绝了,hello world 写出花来
  • PaulSamuelson4月前
    引用57
    如果遇到一个 Eletron+Java 的桌面端项目,那估计能从 500MB 优化到 5MB 。
  • wxw7524月前
    引用58
    @brookegas #51 我日常项目 java 和 go 双修,偶尔写写 C#,前端也会,应该不算是单独哪一派,反驳一下你。

    你真的看懂上面老哥们说的是什么意思了吗,不是在说 Java 天下第一,而是都在指责 OP 一个很简单的需求用重量级框架,反过头来抱怨内存占用高。毕竟没有最好的工具,只有最适合的工具。

    如果你之前是看懂了还要引战,理解不了也祝福不了,如果理解能力捉鸡,那我祝福你 250M 的 Java 程序,用 go 重构,只需要 8M
  • xFrye4月前
    引用59
    @chendy 我就说为啥最近老是有这种月经帖子出现,看了你这个才知道都是同一个人发的????
  • Richared4月前
    引用60
    怎么每天都有这样的帖子,上次就说了一句,有这个时间给 App 做好点,用户的内存和硬盘就不值钱了?一个 App 安装包动不动 500M 。安卓内存都普遍 16G 了。谁造成的?真有这工匠精神,国内安卓 App 也不能到这个程度。
  • murmur4月前
    引用61
    @Richared 用户硬盘还真不值钱,256 起配,你说林檎用 c++省资源,聊天记录和图片视频不因为你是林檎系统就省资源啊
  • brookegas4月前
    引用62
    @wxw752

    理解并祝福。。。
  • janda4月前
    引用63
    没必要对比,不同需求选择不同方案,也取决于使用者所掌握的语言
  • 回复请 登录 or 快速注册
返回