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

12832 次点击
所在节点    Java
99 条回复
chihiro2014
2020-09-03 16:00:03 +08:00
@wysnylc 这种都属于弃坑状态了
122006
2020-09-03 16:20:04 +08:00
都花了那么久人力开发的服务,也就多花了几百兆内存。哪个公司真的花不起?
早几天开发完成节约的成本比这高多了
tairan2006
2020-09-03 17:38:34 +08:00
@chihiro2014 netty 不是被 goroutine 锤的么…go 要 netty 有个锤子用啊=_=
gangsta
2020-09-03 18:19:34 +08:00
楼上这么多回复, 并没有见到几条回答直接楼主提问的, 一言不合就语言鄙视链, 还有人说 Spring Boot 写个 hello world 也占几百兆内存的...
如果你是单机开发, 那么即使在内存和硬件如此便宜的今天, 这种 performance tuning(不管是代码层面还是软件架构层面)也是有意义的, 至少通过这个过程可以学习很多内存管理和线程调度的知识. 另外, 一个单 class Spring Boot 的内存占用就是几十 M, Spring 官博有写: https://spring.io/blog/2015/12/10/spring-boot-memory-performance (Do Nothing Spring Boot App)
chihiro2014
2020-09-03 18:45:14 +08:00
@tairan2006 啥,goroutine 不就是 Java 中的单线程线程池么。有啥的
nortonlai
2020-09-03 19:12:36 +08:00
@KENNHI 真的吗? springboot 我生产 50m 都跑的好好的,怎么就动不动几百了
tairan2006
2020-09-03 20:28:56 +08:00
@chihiro2014 老弟你是真不懂啊…自己去谷歌吧,从 netty 转向 go 之后,写网络应用我再也没加过班了,早学早摸鱼。
chihiro2014
2020-09-03 21:49:35 +08:00
@tairan2006 并不觉得 go 有多么好
u823tg
2020-09-03 22:34:12 +08:00
@chihiro2014 #88 go 的确不是多么好,但是省时间效率还不错。
gaius
2020-09-04 01:18:08 +08:00
-xmx120m 不就完事了
KENNHI
2020-09-04 08:42:18 +08:00
@nortonlai 一个简单的博客程序跑起来吃 500M,可能是我的问题吧
都说了懒得调,jvm 调优在我这算是高级技术了,我是真小白。helloworld 我瞎说的
另外提一下,跑 Java 的公司真在乎几百 M 内存?几十 G 都不够了自然会请人来调优的
chengquan17
2020-09-04 09:33:21 +08:00
@fallinlovewith 被你笑死了
EscYezi
2020-09-04 10:47:55 +08:00
要不要试试 quarkus ?
raptor
2020-09-04 11:40:23 +08:00
@gz911122 二者设计思路的不同吧。MySQL 的 MyISAM 的内存占用也比较小(但还是不如 PG ),但是功能就比 InnoDB 差太多了。
troywinter
2020-09-04 12:49:22 +08:00
你把 CLR 和 java 的内存 allocation 速度做个对比,再把 java1.0 的代码和.net 1.0 的代码跑在最新版的 java 和.net core 对比一下性能
troywinter
2020-09-04 12:51:28 +08:00
charlie21
2020-09-04 21:54:15 +08:00
二三线城市没有 golang
forgottencoast
2020-09-15 22:53:27 +08:00
@quan01994 #46
@iamverylovely #67
@no1xsyzy #79
The Common Language Runtime (CLR), the virtual machine component of Microsoft .NET framework, manages the execution of .NET programs.
CLR implements the Virtual Execution System (VES) as defined in the Common Language Infrastructure (CLI) standard, initially developed by Microsoft itself. A public standard defines the Common Language Infrastructure specification.
With Microsoft's move to .NET Core, the CLI VES implementation is known as CoreCLR instead of CLR.
https://en.wikipedia.org/wiki/Common_Language_Runtime

A Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode.
https://en.wikipedia.org/wiki/Java_virtual_machine
no1xsyzy
2020-09-20 12:29:14 +08:00
@forgottencoast 问题是形而上的 “虚拟机” 概念是什么意思
形而下地说,JVM 和 CLR 的工作方式确实显著地不同。CLR 在加载时整体 JIT,JVM 是之后才引入的(基于热点还是缓存的?) JIT 。

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

https://ex.noerr.eu.org/t/703698

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

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

© 2021 V2EX