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

时间:2012-12-03 21:39:48

标签: java memory ram

我有几个用java编写的简单应用程序,其中一个被编写为一个小部件。令我惊讶的是,即使是小型应用程序也会使用多少RAM。

我写了以下内容,看看它是否是我的程序中的错误,或者是一般的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
    }
}

然后使用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

这不是太高了吗?特别是一堆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]

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

2 个答案:

答案 0 :(得分:73)

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

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

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

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

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

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

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

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

答案 1 :(得分:7)

有几个原因:

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