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 。

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

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

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

1. Lua 和 LuaJIT
2. NodeJS 和 DOM
3. gcc 和 llvm
4. Java 和 Java(SE)
5. OpenJDK 和 GraalVM

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

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

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

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

© 2021 V2EX