当前位置:  开发笔记 > 编程语言 > 正文

jvm设计决定

如何解决《jvm设计决定》经验,为你挑选了3个好方法。

为什么jvm需要大约10 MB的内存用于简单的hello世界,但clr却没有.这里的权衡是什么,即jvm通过这样做获得了什么?

让我澄清一点,因为我没有传达我脑海中的问题.jvm和clr运行时之间显然存在架构差异.jvm具有比clr更高的内存占用.我假设这个开销有一些好处,否则为什么会存在.我在问这两种设计的权衡取舍.jvm从内存开销中获得了什么好处?



1> Bill K..:

我想有一个原因是Java必须自己做所有事情(平台独立性的另一个方面).例如,Swing从头开始绘制它自己的组件,它不依赖于操作系统来绘制它们.这一切都必须在记忆中发生.Windows可能会做很多东西,但Linux不能(或做不同的)必须完全包含在Java中,以便它在两者上都能正常工作.

Java也始终坚持认为它的整个库都是"链接"并且可用.由于它不使用DLL(它们不会在每个平台上都可用),所以必须由Java加载和跟踪所有内容.

Java甚至做了很多自己的浮点,因为FPU经常给出不同的结果,这被认为是不可接受的.

因此,如果你考虑C#可以委托给操作系统的所有东西,它与Java必须为操作系统做的所有东西相关联以补偿其他东西,应该预料到差异.

我现在在2个嵌入式平台上运行java应用程序.一个是频谱分析仪,它实际上绘制了痕迹,另一个是机顶盒电缆盒.

在这两种情况下,这个最小内存占用空间都不是问题 - 已经存在Java特定问题,而这些问题并非如此.在这些情况下,实例化对象的数量和Swing绘画速度是更大的问题.



2> Austin..:

好像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工具可能有助于确定内存的去向.


闲置过程的RSS也不是一个很好的措施.

3> Timur Fansht..:

我不知道初始内存占用或Hello World应用程序的占用空间是否重要.差异可能是由于JVM/CLR加载的库的数量和大小.还可以为垃圾收集池预分配一定量的内存.

我所知道的每个应用程序都使用了很多Hello World功能.这将在整个应用程序执行期间加载和释放内存数千次.如果您对JVM与CLR的内存利用率差异感兴趣,请参阅以下几个包含良好信息的链接

http://benpryor.com/blog/2006/05/04/jvm-vs-clr-memory-allocation/

内存管理案例研究(JVM和CLR)

内存管理案例研究在Power Point中.一个非常有趣的演讲.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有