为何 Java 内存占用比.Net 内存占用高这么多?

2020-09-02 22:33:18 +08:00
 crclz

无用户访问情况下,执行docker stats命令,发现如下数据:

容器 1,.Net Core,基于 alpine 镜像,内存占用 40.65MiB
容器 2,.Net Core,基于 debian 镜像,内存占用 36.75MiB
容器 3,spring boot,基于 j9 默认 tag,内存占用 529.1MiB

容器 4,mysql,默认 tag 镜像,内存占用: 372.2MiB
容器 5,postgres,基于 alpine 镜像,内存占用:5.504MiB

为什么 java vs .net ,postgres vs mysql,内存占用会出现如此大的差距?

注:Java 项目和.net 项目的规模差不多。

11660 次点击
所在节点    Java
99 条回复
fallinlovewith
2020-09-03 11:25:20 +08:00
@gz911122 小声点,不要告诉他是 C++搞的
mosliu
2020-09-03 11:26:34 +08:00
拿 .net Core 和 springboot 对比合适么?
一个是 framework 一个是 JVM 上的综合性框架。。。。
spring boot 一整套东西下来 500M 以上内存正常
比较 spring.net 试试
或者自己写个小程序试试
lewis89
2020-09-03 11:34:22 +08:00
@abcbuzhiming #39 关键活动时刻宕机 1 一小时,少赚 64 万算多吗?我们接了京东的以旧换新,搞特价活动的时候,一个小时几十万的订单就眨眨眼的事情,而且出事情了 还要影响京东那边下单流程用户的体验。
lewis89
2020-09-03 11:35:33 +08:00
@abcbuzhiming #39 我们阿里云一年要用几百万,加内存这点钱真的不算个事
sagaxu
2020-09-03 11:37:09 +08:00
@momowei 同规模服务,Java 大致会消耗 2 到 3 倍于 Go 的内存,小公司业务体量小,撑死能省几十个 G 内存,人再便宜,一天工资至少能买个 10G
quan01994
2020-09-03 11:37:10 +08:00
@abcbuzhiming 你要这么认为我也没有办法。我做 .net 开发的。我认为 core clr 只是个运行时而已 ,就像 nodejs 。
fengjianxinghun
2020-09-03 11:39:49 +08:00
@quan01994 同一个原理,解释执行或者 jit,只要不是直接编译成机器码的都是脚本虚拟机,不能 jvm 叫了个 vm 就区别对待了。 只有 go 这种编译成机器码还有运行时的才能叫带一个运行时。
lewis89
2020-09-03 11:41:45 +08:00
@abcbuzhiming #39 程序员一个月工资 2 万 折合公司成本 4 万 按你的算法买 1 个 t 的内存不算事情吧,我们有大概 100 来个微服务服务,每个服务可以多用 10 个 G 的内存,java 虚拟机占的这点内存钱 就是个毛毛雨,任何时候折腾技术来节省硬件的钱都是傻逼行为,除非你的量级大到 facebook google 这种程度,投入的技术研发成本最终确实能省不少钱,但实际上对于这种级别的公司,他们技术搞这个纯粹就是为了折腾玩票,毕竟宕机的成本都是公司在承担,你让他们研发拿工资收入去赔,你认为他们赔得起吗?
wysnylc
2020-09-03 11:43:21 +08:00
@lewis89 #48 说得对,Java 的开发成本可比.Net 低多了
Mithril
2020-09-03 11:45:42 +08:00
@quan01994 V8 哭晕在厕所
Mithril
2020-09-03 11:46:46 +08:00
@wysnylc 确实是啊,人多便宜。
abcbuzhiming
2020-09-03 11:48:52 +08:00
@lewis89 我前面已经说了,吹牛逼没事,我也认为你吹的是真的,但是麻烦“不要把吹牛逼里的事情当成普遍现象”,请接点地气,关注一下更现实层面上的东西,否则吹牛逼就是单纯的炫富,一点意义都没有


@sagaxu 你能不能提供详细一点你们的测试记录? 2 到 3 倍这个记录和我们测试的结果差的很远,我们的测试时在大部分 web 服务里,同样的负载 Go 和 Java 的内存对比能差到接近 10 倍,你们的这个 2 到 3 倍是什么类型的服务?

另外说一下,养自己开发团队的商业公司其实真是只有一小撮,很多公司都是运营型公司,不养人。这类公司对硬件成本极其敏感。就算在养人的那批公司里,java 和 go 的人工成本并没有差到哪里去。但是硬件成本的差别是真实存在的。

我还是那句话,Go 如果不是靠资源占用的话,绝无可能在 Java 和 PHP 的夹缝中脱颖而出的。net core 其实就属于虽然有进步,但是没有量变到达质变,所以仍然在夹缝中生存的典型。Go 能脱颖而出,已经说明了很多事情,现实总比理论上的对比更有说服力


@quan01994 CLR 并不是单纯运行时,只是微软不喜欢用 虚拟机 这个称呼而已
abcbuzhiming
2020-09-03 11:55:51 +08:00
@lewis89 我说你这人是不是大公司待久了,眼光已经高到那美克星上去了?

2w 的月工资的程序员,我建议你去查一下统计数据,什么级别的公司,能开得起 2w 元的薪水。这样的公司占公司总比有多少?程序员总数又有多少?大量的程序员拿的什么级别的薪水,做着什么级别的事情?

BAT 级别的企业有几个啊? BAT 之下的次级规模的企业,又有几个啊?全国注册公司又有多少个?


当你在大城市的超级企业里敲代码的时候,眼光当然不会往下看,然而现实里的信息化,是要解决很多三线城市之下甚至是县城乡村里的很多欠信息发达企业的信息化问题。他们的数量远远超过你的想象。

你很牛逼,很高端,但是你只是一小撮。希望你开阔一下眼界,不要眼睛只往头顶上看。我言尽于此。不再回复你的贴
chenqh
2020-09-03 12:07:53 +08:00
@abcbuzhiming 2-3 线城市和 golang? golang 现在工作不都是几种在一线城市?
Resource
2020-09-03 12:14:34 +08:00
你用 spring 运行个 hello world 也会占用这么多内存的,笑
john22eclipse
2020-09-03 12:15:02 +08:00
国内 java 人力成本比.net 高,所以.net 都转投 java 了
sagaxu
2020-09-03 12:18:50 +08:00
@abcbuzhiming 你可以试着把 Xmx 调低一些,比如从 Go 的 10 倍改成 5 倍,多试几次找到一个平衡的值。我这边业务数据本身比较高,框架开销占比就比较低了,所以数值是 2-3 倍,如果业务数据很小,那 10 倍也是正常的,Java 主流框架开销极大,web 在调用到你的 handler 之前,少说已经调用了 30 个以上方法了。springboot 的基础内存占用大概几十到上百 M,这些内存不会随业务数据增长而增长。

实际上转 Go 的主力是 PHP,Java 转 Go 极少,PHP 转 Java 的倒不少。Go 比 Java 内存有优势,但仅凭这一项是不够有吸引力的。
zion03
2020-09-03 12:20:59 +08:00
.Net Core 比较新,技术包袱少,优化这一块做的挺好的,老外有不少性能方面的测评能证实这一点。
wysnylc
2020-09-03 12:21:40 +08:00
@sagaxu #57 王垠 14 年对 Go 的评价:http://www.yinwang.org/blog-cn/2014/04/18/golang 在今天我看来依旧不过时
abcbuzhiming
2020-09-03 12:51:38 +08:00
@chenqh 因为在你们眼里,很多搬砖工作都不能叫工作的,就像二三线有很多 PHP 公司一样,Go 现在在小地方扩散的速度不慢,主要原因是 Go 确实填补了长久以来的这个资源占用痛点,尤其是二三线普遍只有大城市腰斩甚至三分之一薪水的前提下,人确实很便宜,Go 的培养成本也没多高,真没比 php 高到哪里。
相反,一线大城市长久以来的基础设施积累(历史包袱),使他们换 Go 的需求倒一点都不迫切。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX