为什么jvm需要大约10 MB的内存用于简单的hello世界,但clr却没有.这里的权衡是什么,即jvm通过这样做获得了什么?
让我澄清一点,因为我没有传达我脑海中的问题.jvm和clr运行时之间显然存在架构差异.jvm具有比clr更高的内存占用.我假设这个开销有一些好处,否则为什么会存在.我在问这两种设计的权衡取舍.jvm从内存开销中获得了什么好处?
我想有一个原因是Java必须自己做所有事情(平台独立性的另一个方面).例如,Swing从头开始绘制它自己的组件,它不依赖于操作系统来绘制它们.这一切都必须在记忆中发生.Windows可能会做很多东西,但Linux不能(或做不同的)必须完全包含在Java中,以便它在两者上都能正常工作.
Java也始终坚持认为它的整个库都是"链接"并且可用.由于它不使用DLL(它们不会在每个平台上都可用),所以必须由Java加载和跟踪所有内容.
Java甚至做了很多自己的浮点,因为FPU经常给出不同的结果,这被认为是不可接受的.
因此,如果你考虑C#可以委托给操作系统的所有东西,它与Java必须为操作系统做的所有东西相关联以补偿其他东西,应该预料到差异.
我现在在2个嵌入式平台上运行java应用程序.一个是频谱分析仪,它实际上绘制了痕迹,另一个是机顶盒电缆盒.
在这两种情况下,这个最小内存占用空间都不是问题 - 已经存在Java特定问题,而这些问题并非如此.在这些情况下,实例化对象的数量和Swing绘画速度是更大的问题.
好像java只是使用更多的虚拟内存.
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND amwise 20598 0.0 0.5 22052 5624 pts/3 Sl+ 14:59 0:00 mono Test.exe amwise 20601 0.0 0.7 214312 7284 pts/2 Sl+ 15:00 0:00 java Program
我在C#和Java中创建了一个测试程序,它打印字符串"test"并等待输入.我相信驻留集大小(RSS)值更准确地显示内存使用情况.虚拟内存使用(VSZ)意义不大.
据我所知,应用程序可以保留大量虚拟内存,而无需实际使用任何实际内存.例如,您可以要求Windows上的VirtualAlloc函数保留或提交虚拟内存.
编辑:
这是我的Windows框中的漂亮图片: alt文本http://awise.us/images/mem.png
每个应用程序都是一个简单的printf,然后是getchar.Java和CLR使用大量虚拟内存.C版本几乎没有任何东西,所以它的内存使用量相对较小.
我怀疑这两种方式都很重要.只需选择您更熟悉的平台,然后不要编写可怕的,浪费内存的代码.我相信它会有用.
编辑:
Microsoft的这个VMMap工具可能有助于确定内存的去向.
我不知道初始内存占用或Hello World应用程序的占用空间是否重要.差异可能是由于JVM/CLR加载的库的数量和大小.还可以为垃圾收集池预分配一定量的内存.
我所知道的每个应用程序都使用了很多Hello World功能.这将在整个应用程序执行期间加载和释放内存数千次.如果您对JVM与CLR的内存利用率差异感兴趣,请参阅以下几个包含良好信息的链接
http://benpryor.com/blog/2006/05/04/jvm-vs-clr-memory-allocation/
内存管理案例研究(JVM和CLR)
内存管理案例研究在Power Point中.一个非常有趣的演讲.