即使对于小程序,Java内存使用率也很高

Viv*_*ivo 24 java memory ram

我有几个用java编写的简单应用程序,其中一个被编写为一个小部件.甚至小应用程序使用多少内存让我感到惊讶.

我写了以下内容,看看它是否是我的程序中的错误,或者是一般的Java问题:

public class ram {
    public static void main(String[] args){
    while(true)System.out.print("Hello World");//while loop to give me time to check RAM usage
    }
}
Run Code Online (Sandbox Code Playgroud)

然后编译并运行它,java ram它给了我以下RAM使用情况:

The process java (with pid 4489) is using approximately 43.3 MB of memory.
34460 KB    [heap]
7088 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/server/libjvm.so
1712 KB /usr/lib/jvm/java-7-openjdk/jre/lib/rt.jar
136 KB  [stack:4495]
120 KB  /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/libjava.so
Run Code Online (Sandbox Code Playgroud)

这不是太高了吗?特别是一堆34MB.我的系统是ArchLinux x86_64和openjdk-7.

有没有办法最小化JVM使用的RAM量?

编辑:我尝试使用-Xmx标志,这就是我得到的(1281k是最小的让我开始):

java -Xmx1281k ram
The process java (with pid 4987) is using approximately 27.6 MB of memory.
18388 KB    [heap]
Run Code Online (Sandbox Code Playgroud)

相比之下,Python2使用4.4MB,Mono使用4.3MB.

Ste*_*tad 78

我经常看到类似的问题,我还没有看到一个满意的答案.

我经常看到的答案很生气"你为什么关心?" 答案.有些人在提出这个问题上付出了很多的思考和努力,而且任何问过它的人都显得很愚蠢.

有些人会对Java分配的不同类型的内存,为什么会这样做以及你应该查看哪些命令行参数进行长时间的讨论来回答这个问题.(很少有人会非常具体)

事实上,对于小型实用程序,Java在大多数操作系统上都是内存耗尽的.效用越小,它就越明显.Java开发人员长期以来一直习惯于处理或忽略这一事实.

内存使用看似异常的原因很多.每个线程为其堆栈获取一定量的内存.无论程序对垃圾清理,RMI等程序的简单程度如何,都有几个线程可以启动.在Windows/64位上,每个线程1MB.默认情况下会加载一堆类以及所有类.我确信其他很多事情都在幕后发生.

Java已经做出了其他语言没有的权衡选择.加载时间比大多数其他语言慢.初始内存要求更高.最常用的字符串比大多数人意识到的消耗更多的内存.还有无数其他人.许多情况下的好处确实有所回报.像Hello World这样的东西比其他任何东西都更能显示出这些选择的成本.对于简单的多线程和接近原生的性能这样的好处对Hello World来说真的不好.

不幸的是,你可以做很多事情来真正减少简单应用程序使用的内存.有上面提到的命令行开关,试验和错误可能会将您报告的使用率降低到~10-15mb水平我确定,但是您花费的选择和时间不适用于各种各样的未来的应用.您将不得不再次为下一个应用程序执行相同的过程.扔进一个GUI界面和一些日志记录和另一个常见的一两个库,你的基数最多可以达到60mb.

你没有做错任何事.这就是Java中的工作方式.你会习惯的.你会因此而选择另一种语言,这也没关系.

  • 感谢您花时间提供平衡的答案,没有通常的愤怒(在任何一个方向)+1 (13认同)
  • 为什么C#使用更少的内存?例如,我通常看到intellij,Eclipse或netbeans使用1GB的ram,但Visual Studio只使用300mb.我也见过其他c#程序,比如paint.Net,根据任务经理,他们也使用很少的内存. (4认同)
  • 谢谢你!我得到的最佳答案。其他每个答案都像是“因为新计算机有足够的内存,所以这并不重要”。我是一名 C++ 程序员,这就是为什么这对我来说是一个有趣的话题。真的,非常感谢。 (2认同)

stm*_*ius 7

有几个原因:

  1. java运行时本身就是一个相当复杂的程序.它需要获取Java程序的字节代码(来自javac的输出),将其转换为运行它的系统的机器代码,有一个优化器,有调试接口等.
  2. 虽然您的程序相当小,但Java仍然会从其标准库中加载许多类.您可以使用'java -verbose:class ram'来启动它
  3. Java提前为您的程序分配了大量内存 - 它无法知道它实际需要多少内存.除其他外,这由-Xmx选项控制.这种记忆有几种类型.要了解有关它们的更多信息,可以使用JConsole工具,该工具包含在JDK的bin文件夹中.您可以在java.sun.com上阅读更多相关信息.此stackoverflow问题还给出了Java使用的内存区域的摘要