33

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

4

2 回答 2

107

我经常看到与此类似的问题,但我还没有看到令人满意的答案。

我最常看到的答案是愤怒的“你为什么在乎?” 答案。有些人花了很多心思和精力来提出这个问题,而提出这个问题的人似乎很愚蠢。

有些人会用长篇大论来回答这个问题,包括 Java 分配的不同类型的内存、为什么这样做以及应该查看哪些命令行参数。(很少有人会非常具体)

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

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

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

不幸的是,要真正最小化简单应用程序使用的内存,您可以做的事情并不多。有前面提到的命令行开关,我敢肯定,反复试验可以将您报告的使用量缩小到 ~10-15mb 水平,但是您花在弄清楚它们上的那些选择和时间并不适用于各种各样的未来应用。对于下一个应用程序,您必须再次执行相同的过程。加入一个 GUI 界面和一些日志记录以及另一个或两个通用库,您的基数将很快达到 60mb。

你没有做错什么。这就是 Java 的工作方式。你会习惯的。因此,您有时会选择另一种语言,这也没关系。

于 2013-07-01T11:36:32.573 回答
10
于 2013-03-24T16:57:11.213 回答