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

12821 次点击
所在节点    Java
99 条回复
chenqh
2020-09-03 12:57:57 +08:00
@abcbuzhiming golang 的工作基本都集中在一线,2-3 线基本不用还说 golang 扩散不慢? 2-3 线新公司可比一线少多了,
也就是说 2-3 线推广 go,以为着用 golang 替代现有的技术栈? 说句不好听的?别人凭什么从 php 转 golang? 工资高? 坑多?替换技术栈不会出现问题? 更不要将内存占用和打工的有什么关系?
TypeError
2020-09-03 13:02:04 +08:00
编程语言 Web 开发还有一大堆个人开发者、小初创和站长呢,
反正我个人项目肯定不会考虑 Java,512M 的 VPS 可以跑 go 写的 v2ray + Web 服务 + telegram 机器人, 内存还有一半,
换 Java 不轻轻松松 OOM
nicevar
2020-09-03 13:19:25 +08:00
@abcbuzhiming 现状就是很多三线城市 go 根本不好招人,招的人跑了接盘的就更难招,在这些城市目前来说 go 还不如 php 来的实在,这个你看这些城市的招聘职位就知道了,比如南方某个省整个省才 10 来个 go 招聘
cyspy
2020-09-03 13:28:45 +08:00
go 的内存胜在栈上分配,数据密集型的吞吐量打不过 jvm
KaynW
2020-09-03 14:18:27 +08:00
@passerbytiny MySQL: 原来我是用 JAVA 开发的
wysnylc
2020-09-03 14:18:47 +08:00
@cyspy #64 明白人,go 在密集型 gc 下性能巨差
iamverylovely
2020-09-03 14:37:08 +08:00
@abcbuzhiming 醒醒,.net clr 真不是你的虚拟机!
iamverylovely
2020-09-03 14:44:18 +08:00
@abcbuzhiming 补充一下吧,我对这东西的了解也有限,最简单的是项目启动了看任务管理器,java 的项目吧 java 进程结束,项目挂掉,.net core 项目会有一个单独的进程,而不是运行在一个.net core 的相关 exe 上面。
lbp0200
2020-09-03 14:44:42 +08:00
换个 JDK 呢?比如 eclipse 版本的 JDK
chengxiao
2020-09-03 14:48:56 +08:00
你看动不动就要上 32G 内存当开发机的 都是 java....
chenqh
2020-09-03 14:55:32 +08:00
@chengxiao 那 16G 的呢?
fengjianxinghun
2020-09-03 15:06:22 +08:00
@iamverylovely 这有啥关系。android 的 java 也是一个进程一个 DalvikVM,策略不同而已。
Mithril
2020-09-03 15:08:31 +08:00
@chenqh 16G 的是贫穷的 Java 程序员。。。
Mithril
2020-09-03 15:09:25 +08:00
@iamverylovely 醒醒。。是不是虚拟机跟有没有独立进程没有半毛钱关系。。。
KENNHI
2020-09-03 15:11:29 +08:00
Spring Boot 就是要吃内存的。就算你只写个 hello world,一样要吃你几百兆内存。
MySQL 也一样,不说什么项目大小了,这东西光启动也得吃个上百兆内存。
理由不知道,反正我 Linux 裸机跑就是这样的。调优方法什么的好像很多,但我懒,能动就行了。
iamverylovely
2020-09-03 15:14:15 +08:00
@Mithril
@fengjianxinghun 哦,我说了,了解有限,我也只是很久之前学.net 时在某些论坛上大致看了下。
xkeyideal
2020-09-03 15:20:25 +08:00
Java 是内存利用率最高的语言,没有之一
chihiro2014
2020-09-03 15:27:51 +08:00
Java 有 netty,Go 有么 233
no1xsyzy
2020-09-03 15:30:10 +08:00
@abcbuzhiming https://stackoverflow.com/a/1625090
.net 虽然分发中间码,但是启动时一次性 JIT 整个程序到内存,在整个进程运行过程中始终是 native 的。

不太确定语言实现的 “虚拟机” 定义是什么。
想到的可能几个方面:
1. 是否使用中间码
2. 是否在运行时强制基本越界判断 /避免
3. 是否使用操作系统提供的栈
wysnylc
2020-09-03 15:48:39 +08:00

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

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

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

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

© 2021 V2EX