我有几个用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。
答案 0 :(得分:73)
我经常看到类似的问题,我还没有看到满意的答案。
我经常看到的答案很生气“你为什么关心?”答案。有些人在提出这个问题上付出了很多的思考和努力,而且任何问过它的人都显得很愚蠢。
有些人会对Java分配的不同内存类型,为什么会这样做以及您应该查看哪些命令行参数进行长时间的讨论。 (很少有人会非常具体)
事实上,对于小型实用程序,Java在大多数操作系统上都是内存耗尽的。效用越小,它就越明显。 Java开发人员长期以来一直习惯于处理或忽略这一事实。
内存使用看似异常的原因很多。每个线程为其堆栈获取一定量的内存。无论程序对垃圾清理,RMI等程序的简单程度如何,都有几个线程可以启动。在Windows / 64位上,每个线程1MB。默认情况下会加载一堆类以及所有类。我确信幕后还会发生很多其他事情。
Java已经做出了其他语言没有的权衡选择。加载时间比大多数其他语言慢。初始内存要求更高。最常用的字符串比大多数人意识到的消耗更多的内存。还有无数其他人。许多情况下的好处确实有所回报。像Hello World这样的东西比其他任何东西都更能显示出这些选择的成本。对于简单的多线程和接近原生的性能这样的好处对Hello World来说并没有任何好处。
不幸的是,为了真正减少简单应用程序使用的内存,您无法做很多事情。有上面提到的命令行开关,试验和错误可能会将您报告的使用率降低到~10-15mb水平我确定,但是您花费的选择和时间不适用于各种各样的未来的应用。您将不得不再次为下一个应用程序执行相同的过程。投入一个GUI界面和一些日志记录以及另外一个或两个常用库,你的基数将达到60mb,速度非常快。
你没有做错任何事。这就是Java中的工作方式。你会习惯的。你会偶尔选择另一种语言,这也没关系。
答案 1 :(得分:7)
有几个原因: