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 。

16880 次点击
所在节点    Java
113 条回复
ih8es9OIzne0959p
2024-07-18 09:03:47 +08:00
@w568w 那不是说了吗 1 ,2 ,3 。和你说的下面的有什么关系?
aeiou520
2024-07-18 09:08:56 +08:00
内存值几个钱?
diagnostics
2024-07-18 09:09:59 +08:00
很奇怪你怎么测试,我这边直接编译后跑运行,内存只有 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
2024-07-18 09:18:19 +08:00
@diagnostics 试了下 OP 的代码,在我的 M1 在也是 14M ,可能是平台实现的差异。

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

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

我倒是看不懂你在说什么,语言支离破碎的。
javak
2024-07-18 09:28:16 +08:00
@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)
ih8es9OIzne0959p
2024-07-18 09:34:42 +08:00
@w568w #26 你说楼主分不清编译器和运行时,人家 23 中不是说了先编译再运行吗?

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

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

btw: 使用 ZGC 之后都要看 PSS ,看 RSS 已经没有意义了,很多监控内存的工具都要调整。
xiangyuecn
2024-07-18 09:40:07 +08:00
测试内存占用差不多,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
2024-07-18 10:06:59 +08:00
最近看了一个帖子都是说 java 内存占用大、 内存没救了。 自己也写 java , 还从来没关注过, 今天一时兴起点开了帖子,确实很对。

一句话总结:Java 内存没救了,在意内存别用 Java ,其他情况下都可以用 Java 。(/狗头)
pangdundun996
2024-07-18 10:10:28 +08:00
光看基础内存不能说明啥,高负载下 golang 的内存占用不比 java 低
kxg3030
2024-07-18 10:10:34 +08:00
从业这么多年 唯一没学的语言就是 java
kxg3030
2024-07-18 10:11:13 +08:00
@pangdundun996 hello world 这也不是高负载吧
w568w
2024-07-18 10:13:59 +08:00
@ajaxgoldfish #28

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

「既不是同一层,又不是同一类,既有概念又有工具」:有没有可能,就是因为楼主没分清概念和工具我才这么问的?都是同一类的名词我问个毛线区别?挺搞笑的。
laikicka
2024-07-18 10:16:20 +08:00
早知道还是 PHP 忏悔之泪.jpg
pangdundun996
2024-07-18 10:29:31 +08:00
@raviscioniemeche #34 我意思是 java 启动时占用确实高,但峰值占用还是可以的
Cruzz
2024-07-18 10:44:51 +08:00
纠结 java 内存占多大,不如让公司做的 app 别胡搞了。用户的内存不是钱?
rrfeng
2024-07-18 10:49:06 +08:00
都说了 jvm ,vm 启动就要这么多,跟你代码没关系。
thetbw
2024-07-18 11:27:06 +08:00
jvm 分配内存和已使用内存是两回事

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

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

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

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

© 2021 V2EX