V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
javak
V2EX  ›  Java

Java hello world 确实就要占用 30M

  •  5
     
  •   javak · 63 天前 · 11398 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看了几个帖子都是说 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 。

    113 条回复    2024-08-29 20:02:00 +08:00
    1  2  
    WispZhan
        1
    WispZhan  
       63 天前 via Android
    问 xms 默认大小是多少?
    oyps
        2
    oyps  
       63 天前
    直接运行,是不编译就直接运行吗
    dragondove
        3
    dragondove  
       63 天前
    @oyps 是的,是 java 11 的功能了,然后 java 22 又增强了可以多文件不编译直接运行。对应 JEP 在这里 https://openjdk.org/jeps/458
    lucasj
        4
    lucasj  
       63 天前
    省流:杀鸡别用牛刀
    smallboy19991231
        5
    smallboy19991231  
       63 天前 via iPhone
    C++和 C 是多少?
    几十 K 吗
    cookii
        6
    cookii  
       63 天前 via Android
    虽然是众所周知的事,还是为你的实践精神点个赞
    dragondove
        7
    dragondove  
       63 天前   ❤️ 2
    这个总结有点草率,同样的代码,通过 graalvm native-image 编译后,占用内存 7M
    非 aot 情况下有没有救的问题,还得看后续 valhalla 项目能优化多少东西
    然后还有一个点是对于服务端应用,dump 内存一般都会发现真正占用内存的是字符串,而 java 中的字符串类型已经是比较优化的了(高版本使用 byte 数组存储,而且 JVM 本身支持共享相同字符串的启动选项,只不过默认不启用,因为影响性能),所以其实就服务端场景而言,不用 java 用其他语言也不太能降低内存占用。当然,如果是说 spring boot 内存占用高,是因为它本身就比较重,换成 vert.x/helidon se 之类的轻量级框架就好了,而且他们还都是 AOT 友好的框架。
    dragondove
        8
    dragondove  
       63 天前   ❤️ 2
    @smallboy19991231 在我的 64 位设备上,类似的 C 代码,通过 gcc -O2 编译,大概是 120k 的内存占用
    Cbdy
        9
    Cbdy  
       63 天前
    试试 native-image
    dragondove
        10
    dragondove  
       63 天前
    再补充一点,hello world 这种特别小的项目,openj9 的内存占用反而比 hotspot 高,尝试过设置 -Xmx ,openJ9 能设置的 Xmx 能更小(可以设置到 -Xmx1m ,而 hotspot 我这设置成-Xmx3m 就会报错),不过貌似是因为它本身虚拟机的 footprint 更大,所以总内存占用还是 hotspot 小点
    sagaxu
        11
    sagaxu  
       63 天前   ❤️ 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
    voidmnwzp
        12
    voidmnwzp  
       63 天前 via iPhone
    写 Java 最后只会变成 springer ,离开 spring 啥也不会干,所以果断放弃 java ,用 go 写 web 感觉也还行
    just4id
        13
    just4id  
       63 天前 via iPhone
    在 win xp 里用 jdk1.2 试试
    LokiSharp
        14
    LokiSharp  
       63 天前 via iPhone
    试试功能机和家电的 JVM?
    DOLLOR
        15
    DOLLOR  
       63 天前 via Android
    @oyps
    这下真的是 JavaScript 了🐶
    chendy
        16
    chendy  
       63 天前   ❤️ 8
    看到‘Java 内存没救了’的惊世论断,切个屏看了看正在运行一个上古 java 项目的十几台 16c64g 服务器,我陷入了沉思。HotSpot 内存利用率确实一般,Java 的语法也确实一般,但是作为团队作为企业 Java 够便宜 HotSpot 够稳定,这就够了

    最后还是要说,去小区门口拿快递拖个露营车就行了,不用开 600 马力牵引头
    wssy001
        17
    wssy001  
       63 天前
    @voidmnwzp 试试用 go 写点复杂业务 希望写的舒服
    kyuuseiryuu
        18
    kyuuseiryuu  
       63 天前
    打车都有起步价
    wjx0912
        19
    wjx0912  
       63 天前   ❤️ 29
    确实,Java 是一个非常优秀的编程语言,就像你在做可口可乐的时候,用左手扔出一个星巴克杯子,这个行为会引发一场全球性的火星探险。你看啊,当我们在调试代码的时候,电饭煲的温度会直接影响到银河系的重力波动,所以这个长颈鹿的高度,它会导致黑洞内部的温度升高,对吧?再加上,考虑到大西洋的波浪频率,我们可以很容易地推断出哈利波特的隐形斗篷实际上是用纳米技术制造的,这样一来,爱因斯坦的相对论就会变成一道美味的披萨。所以啊,无论是二氧化碳的分子结构,还是莎士比亚的十四行诗,都无法阻止这个时空旅行的火箭在火星上着陆。
    w568w
        20
    w568w  
       63 天前 via Android
    又一个分不清语言、编译器和运行时的,神 tm Java 内存占用大

    请楼主说出下面几组词语的区别:

    1. Lua 和 LuaJIT
    2. NodeJS 和 DOM
    3. gcc 和 llvm
    4. Java 和 Java(SE)
    5. OpenJDK 和 GraalVM
    ajaxgoldfish
        21
    ajaxgoldfish  
       63 天前
    @w568w 那不是说了吗 1 ,2 ,3 。和你说的下面的有什么关系?
    aeiou520
        22
    aeiou520  
       63 天前
    内存值几个钱?
    diagnostics
        23
    diagnostics  
       63 天前   ❤️ 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();
    ```
    diagnostics
        24
    diagnostics  
       63 天前
    @diagnostics 试了下 OP 的代码,在我的 M1 在也是 14M ,可能是平台实现的差异。

    另外 OP 那么纠结内存问题,麻烦解决一下因为伪共享,所以需要在 L1 级别的缓存行加 Padding ,导致缓存浪费的问题。设计一个解决方案,毕竟 L1 内存比 Main Memory 值钱多了,速度也更快。

    那么为了来了,纠结这些内存的所谓底层开发(大多数都是 Golanger ,他们才有闲情碰瓷 Java ),不知道写自己的应用时,设计时,有没有去看第三方的网络库,是如何处理伪共享问题的~~是如何把内存用到极致~
    我猜没有,因为如果他们去思考了,很大可能会像我,认知到了“计算机就是时空之间的 TradeOff”,这个在学算法的时候就会告诉你了。
    也可能国内外的大神都像“草台班子”(虽然我很恶心这个词),能用就行吧~
    nullxx
        25
    nullxx  
       63 天前   ❤️ 1
    @wjx0912 #19 意大利面拌 42 号混凝土
    w568w
        26
    w568w  
       63 天前
    @ajaxgoldfish 「那说了」什么了?「我下面」又说什么了?

    我倒是看不懂你在说什么,语言支离破碎的。
    javak
        27
    javak  
    OP
       63 天前
    @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)
    ajaxgoldfish
        28
    ajaxgoldfish  
       63 天前
    @w568w #26 你说楼主分不清编译器和运行时,人家 23 中不是说了先编译再运行吗?

    请楼主说出下面几组词语的区别:

    你让 op 说出这五种区别有什么意义呢?这都不是一个层面的,和你说的分得清分不清《编译器和运行》有什么关系?这五组里面既不是同一层,又不是同一类,既有概念又有工具。
    sagaxu
        29
    sagaxu  
       63 天前   ❤️ 1
    @javak x86_64 不用试就知道,加不加 Xmx 也一样,PSS 占用就是 30M+,绝大部分是 JVM 的 native 内存占用。

    btw: 使用 ZGC 之后都要看 PSS ,看 RSS 已经没有意义了,很多监控内存的工具都要调整。
    xiangyuecn
        30
    xiangyuecn  
       63 天前
    测试内存占用差不多,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 退出

    请输入菜单序号:
    >
    ```
    wszzh
        31
    wszzh  
       62 天前
    最近看了一个帖子都是说 java 内存占用大、 内存没救了。 自己也写 java , 还从来没关注过, 今天一时兴起点开了帖子,确实很对。

    一句话总结:Java 内存没救了,在意内存别用 Java ,其他情况下都可以用 Java 。(/狗头)
    pangdundun996
        32
    pangdundun996  
       62 天前
    光看基础内存不能说明啥,高负载下 golang 的内存占用不比 java 低
    raviscioniemeche
        33
    raviscioniemeche  
       62 天前   ❤️ 1
    从业这么多年 唯一没学的语言就是 java
    raviscioniemeche
        34
    raviscioniemeche  
       62 天前
    @pangdundun996 hello world 这也不是高负载吧
    w568w
        35
    w568w  
       62 天前
    @ajaxgoldfish #28

    「你说楼主分不清编译器和运行时,人家 23 中不是说了先编译再运行吗」:我在说标题和主贴显然是没分清。另外,23 楼看清楚了,不是楼主发的。别人提了「先编译再运行」就等于楼主知道?

    「既不是同一层,又不是同一类,既有概念又有工具」:有没有可能,就是因为楼主没分清概念和工具我才这么问的?都是同一类的名词我问个毛线区别?挺搞笑的。
    laikick
        36
    laikick  
       62 天前   ❤️ 2
    早知道还是 PHP 忏悔之泪.jpg
    pangdundun996
        37
    pangdundun996  
       62 天前
    @raviscioniemeche #34 我意思是 java 启动时占用确实高,但峰值占用还是可以的
    Richared
        38
    Richared  
       62 天前   ❤️ 1
    纠结 java 内存占多大,不如让公司做的 app 别胡搞了。用户的内存不是钱?
    rrfeng
        39
    rrfeng  
       62 天前
    都说了 jvm ,vm 启动就要这么多,跟你代码没关系。
    thetbw
        40
    thetbw  
       62 天前
    jvm 分配内存和已使用内存是两回事
    thinkershare
        41
    thinkershare  
       62 天前
    JVM 应该有很大一部分内存是可以和其它进程公用的,也就是你启动多个的时候,JVM 本身的二进制文件在内存中是和运行相同版本的 JVM 的进程共享同一份内存的,排除这部分内存,剩下的应该是 JVM 保留了一部分堆内存用来为接下来的对象分配预留。其实纠结这种问题没啥意义,Java 的使用场景大部分更不不在乎内存效率,开发者的成本远高于硬件的成本。
    WIN2333
        42
    WIN2333  
       62 天前
    菜就多练
    b1iy
        43
    b1iy  
       62 天前
    我首次得出这结论的时候刚上大一
    emmm 往事不堪回首
    daysv
        44
    daysv  
       62 天前
    java 这么多年不都这样。 不过居然比 v8 的 node 还多我是惊讶的。
    rust 启动
    photon006
        45
    photon006  
       62 天前
    同时写 nestjs 、java spring 项目,java 确实占内存更多,但现在内存已经白菜价没必要纠结,公司机房服务器升级 256g 根本用不完,项目大了也是分布式架构不存在单机瓶颈。

    要相信人比机器贵,花大量时间优化消耗的时间成本还不如直接升级硬件成本低。
    GeekGao
        46
    GeekGao  
       62 天前   ❤️ 1
    10 几年前写过几种语言与 java pk hello world 的内存文章,没想到还会有人这么干。
    daysv
        47
    daysv  
       62 天前
    @photon006 说是这么说, 你自己买云服务器玩的时候就又是另外一套说法了。
    pcdd
        48
    pcdd  
       62 天前
    spb3.3.1 、oraclejdk21.0.3 、1 个 @GetMapping helloworld
    idea 按钮运行,占用内存 135MB
    mvn spring-boot:run 运行,占用内存 350MB
    mvn spring-boot:start 运行,占用内存 169MB
    topLangyu
        49
    topLangyu  
       62 天前
    大货车确实油耗高。但电动货车局限性也挺多。
    loryyang
        50
    loryyang  
       62 天前   ❤️ 2
    让我想起,十年前 hadoop 出来的时候,一哥们写文章锐评,单机部署 hadoop 之后,跑里面的排序样例代码太慢了
    www5070504
        51
    www5070504  
       62 天前
    启动内存没啥意义吧 是不是应该关注一些对象的内存使用量 真被说的那些问题 大头肯定不是在启动内存上
    Cheivin
        52
    Cheivin  
       62 天前
    @wjx0912 #19 你有这么高速运转的机械进入中国,记住我给出的原理,小的时候。 作者:黑玫瑰 Blake https://www.bilibili.com/read/cv32698756/?jump_opus=1 出处:bilibili
    Cheivin
        53
    Cheivin  
       62 天前
    @Cheivin #52 哦豁,忘了删哔站的尾巴了
    DOLLOR
        54
    DOLLOR  
       62 天前
    谁能想到 java 这个“内存大户”,当初可是设计给嵌入式小型设备用的
    shuimugan
        55
    shuimugan  
       62 天前   ❤️ 1
    内存便宜是作为个人设备而言的,到了生产环境内存就很昂贵了,特别是一个业务群一年下来的费用。
    大家都说性能瓶颈不在语言而是在数据库层,既然这样,那应用层的配置从 8c 32g 砍到 8c 16g 行不行? 4c 8g 呢? 2c 4g 呢?真正做过资源分配和预算决策就懂了。

    https://www.bilibili.com/video/BV1Qe411k7H6 .NET Conf China 2023 的分享,从 Java8 到 .NET8 ,团队升级工作汇报 》可以看下别人的历程,迁移完了服务器资源降低了 3/4 。等自己到了带团队做决策分配预算的位置,就会自然而然做出类似的决定,毕竟省下来的钱自己人分掉不香吗。
    haython
        56
    haython  
       62 天前   ❤️ 3
    我的 Windows 电脑,一开机就占用了 8G 内存,我的 debian 服务器才用 500M ,总结一句话:Windows 内存没救了,在意内存的别用 Windows
    haython
        57
    haython  
       62 天前
    @shuimugan 这种项目,就算重新用 java8 再写一遍,也能降低服务器资源,并不是用.NET8 的原因
    zzhaolei
        58
    zzhaolei  
       62 天前
    阿里云服务,x86 计算型 c7 ,2c4g ,100mbps ,一年是八万零四百三十二。这只是一台服务器的价格,2c/4g 能支持 Java 用 Spring 流畅的扛住高并发吗?所以内存真的不值钱?

    Java 不得上个几十上百台机器?每台一年 8 万块,这得多少钱?所以内存真的不值钱?
    tywtyw2002
        59
    tywtyw2002  
       62 天前
    有没有人出个总结,各种编程语言 helloworld 都占用多少内存? 编译好的文件多大?
    jadehare
        60
    jadehare  
       62 天前
    空载卡车跟汽车跑一米,说卡车油耗高没救了。我可以这么理解么?
    shuimugan
        61
    shuimugan  
       62 天前
    @haython 任何的重构肯定能降低资源,因为已经熟悉了原来的业务逻辑。但是用 java8 重构肯定不能节省 3/4 ,因为 java8 的并发模型就摆在那里。
    这个视频是我打游戏的时候挂着听的,有几个重点指标:
    1.资源占用少,原来那个 java 服务冷启动 100 秒,能吃满一个核,高峰期 java8 服务挂掉后重启那一刻猛猛吃 cpu ,在 k8s 里属于自己搞死自己;
    2.碰到了那种等慢 sql 结果搞到线程池满的 case ,就会死,迁移到.net 的异步 IO 真香。这点其实非常的重要,现实的业务逻辑到处都是等待 IO ,java8 那个线程模型就是不行;
    3.分布式事务也有很好的支持;
    4.迁移成本很低,几乎 0 感,这个在带团队上非常重要;
    sagaxu
        62
    sagaxu  
       62 天前
    @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 重写一下都能省不少资源。
    haython
        63
    haython  
       62 天前
    @shuimugan 他这明显就是换领导了,我不相信有哪个 java 团队会突然从 java8 换成.net8 是因为性能,最少也得升级个 java 版本再说吧,我看 .net8 比 java21 发布的还晚,我看 B 站下边评论说是不敢尝试 java21,那居然敢尝试 .net8 ?
    sagaxu
        64
    sagaxu  
       62 天前
    @shuimugan Java 8 只有线程模型吗?

    大众点评.net 转 Java ,京东.net 转 Java , 携程.net 转 Java ,多花了几倍的 IT 成本?集团能批准这种决策?
    laragh
        65
    laragh  
       62 天前
    @laikick 别闹,PHPer 表示现在公司正在转 JAVA
    fds
        66
    fds  
       62 天前
    @zzhaolei 你这是 100mbps 的价格。动态带宽大概是不到 2000 。
    james122333
        67
    james122333  
       62 天前 via Android
    @shuimugan

    虽然对 java 有些许怨言 但我必需说所谓线程模型都是实现的 只是.net 标准库预设实现好一点而已 但对于手刻党来说这种差异根本不存在
    认知多点更好
    james122333
        68
    james122333  
       62 天前 via Android
    @shuimugan

    如果明暸差异爱用什么就用什么 这才是使用计算机
    changhe626
        69
    changhe626  
       62 天前
    你们继续吵,我去做新的业务了,拜拜。
    fantastM
        70
    fantastM  
       62 天前
    在互联网这块,就算你拿 C 把代码写出花,销售接不到单子,产品赚不到钱,又能有什么用

    这几年的市场和行情,太过纠结技术实现,意义不大
    cuebyte
        71
    cuebyte  
       62 天前
    不明白 JVM 初始内存占用高是会产生什么影响?有人能说明一下吗?
    moonlight010
        72
    moonlight010  
       62 天前
    上面的说明已经很多了,直接 block
    shuimugan
        73
    shuimugan  
       62 天前   ❤️ 1
    聊这些肯定要结合历史发展,高速增长的业务本来就是以扩张为主,加上.net core 是 2016 年中才发布的 1.0 ,之前.net framework 生态都是闭源的,肯定是市场上什么人多就招什么人,有资本的注入,招人和服务器那点费用对比业务增长的收益不值一提。

    java8 当然不止有线程模型,但是其它的并发模型都是一堆坑,写起来就是掉进回调地狱的,有点技术广度了解过其它语言的并发模型都不会选。为了保证业务扩张,肯定是以其它公司踩过坑的稳定方案为主。

    但是在业务放缓,经济下行之后,之前欠下的债都是要还的,预算变少了,砍人还是砍服务器,总得选一个。

    在国内,换领导肯定是影响技术选型的重大因素。net8 虽然发布比 java21 晚,但是.net core 1.0 从发布到.net 8 重大变更很少,倒是兼容性和效能上不断改进,该踩的坑都踩得差不多了,反倒是 java21 在生态位是缺失的,不敢用很正常。
    @haython
    @sagaxu
    shuimugan
        74
    shuimugan  
       62 天前
    @james122333 大佬云集的公司手搓什么不行,谁不想自己团队每个人都是孙悟空呢,但可惜都是大部分虾兵蟹将,总要选一些他们能接受而且成本也能接受的方案。不是每个公司都有 Facebook 当时搞 HHVM 这种魄力的。
    james122333
        75
    james122333  
       62 天前 via Android
    @shuimugan

    不用到 HHVM 程度 会写 java 就手搓的出来
    spring 工程师才手搓不出来 门槛并没有那么高
    wuyiccc
        76
    wuyiccc  
       62 天前   ❤️ 1
    垃圾 java ,我们已经准备用 go 替换 java 了,感觉还是 go 占用的资源少
    CSM
        77
    CSM  
       62 天前   ❤️ 1
    前几天用 Rust 写了个简单的 http 1.0 server, 百万 QPS 下峰值内存只有 2 MiB.
    Ericcccccccc
        78
    Ericcccccccc  
       62 天前
    单单一个 xml 解析就够你喝一壶了。
    duhbbx1119
        79
    duhbbx1119  
       62 天前
    只要 30m 而已,你知道它给你加载了多少东西吗
    Wataru
        80
    Wataru  
       62 天前
    真不知道这东西以前怎么给嵌入式用的
    mikewang
        81
    mikewang  
       62 天前
    不知道你有没有用过那种老的翻盖手机,那时的手机的 RAM 才多大点,但是从贪吃蛇到飞机大战,还有 3G 联网的打牌游戏,都是 Java 写的。
    zcybupt2016
        82
    zcybupt2016  
       62 天前
    反正内存不用我掏钱
    sagaxu
        83
    sagaxu  
       62 天前   ❤️ 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#可以砍掉更多的人。
    diagnostics
        84
    diagnostics  
       62 天前
    @javak 同样的代码,你测试一下 nodejs ? Java 应该比 nodejs 还要少点的
    humingk
        85
    humingk  
       62 天前 via iPhone
    内存没有那么值钱,我正在上的 20 分片单实例 https://ibb.co/KXxQcGP 而这样的实例还有 10 个
    anzu
        86
    anzu  
       62 天前
    java 跑在虚拟机上啊,为了一次编译可多平台执行。
    hez2010
        87
    hez2010  
       62 天前
    @sagaxu 那些 benchmark 都是在用空间换时间,当然内存占用大,对于内存占用水平而言没有参考意义,难道 c++的代码里直接在内存里打个表来优化性能,而别的语言的实现里没有这么做,导致 c++占用大就能说明 c++内存占用大了?

    另外,.net 的内存占用一般要比 java 小一个数量级,比如 op 的测试代码原样翻译成 c# 后测试,

    这是 .net:



    这是 java:

    sagaxu
        88
    sagaxu  
       62 天前
    @hez2010 hello world 只能体现 VM 启动开销,并不能体现数据量增长时的内存增长情况。

    “那些 benchmark 都是在用空间换时间,当然内存占用大,对于内存占用水平而言没有参考意义”

    这个论断有两个问题,

    1. 用空间换时间,难道只有 Java 版代码没这么干?

    2. 高内存占用算法下,不是更能体现内存随数据量增长情况?

    单 case benchmark 不能说明问题,多组不同类型 task ,多种实现,纵向横向对比下来,就足够看出一些端倪了。
    shuimugan
        89
    shuimugan  
       62 天前
    @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 后的表现,资源占用非常优秀,尝鲜的人多了之后,出现在技术选型里的几率就会慢慢变大。

    硬切换对带头人的魄力和领导力有很强的要求,在国内很罕见,要做到精益求精也要讲生活和工作平衡。但对于开新坑的项目,切换技术栈就不难了,久而久之可能就会以绞杀者模式的形态完成了切换。
    ragnaroks
        90
    ragnaroks  
       62 天前
    个人经验,技术栈较老(传统)的 java 项目都不在意资源消耗,比较新(特别是跑在容器里面的)的要么不会考虑 java 要么是 go 。业务复杂之后资源占用也不是需要优先考虑的事情,spring 吃个 10G 、aspnet 吃个 3G 、gin 吃个 1G ,对于跑这个业务的人来说没有区别。
    sagaxu
        91
    sagaxu  
       62 天前
    @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 已经是云原生时代扛把子了,这个领域眼下还看不到强大的对手。
    iseki
        92
    iseki  
       62 天前 via Android
    JVM 的初始内存消耗就是很大,它提供了 go runtime 缺失的太多功能。至于跑起来的话,虽然 JVM footprint 偏大,但实际内存消耗还是要看程序怎么写。
    needpp
        93
    needpp  
       62 天前
    @wjx0912 这种已读乱回的风格着实让人喜欢
    itakeman
        94
    itakeman  
       62 天前 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 去
    itakeman
        95
    itakeman  
       62 天前 via Android
    @haython qt 确实,Windows 没救了,拿 win 做家用路由器的厂商,估计来一个倒闭一个。用 linux 做家用路由器的厂商,各个风生水起
    itakeman
        96
    itakeman  
       62 天前 via Android
    @CSM rust 学起来难么?
    daysv
        97
    daysv  
       62 天前
    @diagnostics 想啥呢, 我试了下 node 是 7.1mb , 所以我说 java 居然比 v8 初始化还占资源。
    diagnostics
        98
    diagnostics  
       62 天前
    @itakeman #94 v2 很多帖子,咱也不是张嘴就来,你统计一下就知道谁天天碰瓷了
    diagnostics
        99
    diagnostics  
       62 天前
    咱也不知道你用的是什么高阶 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
    whyso
        100
    whyso  
       62 天前
    @itakeman 用 go 的人看都不会看一眼 java ,java 什么东西?用 go 的只会看看 c 、rust 、Python 、js ,Java 什么东西?
    暴躁老哥,我喜欢,哈哈。一个 hello world 就得写一堆
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:01 · PVG 10:01 · LAX 19:01 · JFK 22:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.