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