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 。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX