Java hello world 确实就要占用 30M

2024-07-17 23:42:48 +08:00
 javak

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

16363 次点击
所在节点    Java
113 条回复
slowgen
2024-07-18 16:35:32 +08:00
@haython 任何的重构肯定能降低资源,因为已经熟悉了原来的业务逻辑。但是用 java8 重构肯定不能节省 3/4 ,因为 java8 的并发模型就摆在那里。
这个视频是我打游戏的时候挂着听的,有几个重点指标:
1.资源占用少,原来那个 java 服务冷启动 100 秒,能吃满一个核,高峰期 java8 服务挂掉后重启那一刻猛猛吃 cpu ,在 k8s 里属于自己搞死自己;
2.碰到了那种等慢 sql 结果搞到线程池满的 case ,就会死,迁移到.net 的异步 IO 真香。这点其实非常的重要,现实的业务逻辑到处都是等待 IO ,java8 那个线程模型就是不行;
3.分布式事务也有很好的支持;
4.迁移成本很低,几乎 0 感,这个在带团队上非常重要;
sagaxu
2024-07-18 16:49:27 +08:00
@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 重写一下都能省不少资源。
displayabc
2024-07-18 16:55:00 +08:00
@shuimugan 他这明显就是换领导了,我不相信有哪个 java 团队会突然从 java8 换成.net8 是因为性能,最少也得升级个 java 版本再说吧,我看 .net8 比 java21 发布的还晚,我看 B 站下边评论说是不敢尝试 java21,那居然敢尝试 .net8 ?
sagaxu
2024-07-18 17:00:11 +08:00
@shuimugan Java 8 只有线程模型吗?

大众点评.net 转 Java ,京东.net 转 Java , 携程.net 转 Java ,多花了几倍的 IT 成本?集团能批准这种决策?
laragh
2024-07-18 17:01:16 +08:00
@laikick 别闹,PHPer 表示现在公司正在转 JAVA
fds
2024-07-18 17:03:19 +08:00
@zzhaolei 你这是 100mbps 的价格。动态带宽大概是不到 2000 。
james122333
2024-07-18 17:16:07 +08:00
@shuimugan

虽然对 java 有些许怨言 但我必需说所谓线程模型都是实现的 只是.net 标准库预设实现好一点而已 但对于手刻党来说这种差异根本不存在
认知多点更好
james122333
2024-07-18 17:26:25 +08:00
@shuimugan

如果明暸差异爱用什么就用什么 这才是使用计算机
changhe626
2024-07-18 17:45:47 +08:00
你们继续吵,我去做新的业务了,拜拜。
fantastM
2024-07-18 18:26:40 +08:00
在互联网这块,就算你拿 C 把代码写出花,销售接不到单子,产品赚不到钱,又能有什么用

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

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

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

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

不用到 HHVM 程度 会写 java 就手搓的出来
spring 工程师才手搓不出来 门槛并没有那么高
wuyiccc
2024-07-18 19:38:58 +08:00
垃圾 java ,我们已经准备用 go 替换 java 了,感觉还是 go 占用的资源少
CSM
2024-07-18 19:50:00 +08:00
前几天用 Rust 写了个简单的 http 1.0 server, 百万 QPS 下峰值内存只有 2 MiB.
Ericcccccccc
2024-07-18 19:54:38 +08:00
单单一个 xml 解析就够你喝一壶了。
duhbbx1119
2024-07-18 20:39:14 +08:00
只要 30m 而已,你知道它给你加载了多少东西吗
Wataru
2024-07-18 20:43:06 +08:00
真不知道这东西以前怎么给嵌入式用的

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

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

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

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

© 2021 V2EX