jvm 设计决策
为什么jvm需要大约10 MB的内存才能实现简单的hello世界,而clr却不需要。这里的权衡是什么,即jvm通过这样做可以获得什么?
让我澄清一下,因为我没有传达我脑海中的问题。jvm 和 clr 运行时之间显然存在体系结构差异。jvm 的内存占用量明显高于 clr。我假设这种开销有一些好处,否则为什么会存在。我问的是这两种设计中的权衡是什么。jvm 从其内存开销中获得什么好处?
为什么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特定的问题,只是没有一个问题。在这些情况下,实例化的对象数量和摆动绘画速度是更大的问题。
我不知道初始内存占用量还是Hello World应用程序的占用空间是否重要。差异可能是由于 JVM/CLR 加载的库的数量和大小造成的。还可以有为垃圾回收池预先分配的内存量。
我知道的每个应用程序都使用比Hello World功能更多的功能。这将在整个应用程序执行过程中加载和释放内存数千次。如果您对JVM与CLR的内存利用率差异感兴趣,这里有一些包含良好信息的链接
http://benpryor.com/blog/2006/05/04/jvm-vs-clr-memory-allocation/
内存管理案例研究在PowerPoint中。一个非常有趣的演示。