为何 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 项目的规模差不多。

11637 次点击
所在节点    Java
99 条回复
gz911122
2020-09-03 10:16:46 +08:00
@passerbytiny

(#15 引用)mysql 是 java 开发的,

真是啥人都敢发言啊
gz911122
2020-09-03 10:31:46 +08:00
@raptor
咨询一下, 为什么 pg 内存占用小这么多啊?
est
2020-09-03 10:35:05 +08:00
@momocraft 这个问题我最近确认过。。pg 的 binary 就 6M 大小。我还是装了插件的。然后没别的什么依赖。拍一个配置上去就能跑。
wysnylc
2020-09-03 10:38:13 +08:00
空间换时间,只谈内存不管功能和开发效率就是扯淡
shyling
2020-09-03 10:43:11 +08:00
因为 jvm 需要连续的内存空间,启动的时候就要指定(或者默认值) -Xmx,CLR 的堆是分段的,不需要全部都连续,就可以按需去跟 os 申请。。。
另外 java 占 os 那么多内存也不一定真的全都被用户代码用到了,还是要看 jmap 结果
guanhui07
2020-09-03 10:43:18 +08:00
spring jvm 就要这么多 正常
abcbuzhiming
2020-09-03 10:47:45 +08:00
@soji18 Oracle JDK 一个德行,我现在就在用
PDX
2020-09-03 10:49:15 +08:00
spring 就是太臃肿了才这样
abcbuzhiming
2020-09-03 10:49:33 +08:00
@kanepan19 内存是白菜价的话 docker 和 k8s 就不会诞生,GO 这东西也火不起来。作为服务器,资源永远都是不够的
Torpedo
2020-09-03 10:49:41 +08:00
这种比较,不要看初始,关键要看搭一个项目的。
虽然可能你搭了一个项目,还是 java 占内存多。
securityCoding
2020-09-03 10:52:23 +08:00
@guanhui07 spring 512m 起步是基本操作,很烦,难怪那么多公司转 go
FreeEx
2020-09-03 10:52:56 +08:00
这样比较是没有意义的,建议整个简单的 CRUD 去跑性能测试再看内存消耗。
lewis89
2020-09-03 10:53:26 +08:00
老板挥手给你来了 20T 内存,这点内存不就是钱吗抵不上业务宕机一个小时的钱。
Rwing
2020-09-03 10:54:59 +08:00
java 占内存多这不是常识么。。。尤其再加上 spring 这怪兽
更多 benchmark,可以看这里
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/csharp.html
quan01994
2020-09-03 11:09:30 +08:00
Java 是虚拟机,而 .net 只是 运行时 ,两个有本质的区别。
momowei
2020-09-03 11:14:16 +08:00
我觉得内存占用对一些创业公司来说还是挺关键的,比说什么人比机器贵了,事实就是 java 和 php 转 go 并不难。
现在云服务器高一点配置其实挺贵的,如果可以用最少的机器配置获取最大的流量性能,你比别人的优势就很大了,说个很简单的,如果你是一个最普通的小程序创业者,不管是做 saas 还是什么,我一台 2 核心 4g 的服务器可以部署至少 20 个 go 中小应用了把。java 恐怕 3 个顶天了,想想这中间的成本差距把,别说什么人比机器贵,那是不差钱的大公司,小公司机器比人贵
chenqh
2020-09-03 11:16:04 +08:00
@momowei 你有那么多应用?
abcbuzhiming
2020-09-03 11:16:53 +08:00
@FreeEx 朋友,java spring 技术栈就是占内存,类似问题我以前也问过

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

后来我自己反复测试过,java 的 JVM,在资源占用这个问题上就是不如后来者 .net framework 的 CLR (更别说 dotnet core 又再次重新设计了一遍虚拟机),我觉得这真的是后发优势;比根本没有虚拟机的 Go runtime 更是比不过。而且 Spring 这个东西,本质是为开发效率考虑的,设计的大而全,内部有很多的安全机制转换,线程,缓冲池。就是个内存黑洞,其实 spring 这个东西,发展到今天,颇有点当年 Spring 之父 Rod Johnson 当年写战斗檄文批判 JavaEE 大而臃肿 一样,走了个历史轮回,我现在觉得 Spring 也有点大而臃肿了。要接太多的第三方,就要考虑太多的可能性,层层接口抽象之下,Spring 本身成了一个巨石应用,居然得改用 Gradle 来构建才能满足这个巨石应用的构建需求。我们拿着 spring 写各种早就被分而治之的小型服务后台,确实是拿着高射炮打蚊子。也难怪 Go 能在 Java 和 PHP 的夹缝里起来
abcbuzhiming
2020-09-03 11:23:54 +08:00
@quan01994 什么?.net 跑起来没有虚拟机?你说 JVM 和 CLR 的设计区别很大我认同,但是你说.net 的运行时根本不是虚拟机,这个我就完全不能同意了


@lewis89 20T 内存的价格按现在 500 元能买 16G 算,是 64w 元,一个小时能赚 64w 的公司,是什么级别的公司?有多少人能遇得上?吹牛逼不是不可以,但是把吹牛逼的事情当普遍现象,我觉得很无聊。现实就是绝大部分公司,对硬件价格都很敏感
sagaxu
2020-09-03 11:25:11 +08:00
@shyling 连续的是虚拟地址空间,不用不会产生开销

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

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

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

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

© 2021 V2EX