Golang Go语言的内存优势在部分场景比想象中多

发布于 1周前 作者 phonegap100 来自 Go语言

不是吵架帖子,但经常看 go 和 java 比较的时候,经常有人说,go 节省点的内存跟程序员相比根本不值得一提,我越想越觉得不对劲,对于最常规的 crud 来说,不得不说 java 确实比 go 还是要一些的,不过事实是 java 或者 php 程序员转 go 其实狠快根本没那么难,而且现在环境下程序员不一定就很贵了。

go 和 java 我自己都在写,一般来说对于不差钱的国企和政府以及企业市场,java 确实是最适合的,但是我也自己做一些小产品和项目给一些小公司,我能感觉到 java 和 go 对你拿单的成本影响是很大的,比如我有一个订票(城际定制商务车业务)小程序,有时候是我自己提供云服务器,我不得不说物理机的内存确实狠便宜,可是云服务器的内存真的很贵,新用户还不明显,老用户续费狠明显,在一台 2 核 4g 的云服务器上,我一般自建数据库和 redis,然后再配合 go 的应用,因为可能面对好几个客户,会有一些自定义需求,所以部署个五六个是狠轻松的,因为每个应用的访问量并不大,但如果是 java 是很难这样子搞得,这样给了自己很大得利润空间以及拿单成本。

说了这么多,我只能说 go 其实更适合个人开发者和成本敏感型得小团队,因为一般这样团队,都自己写程序,最大得成本就是云服务得开支了,最后再说一句云服务器得内存,cpu,宽带真得很贵,动不动类似 spring 全家桶那样得架构真得狠费机器。


Golang Go语言的内存优势在部分场景比想象中多

更多关于Golang Go语言的内存优势在部分场景比想象中多的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

101 回复

sprinboot 换成 quarkus 会不会好点呢?

更多关于Golang Go语言的内存优势在部分场景比想象中多的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


2c4g 的服务,本地数据库 redis ,跑五六个实例
没干过私活的再次感觉眼界打开了

狠轻松的 go ,又有什么理由不用呢?

同感 ,我一个 go 写的物联网项目 ,实时 300 个设备在线 + 大量消息 + webapi 才 25M 内存, 太省了。已稳定运行 3 周

把写 go 的开了换成 java 的,省下来的工资够买多少台服务器了

#2
2c4g, 6 个机器 跑 10Kqps 还空余 大量资源

买服务器不是花钱就行的, 服务器越多运维的成本就越高, 架构也可能要重新设计.

一方面,你说云主机内存贵,很有道理。jvm 就是费钱

另一方面,你都 redis 了。。不肯拿个 2G 4G 容量的 redis 吧。。。。所以还是得费内存

不可能拿个 2G 4G 容量的云主机跑 redis 吧 —— 结果还真是 2C4G 。。。你赢了。。。

说内存效率不重要的基本都是大厂吧
对于小厂来说,java 的效率可太吃成本了

大厂可能无所谓, 像我这种部署到客户厂里的, go 我只要一台几百块的口袋机就行了, java 那可不行.

你的 redis 是用来做分布式锁还是做缓存用的?

2c4g 和 2c16g 每个月就差 100 快钱而已,什么业务成本能敏感到这种程度?

业务量大的自己找机房托管,单个开发的成本,足够均摊 20 台 40 核 256G 内存的费用了。

据说现在的外包,都卷到了一套系统一两千,还带一年服务器的。

卧槽开眼了。

2c4g 160 ,2c16g 280 ,这成本快翻倍了吧

主要是 jvm 、spring 这一套太重了。在目前家家降本增笑的背景下,大厂照样在乎成本了。微服务、容器化的架构下,java 应用上来 jvm 就吃掉几个 G 的内存,几千上万个容器开销就非常大了。

我要笑死了🤣,7 个”很“和 7 个”狠“


刚刚去 k3s 截了个图
自己买云厂商活动机组的 k3s ,普遍是 2c4g ,所以对内存很敏感,一旦全部跑在一台机器上面之后,内存爆了机器都连不上

部署的这些东西,除了 python 那个和 halo ,其他都是我自己写的,用 go 写的请求量超大的服务,占用内存也比那几个 java 老服务没流量占用的内存小一大半。
绿色框的 java 服务设置了 jvm 内存限制为 1G ,它的请求量大,占用内存多没得说;蓝色框的两个老服务,基本上没什么流量了,现在设置的 jvm 内存限制是 512M ,再低就起不来了


现在你问我写新东西要用 java 还是 go ?你觉得我该选什么?
从图上看,go 写的东西无论是 cpu 还是内存都比 java 低太多了


————————
FAQ:

1.为什么不加钱上大机器?
A:钱不是大风刮来的,就这一堆,算下来一年都要好几千块钱呢

2.为什么这么多 java 服务?
A:有些是以前写的,为了降低占用,我都把里面的代码改了很多了,老服务做兼容的逻辑,以前是查库,现在我改成了返回死数据。如果时间够,我是真的想把这堆东西全部用 go 重写

3.这是 pod 的占用,有些两个容器的是不是其他容器占用大
A:有两个容器的,第二个容器都是 categraf ,用来采集 promethus 数据上报监控的,没有这个监控,我连哪台机器内存爆了都不知道

数据库和 redis 在单独的机器上,通过内网连进去,不在 k3s 里面

目前 go 的生态已经很不错了,以前一般公司不太敢切到 go,轮子少,尤其是特定业务缺少轮子自己造工作量很大,现在公司用 go 的不少了,不只是服务器内存成本

/流汗 这种帖子下次还是开到个人开发者这类的吧,仅仅是剩内存不足以让企业更换技术,这个成本比内存带来的成本高得多

一套一两千是卖 saas 吧,一般是多租户设计,点击几下就上线了,边际成本接近于零。

多花一个人天就不止 1000 了。

上来就吃掉几个 G 内存的应用,用 Go 也小不了多少,按照过去经验,大概能节省 40%到 60%左右。按每个容器省 2G 算,10K 个容器就是 20T 内存,采购价约 60 万,按使用 3 年算每年才 20 万,还不到半个开发的成本。

个人玩儿票业务,跟营收支柱业务,成本敏感度差异是很大的,租办公室一个工位成本就要一两万一年了,核心区域一个工位一年成本要五万。让个人掏这个钱,体感要命了一样。

如果省内存收益巨大,哪个公司砸点钱用 Rust 或 C++重写包括 hadoop 在内的一大把基础设施,应该不愁销路。

你说这么多,我想说啥列,让一个人写 java 的人写 go 并不是啥难事,之所以是 go ,是因为他上手很快,你说的什么 rust,c++这些上手门槛和 crud 效率跟 go 和 java 都差太多了

最大堆给小点用轻量级的框架 Java 也可以比较小,用 Vertx HttpServer 压测最大堆给 32M 压测结果
➜ ~ wrk -t10 -c100 -d10s http://localhost:8080
Running 10s test @ http://localhost:8080
10 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.33ms 2.94ms 74.85ms 98.96%
Req/Sec 9.05k 2.01k 11.63k 82.97%
909414 requests in 10.10s, 8.51GB read
Requests/sec: 90003.95
Transfer/sec: 861.95MB

整个应用加上一些非堆的占用实际用 100M ,只想说要根据应用多方面的因素来选型

每次看到这种帖子,我都想把我的服务器换成 go ,可惜没时间去学啊

我还是选择 c#性能和内存双收,美滋滋。

#26

连 wrk 都能用 10 线程,Vertx 本身是用了二三十个线程吗?

100 个 TCP 连接,占不了啥内存吧。。每个 4KB ,也就是 400 KB 这样?

还有开发体验

只是简单做个演示,很多人对 Java 有刻板印象应用一启动就要用多少 G 内存不根据自身的需求做一些选择调整

说大厂不在乎服务器成本的我真不知道哪个大厂,字节跳动连 Go 的 HTTP 框架和 RPC 协议都要自己实现,然后洋洋洒洒写了一堆报告,分析更换后节省了多少内存和 CPU

有做信创的吗?据说 90%的项目只认 JAVA 有这个说法吗?

我运维,投 go 一票太方便了
资源占用低,二进制运行。打包完的 apline 容器只有 2-30m

我主要写 Node 的, 相比而言 Java 内存确实多, 代替 Java 上云确实能省钱, 个人项目选 Node 肯定不选 Java, 现在 Node 世界有个新运行时叫 Bun, 用 Zig 写的, Benchmark 吊打 Gin Spring, 以后哪天说不定就火了.

不懂想问,生态方面劣势大吗? Java 写业务代码门槛太低了。

go 也挺适合单打独斗搞私活,最小化服务器成本

医疗系统很多都是.net c# 开发的,前不久,一群不搞 HIS 的人, 给卫生局出了一个去 A 调研报告(原来网上有,被投诉撤掉了),就是认为 JAVA 是安全可控的,c# 是要去 A 的… 屁股决定大脑

现在 go 培训班都批发多少轮了,不能说一抓一把也能说并不稀缺

#32 京东, 部门费用摊分计费只算核数, 所以 2c16g 和 2c1g 实际上是一个钱, 这样算下来 go 反而因为性能是亏得

但是 java 现在有一套代码生成的,有很多业务生成就解决了(甚至是前后端)(小厂)开发成本会降低很多,go 现在生态还需要完善

对于独立开发来说,每一 M 内存每一 M 硬盘每一 M 带宽 能省的必须省,为了省内存和 cpu ,我连 crontab 都舍不得配,全部移到 GitHub action 上去跑,要加载用到的数据字典都是用到的时候耗点时长和牺牲点体验临时加载用完就卸掉,每一个资源的消耗都意味着要自己掏钱,别说每月就差 100 块了,每月能不能靠自己挣到 100 块都是不确定的事情,所以这么抠抠搜搜。

目前我 2c8G redis+mysql+10 几个 go 服务,基本用不完,耗内存的主要还是在跑一个 selenium 脚本用满了

> 说了这么多,我只能说 go 其实更适合个人开发者和成本敏感型得小团队,因为一般这样团队,都自己写程序,最大得成本就是云服务得开支了,最后再说一句云服务器得内存,cpu,宽带真得很贵,动不动类似 spring 全家桶那样得架构真得狠费机器。

OP 格局低了, 越大团队越大业务, 省的越多. OP 个人只省了这点成本就很可以了, 对于大业务量, 那节约的成本可是大太多了

顺便安利下我这个是给大业务节约成本的仓库, 量小的标准库更适合:
https://github.com/lesismal/nbio

之前看人说,不差内存的 arm 用 go 来写最方便。

信创还真不是只认 Java……我参与过的项目只有一个有少量的 Java 服务,其他全是 Go 、C 、Python 。信创不关心什么内存磁盘用量啥的,人家指标点在芯片、系统、数据库之类的东西,国产化率有多少。当然能在低配机器上跑肯定是不错的,只是这个不是最核心的东西。

个人项目用 Java 确实要命,什么也没跑先吃一堆内存。之前跑一个社区的服务,Ruby 写的,要了命了,内存猛猛吃。我只有一堆 1C0.5G 或者 1C1G 廉价服务器,所以从来只写 Rust 、Python 、TypeScript 、Golang 这种省内存的……

当年我负责维护的公司服务器,4c8g 跑 400 多个 phpcms 站点,利润夸张,老板买房买车

我艹,这么利害…

ruby 都是 ror 吧,python django 也一样啊.只是 python 很多人不用 django

这样啊,那我也搞个 go 玩玩。。

楼上大佬们,现在搞 web 框架,一般 go 用哪个? orm 用哪个?

对于小规模场景,节省成本的最好方式是要实现实时的智能容量管理,比如使用云函数+可伸缩的云数据库,成本会非常非常低。

nextjs 直接无服务更是绝杀

当时入职第一个接触的项目就是迁移一个 kotlin 核心微服务到 go ,前前后后花了 3 个月重构,但之后每个月能省大概 1.5T 内存的钱,CPU 用量也省了很多。现在有在考虑转 zig 或者 rust 了
replica 上 100 的话,基本早转早省。只是经常会出现内部库没有对应版本,得自己移植旧库到新语言上。

之前论友分享了一个屏蔽 pcdn 节点的工具, 叫 PeerBanHelper , java 写的, 运行几百 M.
关键我下载 bt 的 transmission 还不到 30M. emby 也就 300M.
后来实在受不了这占用, 直接用 shell 写了个防火墙拦截的. 定时任务, 占用为零, 这下总算舒服了.

整啊, 刚刚把我几十流量的博客换成 Go, 内存从 400M 锐减到 30M, 太爽了!

我把我的博客也换成 Go 了, 确实很爽! 生态环境小应用基本可以做到平替.

不过 Java 还是有 Java 的好.

我个人的观点是: 企业内存不敏感尽量 Java, 个人用户选 Go 没商量~

关键还是 Go 学习成本不高, 两个一起整没啥压力.

我是一个写 java 的。但 java 的内存占用真的太高了,所以我现在跑在服务器上的两个 web 的后台服务都是 go 写的,一个为记账软件,另一个是博客系统。 并且博客系统的 db 还换成了 sqlite3 ,因为 mysql 等服务也太占内存了

#20 这是什么面板呀

pocketbase 了解下,完美发挥了 go 的轻量和零依赖特点,用来写个人项目和私活太爽了

python 学习来比 go 快,还能蹭 AI,不也挺好

大厂肯定在意啊,省零点一个百分点内存占用,换成钱得不老少了。
one-man shop 其实到无所谓。

java 服务部署的节点 cpu 内存比例要 1:4 甚至 1:8 特殊服务要 1:16 ,go 的用 1:2 都有大把空闲,有时候为了降本得找 go 研发要求他们多用些内存,或者在 go 服务的机器上部署些 redis 吃内存

我用: https://github.com/go-eagle/eagle 其实选个合适自己的就好

所有带内存管理的语言都面临一个问题:多用 CPU 还是多用内存,Go 也是如此。Java 也可以把内存调低,也就是更频繁的回收占用更多 CPU 而已。对于极端内存敏感的场景,可以试试 graalvm native 便衣

#20
想问下这个跑 k3s 服务器的配置?
还有 k3s 好使么? 我在观察 k3s 和 k0s 的选型,单机跑

开发需要生态,看的从来不是语言。
java 别的不说,有 spring 系在,加上语言的强制约束,新手只要按部就班的工作能写 crud 。
未来我更看好 rust

如果既想要超越 java 的开发效率,又想要高性能,还想要低内存占用,为何不试试神奇的 C# + .NET9 + DATAsGC 呢?

Golang:C 的网络语法糖 拿 Go 写 CRUD 你不觉得累吗(和 Java 比)

go 可以直接拿到近似 c++的运行和内存性能, 还不用去突破 c++的学习门槛.

内存问题 spring 要背大锅, 当然 java 也要背一部分。
我这边一个项目,包含上千终端的 websocket ,以及消息队列轮询(数据就存在应用内存中)用 vertx 1 核 1g 绰绰有余

我司信创就是好多客户,见我 github ,amd64 ,arm64 ,loong64 ,mips64el 啥的架构都有,go 自带交叉编译,没看到有客户要求语言栈的,达梦,人大金仓之类的都有 cgo 或者 go 的 client 库的

真省成本还得是 php, 毕竟大部分人的应用根本不会有人用,不用的时候 0 内存,才是最省的

我组的高可用集群

#76
那 k3s 和 k8s 选型是怎么考虑的?

第一次用 k3s 的时候,我的活动机都开的是 1c2g ,跑个 k8s 的话就别想跑服务上去了,所以就整了 k3s ,后面受不了机器性能太低,就渐渐的开成 2c4g 的配置了

还有一个是组网是用的 tailscale 来跨云联通,这块 k3s 有很多资料(直说了就是米开朗琪杨推的🤣)

#79
谢谢解答🙏
第一点我猜到了,第二点是我没听说过的

成本敏感, 那选 PHP 更好,初始化占用内存少、外包人数还多、修改迭代速度快

难道不是为了晋升吗

为了晋升弄这个不正说明领导看重成本控制吗?为啥不写个报告说我们的服务器多有少台机器呢?目前世界第一,还在稳定增加?

#43 也不算不差钱。我们这有一套系统用 go 写的,代码量说少也不少,十几万行。前阵子要支持 arm ,迁移过去也就花了两三天。若是 java 或者 c++的话,怕搭建环境与编译都搞不完

对个人来说,Go 非常好,资源占用少,能省下不少服务器费用。
对企业来说,Go 省下的服务器费用不注意抵消 Go 开发人员工资远比 Java 开发人员高,还难找的尴尬。

所以用哪种语言只取决于你自己的身份

搞信创其实 Go 更合适,源码保密(说的是部署保密) 交叉编译,比 java 好多了

怎么说呢,你小项目没什么量,用什么语言其实都无所谓,你用 lua js 都行,spring 本身就用来搞大型企业项目比较流行的。生态好,市场人才也多,不过话说回来这几年 go 的生态慢慢好起来了

  • 其实 Java 自己也知道在云服务器上的劣势,GraalVM 也是 Oracle 的方案之一

    - Java 的优势还是在于第三方尤其是开源支持众多,无论接什么,都能用 Spring 糊上去。Spring 全家桶确实方便统一了开发链。当然,代价也是,这玩意儿可真胖啊。此外,JDK 上还有各种派生语言,如 Kotlin 、Groovy 、Jython

    - Go 的优势正好反过来。啥都能接,语法糖还不太多,框架都要自己去组合,还没有像 Spring 那样一统江山的玩意。就像当年一样,还要程序员 Struts + Hibernate 各种搭。

    - 长远更看好 Golang 的发展,但自己也很喜欢写 Kotlin

php 还是要内存 最少 nginx+cgi 得跑

对内存省着用的,多是小老板/潜在的小老板,因为心疼花他自己的钱买内存
大大咧咧地说内存不值钱的,多是牛马,因为内存是老板花钱买的,自己负责写 bug 把内存耗完就好了

难道没有遇到 phpcms 被挂马爆破的情况吗

go 做数据转换 有什么建议?使用了什么框架?

我这里的数据转换很简单,就是接收请求,然后调用新版本的服务,获取到返回数据之后再按照老版本的格式返回,请求量大是因为微信小程序端不升级了,一直在请求老接口

java 还有一个优势, 资料多.
不信你试一试找个 go 反射的问题问一问 openai , 看看是否能够回答正确, 别来喷子说不用反射.

我自部署了很多服务,主要就自己用,基本上不考虑 java ,就是因为很多 java 程序太吃内存了。

k8s + go 不知道多香了。

等以后 go 资料完善了, java 可能越来越难顶了.

当然有了,这不就体现了我的存在是非常重要的。(0v0)

go 里面谁写反射。。。

作为IT领域GO语言方面的专家,对于Golang(Go语言)的内存优势有着深入的理解。确实,Go语言的内存优势在部分场景下表现得比想象中更为显著。

Go语言采用了高效的垃圾回收机制(GC),这一机制在设计时就考虑到了低延迟和高吞吐量,能够有效管理内存,防止内存泄漏。它的并发GC使得垃圾回收对程序性能的影响最小化。

此外,Go语言在内存分配和回收方面也进行了优化,使得Go程序在运行时占用的内存更少,速度更快。通过逃逸分析技术,Go编译器能够在编译时优化内存分配,将生命周期较短的变量分配在栈上,从而减少堆内存的使用,进一步提高性能。

再者,Go语言提供了内存池(sync.Pool)结构体,用于对象的缓存和复用,从而减少内存分配和垃圾回收的开销。这在高并发和高性能要求的场景下尤为重要。

总的来说,Go语言通过其高效的垃圾回收机制、优化的内存分配和回收策略,以及内存池等机制,实现了出色的内存管理。这些优势使得Go语言在部分场景下能够表现出更高的性能和效率,成为高性能应用程序的首选语言之一。

回到顶部