【发布时间】:2012-11-21 10:44:18
【问题描述】:
我有几个用 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 编译并运行它,它给了我以下内存使用情况:
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。
【问题讨论】:
-
谁在乎?虚拟内存基本上是免费的。现代系统可以以接近零的成本大量生产。这就像试图呼吸更少的空气。 (注意这里不是测量物理内存、RAM,而只是测量虚拟内存、地址空间。)
-
43MB 并不奇怪,因为 JVM 为将来可能的负载预留了足够的内存。但如果你将 max mem 设置为几 MB 应该没问题
-
JVM 确实使用[相对]大量内存。虽然 David 确实指出它是“虚拟的”,但我认为与本机应用程序相比,这可能会掩盖典型 Java 环境所涉及的开销(尤其是当应用程序“什么都不做”但启动时) - 那么这与物理使用?我不知道..
-
@TomG 有时这与 RAM 的成本无关,因为某些设备只能拥有这么多内存(Raspberry Pi:265/512MB RAM,我的上网本:2GB)