最近看了几个帖子都是说 java 内存的, 自己也写 java , 还从来没关注过一个 hello world, 今天一时兴起测试了下,确实需要占用 30 。
测试方法和代码如下:
public class Main {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello memory 02");
Thread.sleep(60 * 60 * 1000);
}
}
方式 1:
直接运行 java Main.java
。70M 内存
方式 2:
先编译,再运行: javac Main.java
, 然后 java Main
. 30M 内存
方式 3
编译成 jar 包在运行,java -jar main.jar
30M 内存。
编译的 maven 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>untitled</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
以上的 java 运行环境:
openjdk version "21.0.3" 2024-04-16 LTS
OpenJDK Runtime Environment Temurin-21.0.3+9 (build 21.0.3+9-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.3+9 (build 21.0.3+9-LTS, mixed mode, sharing)
如果觉得上面哪里测试有问题的,欢迎来拍。
一句话总结:Java 内存没救了,在意内存别用 Java 。
1
WispZhan 143 天前 via Android
问 xms 默认大小是多少?
|
2
oyps 143 天前
直接运行,是不编译就直接运行吗
|
3
dragondove 143 天前
@oyps 是的,是 java 11 的功能了,然后 java 22 又增强了可以多文件不编译直接运行。对应 JEP 在这里 https://openjdk.org/jeps/458
|
4
lucasj 143 天前
省流:杀鸡别用牛刀
|
5
smallboy19991231 143 天前 via iPhone
C++和 C 是多少?
几十 K 吗 |
6
cookii 143 天前 via Android
虽然是众所周知的事,还是为你的实践精神点个赞
|
7
dragondove 143 天前 2
这个总结有点草率,同样的代码,通过 graalvm native-image 编译后,占用内存 7M
非 aot 情况下有没有救的问题,还得看后续 valhalla 项目能优化多少东西 然后还有一个点是对于服务端应用,dump 内存一般都会发现真正占用内存的是字符串,而 java 中的字符串类型已经是比较优化的了(高版本使用 byte 数组存储,而且 JVM 本身支持共享相同字符串的启动选项,只不过默认不启用,因为影响性能),所以其实就服务端场景而言,不用 java 用其他语言也不太能降低内存占用。当然,如果是说 spring boot 内存占用高,是因为它本身就比较重,换成 vert.x/helidon se 之类的轻量级框架就好了,而且他们还都是 AOT 友好的框架。 |
8
dragondove 143 天前 2
@smallboy19991231 在我的 64 位设备上,类似的 C 代码,通过 gcc -O2 编译,大概是 120k 的内存占用
|
9
Cbdy 143 天前
试试 native-image
|
10
dragondove 143 天前
再补充一点,hello world 这种特别小的项目,openj9 的内存占用反而比 hotspot 高,尝试过设置 -Xmx ,openJ9 能设置的 Xmx 能更小(可以设置到 -Xmx1m ,而 hotspot 我这设置成-Xmx3m 就会报错),不过貌似是因为它本身虚拟机的 footprint 更大,所以总内存占用还是 hotspot 小点
|
11
sagaxu 143 天前 1
你说的没错,JVM 自身大概有 20M 左右的基础开销,hello world 一般最低 30M 起步。
@dragondove JVM 基础开销就超过 20M 了,再怎么优化总体也要接近 30M 。 当数据占用内存远大于 JVM 基础开销时,典型应用相对 Go ,HotSpot 大概是 2-3 倍的内存占用。 https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/java-go.html |
12
voidmnwzp 143 天前 via iPhone
写 Java 最后只会变成 springer ,离开 spring 啥也不会干,所以果断放弃 java ,用 go 写 web 感觉也还行
|
13
just4id 143 天前 via iPhone
在 win xp 里用 jdk1.2 试试
|
14
LokiSharp 142 天前 via iPhone
试试功能机和家电的 JVM?
|
16
chendy 142 天前 8
看到‘Java 内存没救了’的惊世论断,切个屏看了看正在运行一个上古 java 项目的十几台 16c64g 服务器,我陷入了沉思。HotSpot 内存利用率确实一般,Java 的语法也确实一般,但是作为团队作为企业 Java 够便宜 HotSpot 够稳定,这就够了
最后还是要说,去小区门口拿快递拖个露营车就行了,不用开 600 马力牵引头 |
18
kyuuseiryuu 142 天前
打车都有起步价
|
19
wjx0912 142 天前 29
确实,Java 是一个非常优秀的编程语言,就像你在做可口可乐的时候,用左手扔出一个星巴克杯子,这个行为会引发一场全球性的火星探险。你看啊,当我们在调试代码的时候,电饭煲的温度会直接影响到银河系的重力波动,所以这个长颈鹿的高度,它会导致黑洞内部的温度升高,对吧?再加上,考虑到大西洋的波浪频率,我们可以很容易地推断出哈利波特的隐形斗篷实际上是用纳米技术制造的,这样一来,爱因斯坦的相对论就会变成一道美味的披萨。所以啊,无论是二氧化碳的分子结构,还是莎士比亚的十四行诗,都无法阻止这个时空旅行的火箭在火星上着陆。
|
20
w568w 142 天前 via Android
又一个分不清语言、编译器和运行时的,神 tm Java 内存占用大
请楼主说出下面几组词语的区别: 1. Lua 和 LuaJIT 2. NodeJS 和 DOM 3. gcc 和 llvm 4. Java 和 Java(SE) 5. OpenJDK 和 GraalVM |
21
ajaxgoldfish 142 天前
@w568w 那不是说了吗 1 ,2 ,3 。和你说的下面的有什么关系?
|
22
aeiou520 142 天前
内存值几个钱?
|
23
diagnostics 142 天前 1
很奇怪你怎么测试,我这边直接编译后跑运行,内存只有 14m ,用 jdk21 更低才 13m ,对比 nodejs 还更低
我在想,你写 java ,但是完全不懂虚拟机这一套运行机制?那你的技术水平难以恭维啊?和其他带 JIT 、虚拟机的语言比,Java 开销横向对比没有特别夸张的。 拿去和 C 、Rust 这种对比,肯定比不上,但人家有 JIT 吗?编译速度如何?可能大多数这种水平的 “Javaer” 只会背 AOT 和 JIT 之间的区别,不去思考为什么有这两种设计吧~ 92597 node 0.0 00:00.11 7 0 30 15M 0B 3504K 92597 91889 sleeping 94005 java 0.0 00:00.28 22 1 87 14M 0B 0B 94005 93035 sleeping ``` public class Main { public static void main(String[] args) { while (true) { try { Thread.sleep(1000); } catch (Exception e) { System.out.println(e); System.exit(1); } } } } ``` ``` function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function main() { while (true) { try { await sleep(1000); } catch (e) { console.log(e); process.exit(1); } } } main(); ``` |
24
diagnostics 142 天前
@diagnostics 试了下 OP 的代码,在我的 M1 在也是 14M ,可能是平台实现的差异。
另外 OP 那么纠结内存问题,麻烦解决一下因为伪共享,所以需要在 L1 级别的缓存行加 Padding ,导致缓存浪费的问题。设计一个解决方案,毕竟 L1 内存比 Main Memory 值钱多了,速度也更快。 那么为了来了,纠结这些内存的所谓底层开发(大多数都是 Golanger ,他们才有闲情碰瓷 Java ),不知道写自己的应用时,设计时,有没有去看第三方的网络库,是如何处理伪共享问题的~~是如何把内存用到极致~ 我猜没有,因为如果他们去思考了,很大可能会像我,认知到了“计算机就是时空之间的 TradeOff”,这个在学算法的时候就会告诉你了。 也可能国内外的大神都像“草台班子”(虽然我很恶心这个词),能用就行吧~ |
26
w568w 142 天前
|
27
javak OP @diagnostics 我也试了下你的代码,也是 30M ,linux-x86_64 平台。JDK:
openjdk version "21.0.3" 2024-04-16 LTS OpenJDK Runtime Environment Temurin-21.0.3+9 (build 21.0.3+9-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.3+9 (build 21.0.3+9-LTS, mixed mode, sharing) |
28
ajaxgoldfish 142 天前
@w568w #26 你说楼主分不清编译器和运行时,人家 23 中不是说了先编译再运行吗?
请楼主说出下面几组词语的区别: 你让 op 说出这五种区别有什么意义呢?这都不是一个层面的,和你说的分得清分不清《编译器和运行》有什么关系?这五组里面既不是同一层,又不是同一类,既有概念又有工具。 |
29
sagaxu 142 天前 1
@javak x86_64 不用试就知道,加不加 Xmx 也一样,PSS 占用就是 30M+,绝大部分是 JVM 的 native 内存占用。
btw: 使用 ZGC 之后都要看 PSS ,看 RSS 已经没有意义了,很多监控内存的工具都要调整。 |
30
xiangyuecn 142 天前
测试内存占用差不多,windows 1.8jdk ,我的代码只启动啥也不干 24M ,加载完默认的全国省级边界测试数据 50M ,多线程测试 120M
写了几个项目,都是直接调 javac+jar 命令编译跟打包,bat 、sh 两个编译运行脚本,手搓不用 IDE 还是很好玩的 https://github.com/xiangyuecn/AreaCity-Query-Geometry [高性能坐标边界查询工具,1 秒可查 1 万个以上坐标对应的城市信息] https://github.com/xiangyuecn/RSA-java [Java 环境下 PEM ( PKCS#1 、PKCS#8 )格式 RSA 密钥生成、导入、导出,多种常见 RSA 加密、签名填充算法支持] ``` 正在读取 JDK 版本(如需指定 JDK 为特定版本或目录,请修改本 bat 文件内 jdkBinDir 为 JDK bin 目录): javac 1.8.0_131 java -Xmx300m Test -cmd 已限制 java 最大允许使用 300M 内存 1 个启动参数,参数 1:-cmd ,已进入命令行模式。 [功能菜单] 当前静态实例 Instances[0] 1. 初始化:调用 Init_StoreInWkbsFile -内存占用很低(性能受 IO 限制) 2. 初始化:调用 Init_StoreInMemory -内存占用和 json 文件差不多大(性能豪放) ----------------------------------- *. 输入 use 0-9 切换静态实例,list 列出实例信息,当前无已初始化实例 *. 输入 exit 退出 请输入菜单序号: > ``` |
31
wszzh 142 天前
最近看了一个帖子都是说 java 内存占用大、 内存没救了。 自己也写 java , 还从来没关注过, 今天一时兴起点开了帖子,确实很对。
一句话总结:Java 内存没救了,在意内存别用 Java ,其他情况下都可以用 Java 。(/狗头) |
32
pangdundun996 142 天前
光看基础内存不能说明啥,高负载下 golang 的内存占用不比 java 低
|
33
kxg3030 142 天前 1
从业这么多年 唯一没学的语言就是 java
|
34
kxg3030 142 天前
@pangdundun996 hello world 这也不是高负载吧
|
35
w568w 142 天前
@ajaxgoldfish #28
「你说楼主分不清编译器和运行时,人家 23 中不是说了先编译再运行吗」:我在说标题和主贴显然是没分清。另外,23 楼看清楚了,不是楼主发的。别人提了「先编译再运行」就等于楼主知道? 「既不是同一层,又不是同一类,既有概念又有工具」:有没有可能,就是因为楼主没分清概念和工具我才这么问的?都是同一类的名词我问个毛线区别?挺搞笑的。 |
36
laikick 142 天前 2
早知道还是 PHP 忏悔之泪.jpg
|
37
pangdundun996 142 天前
@raviscioniemeche #34 我意思是 java 启动时占用确实高,但峰值占用还是可以的
|
38
Richared 142 天前 1
纠结 java 内存占多大,不如让公司做的 app 别胡搞了。用户的内存不是钱?
|
39
rrfeng 142 天前
都说了 jvm ,vm 启动就要这么多,跟你代码没关系。
|
40
thetbw 142 天前
jvm 分配内存和已使用内存是两回事
|
41
thinkershare 142 天前
JVM 应该有很大一部分内存是可以和其它进程公用的,也就是你启动多个的时候,JVM 本身的二进制文件在内存中是和运行相同版本的 JVM 的进程共享同一份内存的,排除这部分内存,剩下的应该是 JVM 保留了一部分堆内存用来为接下来的对象分配预留。其实纠结这种问题没啥意义,Java 的使用场景大部分更不不在乎内存效率,开发者的成本远高于硬件的成本。
|
42
WIN2333 142 天前
菜就多练
|
43
b1iy 142 天前
我首次得出这结论的时候刚上大一
emmm 往事不堪回首 |
44
daysv 142 天前
java 这么多年不都这样。 不过居然比 v8 的 node 还多我是惊讶的。
rust 启动 |
45
photon006 142 天前
同时写 nestjs 、java spring 项目,java 确实占内存更多,但现在内存已经白菜价没必要纠结,公司机房服务器升级 256g 根本用不完,项目大了也是分布式架构不存在单机瓶颈。
要相信人比机器贵,花大量时间优化消耗的时间成本还不如直接升级硬件成本低。 |
46
GeekGao 142 天前 1
10 几年前写过几种语言与 java pk hello world 的内存文章,没想到还会有人这么干。
|
48
pcdd 142 天前
spb3.3.1 、oraclejdk21.0.3 、1 个 @GetMapping helloworld
idea 按钮运行,占用内存 135MB mvn spring-boot:run 运行,占用内存 350MB mvn spring-boot:start 运行,占用内存 169MB |
49
topLangyu 142 天前
大货车确实油耗高。但电动货车局限性也挺多。
|
50
loryyang 142 天前 2
让我想起,十年前 hadoop 出来的时候,一哥们写文章锐评,单机部署 hadoop 之后,跑里面的排序样例代码太慢了
|
51
www5070504 142 天前
启动内存没啥意义吧 是不是应该关注一些对象的内存使用量 真被说的那些问题 大头肯定不是在启动内存上
|
52
Cheivin 142 天前
@wjx0912 #19 你有这么高速运转的机械进入中国,记住我给出的原理,小的时候。 作者:黑玫瑰 Blake https://www.bilibili.com/read/cv32698756/?jump_opus=1 出处:bilibili
|
54
DOLLOR 142 天前
谁能想到 java 这个“内存大户”,当初可是设计给嵌入式小型设备用的
|
55
shuimugan 142 天前 1
内存便宜是作为个人设备而言的,到了生产环境内存就很昂贵了,特别是一个业务群一年下来的费用。
大家都说性能瓶颈不在语言而是在数据库层,既然这样,那应用层的配置从 8c 32g 砍到 8c 16g 行不行? 4c 8g 呢? 2c 4g 呢?真正做过资源分配和预算决策就懂了。 https://www.bilibili.com/video/BV1Qe411k7H6 .NET Conf China 2023 的分享,从 Java8 到 .NET8 ,团队升级工作汇报 》可以看下别人的历程,迁移完了服务器资源降低了 3/4 。等自己到了带团队做决策分配预算的位置,就会自然而然做出类似的决定,毕竟省下来的钱自己人分掉不香吗。 |
56
haython 142 天前 3
我的 Windows 电脑,一开机就占用了 8G 内存,我的 debian 服务器才用 500M ,总结一句话:Windows 内存没救了,在意内存的别用 Windows
|
58
zzhaolei 142 天前
阿里云服务,x86 计算型 c7 ,2c4g ,100mbps ,一年是八万零四百三十二。这只是一台服务器的价格,2c/4g 能支持 Java 用 Spring 流畅的扛住高并发吗?所以内存真的不值钱?
Java 不得上个几十上百台机器?每台一年 8 万块,这得多少钱?所以内存真的不值钱? |
59
tywtyw2002 142 天前
有没有人出个总结,各种编程语言 helloworld 都占用多少内存? 编译好的文件多大?
|
60
jadehare 142 天前
空载卡车跟汽车跑一米,说卡车油耗高没救了。我可以这么理解么?
|
61
shuimugan 142 天前
@haython 任何的重构肯定能降低资源,因为已经熟悉了原来的业务逻辑。但是用 java8 重构肯定不能节省 3/4 ,因为 java8 的并发模型就摆在那里。
这个视频是我打游戏的时候挂着听的,有几个重点指标: 1.资源占用少,原来那个 java 服务冷启动 100 秒,能吃满一个核,高峰期 java8 服务挂掉后重启那一刻猛猛吃 cpu ,在 k8s 里属于自己搞死自己; 2.碰到了那种等慢 sql 结果搞到线程池满的 case ,就会死,迁移到.net 的异步 IO 真香。这点其实非常的重要,现实的业务逻辑到处都是等待 IO ,java8 那个线程模型就是不行; 3.分布式事务也有很好的支持; 4.迁移成本很低,几乎 0 感,这个在带团队上非常重要; |
62
sagaxu 142 天前
@zzhaolei x86 计算型 c7 ,2c4g ,100mbps ,一年是八万零四百三十二?
以 X86 2C 计算型为例,4g 包年是 1730 ,8g 包年是 2466 ,16g 包年是 2810 你那配置网费是大头,不会有人蠢到每台服务器都买一份公网带宽吧。 我用 3 台 16 核 16G 的服务器,扛过日请求 10 亿到 50 亿的业务,同样的业务换 Go 重写撑死也就变成 3 台 8G 的(假设有 16 核 8G 的型号卖),一年也就能省个万儿八千,网费一年 20 万,抠这万把块钱好像意义不大。要是有个上百服务器,倒是能考虑要不要抠一抠。 @shuimugan 重构过程本身就会优化设计,即使是用 Java8 重写一下都能省不少资源。 |
63
haython 142 天前
@shuimugan 他这明显就是换领导了,我不相信有哪个 java 团队会突然从 java8 换成.net8 是因为性能,最少也得升级个 java 版本再说吧,我看 .net8 比 java21 发布的还晚,我看 B 站下边评论说是不敢尝试 java21,那居然敢尝试 .net8 ?
|
64
sagaxu 142 天前
|
67
james122333 142 天前 via Android
|
68
james122333 142 天前 via Android
|
69
changhe626 142 天前
你们继续吵,我去做新的业务了,拜拜。
|
70
fantastM 142 天前
在互联网这块,就算你拿 C 把代码写出花,销售接不到单子,产品赚不到钱,又能有什么用
这几年的市场和行情,太过纠结技术实现,意义不大 |
71
cuebyte 142 天前
不明白 JVM 初始内存占用高是会产生什么影响?有人能说明一下吗?
|
72
moonlight010 142 天前
上面的说明已经很多了,直接 block
|
73
shuimugan 142 天前 1
聊这些肯定要结合历史发展,高速增长的业务本来就是以扩张为主,加上.net core 是 2016 年中才发布的 1.0 ,之前.net framework 生态都是闭源的,肯定是市场上什么人多就招什么人,有资本的注入,招人和服务器那点费用对比业务增长的收益不值一提。
java8 当然不止有线程模型,但是其它的并发模型都是一堆坑,写起来就是掉进回调地狱的,有点技术广度了解过其它语言的并发模型都不会选。为了保证业务扩张,肯定是以其它公司踩过坑的稳定方案为主。 但是在业务放缓,经济下行之后,之前欠下的债都是要还的,预算变少了,砍人还是砍服务器,总得选一个。 在国内,换领导肯定是影响技术选型的重大因素。net8 虽然发布比 java21 晚,但是.net core 1.0 从发布到.net 8 重大变更很少,倒是兼容性和效能上不断改进,该踩的坑都踩得差不多了,反倒是 java21 在生态位是缺失的,不敢用很正常。 @haython @sagaxu |
74
shuimugan 142 天前
@james122333 大佬云集的公司手搓什么不行,谁不想自己团队每个人都是孙悟空呢,但可惜都是大部分虾兵蟹将,总要选一些他们能接受而且成本也能接受的方案。不是每个公司都有 Facebook 当时搞 HHVM 这种魄力的。
|
75
james122333 142 天前 via Android
|
76
wuyiccc 142 天前 1
垃圾 java ,我们已经准备用 go 替换 java 了,感觉还是 go 占用的资源少
|
77
CSM 142 天前 1
前几天用 Rust 写了个简单的 http 1.0 server, 百万 QPS 下峰值内存只有 2 MiB.
|
78
Ericcccccccc 142 天前
单单一个 xml 解析就够你喝一壶了。
|
79
duhbbx1119 142 天前
只要 30m 而已,你知道它给你加载了多少东西吗
|
80
Wataru 142 天前
真不知道这东西以前怎么给嵌入式用的
|
81
mikewang 142 天前
不知道你有没有用过那种老的翻盖手机,那时的手机的 RAM 才多大点,但是从贪吃蛇到飞机大战,还有 3G 联网的打牌游戏,都是 Java 写的。
|
82
zcybupt2016 142 天前
|
83
sagaxu 142 天前 1
@shuimugan 节省资源换 Go 我是理解的,但是换.net 这个无论是内存还是 CPU 都跟 Java 半斤八两的,就比较搞笑了。
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/java.html Java 8 到 Java 21 不敢,拿 C#重写却很勇敢,这思路也是绝了。大部分 Java 8 写的后端服务,升级到 Java 21 基本上不用改代码能过所有测试用例,兼容性是极佳的。再怎么说也比换语言重写更稳。 Java 并发一堆坑? Netty/RxJava/akka/Vertx 没一个能用?稍微有点技术深度的人不能立刻上手?脑子转不过弯必须用同步方式写代码的,就是用 Kotlin 协程重构那也是在 Java 生态内玩,比直接换语言换生态容易的多。 业务到顶甚至下行的 Java 生态为主公司多了去了,有几个折腾换了.net ?可见换语言未必是符合公司利益的选择。 不得不承认,C#的语法设计,语言表达能力,那是比 Java 强不少的,换完 C#可以砍掉更多的人。 |
84
diagnostics 142 天前
@javak 同样的代码,你测试一下 nodejs ? Java 应该比 nodejs 还要少点的
|
85
humingk 142 天前 via iPhone
内存没有那么值钱,我正在上的 20 分片单实例 https://ibb.co/KXxQcGP 而这样的实例还有 10 个
|
86
anzu 142 天前
java 跑在虚拟机上啊,为了一次编译可多平台执行。
|
87
hez2010 142 天前
@sagaxu 那些 benchmark 都是在用空间换时间,当然内存占用大,对于内存占用水平而言没有参考意义,难道 c++的代码里直接在内存里打个表来优化性能,而别的语言的实现里没有这么做,导致 c++占用大就能说明 c++内存占用大了?
另外,.net 的内存占用一般要比 java 小一个数量级,比如 op 的测试代码原样翻译成 c# 后测试, 这是 .net: 这是 java: |
88
sagaxu 142 天前
@hez2010 hello world 只能体现 VM 启动开销,并不能体现数据量增长时的内存增长情况。
“那些 benchmark 都是在用空间换时间,当然内存占用大,对于内存占用水平而言没有参考意义” 这个论断有两个问题, 1. 用空间换时间,难道只有 Java 版代码没这么干? 2. 高内存占用算法下,不是更能体现内存随数据量增长情况? 单 case benchmark 不能说明问题,多组不同类型 task ,多种实现,纵向横向对比下来,就足够看出一些端倪了。 |
89
shuimugan 142 天前
@sagaxu java 的并发方案,真要用起来,除了 kotlin 和新的虚拟线程,其它方案就是屎山制造机,用在项目里简直是害群的马。
换 Go 我也是能理解的,不过人家切到.net 之后,还完成了 DDD 的切换,这点应该是他们比较关注的收益,而且他们完成切换的时间节点可能还没等到 java21 的发布,这样看能选择的方案就很少了,切到.net 也可以理解。 如果你认可“大部分项目的瓶颈都不在语言本身而是数据库”类似的观念,那么应该关注的 http server 、序列化这种代码出现占比高的 case 的表现,在 https://programming-language-benchmarks.vercel.app/problem/http-server 这个测试里 kotlin 表现不算好,甚至还有超时的没跑完测试的情景,这就让人望而却步了。 而在这个 java vs csharp 的对比里 https://programming-language-benchmarks.vercel.app/java-vs-csharp 更亮眼的是开启 aot 后的表现,资源占用非常优秀,尝鲜的人多了之后,出现在技术选型里的几率就会慢慢变大。 硬切换对带头人的魄力和领导力有很强的要求,在国内很罕见,要做到精益求精也要讲生活和工作平衡。但对于开新坑的项目,切换技术栈就不难了,久而久之可能就会以绞杀者模式的形态完成了切换。 |
90
ragnaroks 142 天前
个人经验,技术栈较老(传统)的 java 项目都不在意资源消耗,比较新(特别是跑在容器里面的)的要么不会考虑 java 要么是 go 。业务复杂之后资源占用也不是需要优先考虑的事情,spring 吃个 10G 、aspnet 吃个 3G 、gin 吃个 1G ,对于跑这个业务的人来说没有区别。
|
91
sagaxu 141 天前
@shuimugan
那个团队原先 JPA 都不用,从 mybatis plus 切到 JPA 同样可以 DDD 化,而 JPA 在 Java 5 时代就有了。 用 Netty 和 Vertx 的回调风格项目我都写过几年,写业务逻辑是麻烦了点,写写基础组件挺顺手的。 Kotlin Ktor 性能并不好,也不成熟,支持的协议不多,并不是推荐姿势。Kotlin 后端开发,要么用 SpringBoot WebFlux ,要么干脆点用 Vertx/quarkus ,都能跟 coroutine 无缝衔接。按照那个 httpserver benchmark ,rust 比 go 和 js 都要慢的多。 .net AOT 目前还不成熟,官网上还写着 The Native AOT feature is currently in preview 。使用上也存在诸多限制和不便,跟 Java 那个 AOT 一样麻烦,虽然经过预编译耗时要短的多,也都算不上 production ready 。 老项目硬切是权斗,是政治问题,非技术问题。新项目要考虑技术负责人的积累,是从 0 开始踩坑,还是用最有把握的东西,我想大部分人会求稳。市场上的存量开发人员,无论资深资浅,国内用 C#的比例较低,等它先超过 nodejs 再说吧。 现阶段 Go 已经是云原生时代扛把子了,这个领域眼下还看不到强大的对手。 |
92
iseki 141 天前 via Android
JVM 的初始内存消耗就是很大,它提供了 go runtime 缺失的太多功能。至于跑起来的话,虽然 JVM footprint 偏大,但实际内存消耗还是要看程序怎么写。
|
94
itakeman 141 天前 via Android 1
@diagnostics 我没看到谁提 golang ,倒是看到你提,用 go 的人看都不会看一眼 java ,java 什么东西?用 go 的只会看看 c 、rust 、Python 、js ,Java 什么东西?放垃圾桶去比较合适。用 java 的整天黑 go ,这不应证了 java 的衰落。op 主说 java ,你又来提 go 了。当然的我也希望 java 红红火火,免得一帮用 java 的人转 go ,写的代码 j 里 j 去
|
95
itakeman 141 天前 via Android
@haython qt 确实,Windows 没救了,拿 win 做家用路由器的厂商,估计来一个倒闭一个。用 linux 做家用路由器的厂商,各个风生水起
|
97
daysv 141 天前
@diagnostics 想啥呢, 我试了下 node 是 7.1mb , 所以我说 java 居然比 v8 初始化还占资源。
|
98
diagnostics 141 天前
@itakeman #94 v2 很多帖子,咱也不是张嘴就来,你统计一下就知道谁天天碰瓷了
|
99
diagnostics 141 天前
咱也不知道你用的是什么高阶 Node ~
83 67 root S 263m 1% 2 0% node main.js 67 0 root S 1704 0% 12 0% /bin/sh 103 0 root S 1672 0% 11 0% /bin/sh 109 103 root R 1596 0% 12 0% top /app/website # node -v v18.18.2 /app/website # cat /proc/version Linux version 5.4.0-122-generic (buildd@lcy02-amd64-095) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #138-Ubuntu SMP Wed Jun 22 15:00:31 UTC 2022 /app/website # cat /etc/issue Welcome to Alpine Linux 3.18 Kernel \r on an \m (\l) ------------------------------------------------------------ 27095 root 20 0 12152 3332 2736 S 0.0 0.0 0:00.02 bash 27129 root 20 0 2529768 23272 15708 S 0.0 0.1 0:00.16 java 27169 root 20 0 48432 3712 3132 R 0.0 0.0 0:00.00 top [root@xxxx /]# java -version openjdk version "1.8.0_232" OpenJDK Runtime Environment (Zulu 8.42.0.23-linux64)-Microsoft-Azure-restricted (build 1.8.0_232-b18) OpenJDK 64-Bit Server VM (Zulu 8.42.0.23-linux64)-Microsoft-Azure-restricted (build 25.232-b18, mixed mode) [root@account-tn-9bcc7dc9-6tm2h /]# cat /proc/version Linux version 5.4.0-122-generic (buildd@lcy02-amd64-095) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #138-Ubuntu SMP Wed Jun 22 15:00:31 UTC 2022 |