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

我有几个用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 } } 

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

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

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

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

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

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

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

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

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

有几个原因:

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