Java hello world 确实就要占用 30M

64 天前
 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 。

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

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

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

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

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

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

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

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

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

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

https://www.v2ex.com/t/1058120

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

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

© 2021 V2EX