天天看点

深入分析:JVM的优点与缺点深入分析:JVM 的优点与缺点

<!-- @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h1 {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; mso-outline-level:1; font-size:24.0pt; font-family:宋体; mso-bidi-font-family:宋体; font-weight:bold;} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

深入分析:JVM 的优点与缺点

        当Java 最初诞生的时候,它可以说是其他语言的进化版。不仅因为Java 很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机。它还是垃圾收集站,从而令存储管理和内核转储(core dump )不再是麻烦。当然还有它相当全面的类库。虽然它没有什么惊世的新性能,但它把许多语言的优点基于一身。

        本来Java 是一个简单独一的语言,但是Sun 在长期运营Java 的过程中出现了很多错误,比如将语言与runtime 合用一个名字,从而使得用户在识别JVM 语言项目如Jython 、JRuby 时难以从思想上隔离Java 。最主要的是这样对runtime 很不公,因为Java Virtual Machine (JVM) 有很多自己的独特之处。

        缺点

        没有一种技术是完美的,JVM 也不例外。如果你工作在一个没有Java 语言配置的设备上,JVM 便无用武之地。JVM 为其他语言提供了基础,但JVM 最初不是为这个理念设计的。比如我们作为分配对象来维护我们的堆栈时,通常我们会直接操作实时堆栈并添加我们维护所需的其他字段,除此之外再没有控制堆栈的更好的方法。

        还有,当我们创建一个Ruby Fixnum 时也很麻烦,我们把这些值用一个Java 对象包装。Ruby 的C implementation 不过只是传递tagged ints ,因为没有包装他们就不会符合各种列表,所以Java 基元(Java primitives )也不会切割它。

        顺便说一下:JVM 的启动时间也挺长。

        那些为JVM 编写高性能代码的开发者会觉得经常被JVM 的black box 特性所折磨,一旦你加载你的字节码,你就觉得像是摇动老虎机的游戏手柄一样忐忑,不知道结果如何,black box 就是意味着不可知。

        优点:

        Hotspot

        对于初学者来说,尽管Hotspot 有些神秘,但是性能方面它确实很棒,因为动态建模(dynamic profiling )是优良性能的捷径。HotSpot 从运行应用中采样数据,从而可以优化代码,进而得到良好性能。它相当于以模仿人工的方法进行优化。在程序运行的开始,Java 代码仍然解释执行,但HotSpot 引擎开始进行采样(Profiling) 。HotSpot 引擎可以集中精力来对HotSpot 代码进行深度优化,从而使这部分代码的执行更加迅捷。因此当Hotspot 优化时,它为优化设立了一层保护来确保优化的基本原理有效;但当这层保护失效时,优化就会很慢。

        这里是Hotspot 在使用中的一个演示:

        在图表中我们运行了一个Mandelbrot Generator 很多次,然后测绘它每次生成的时间。你会看到JRuby 1.4.0 明显比Ruby 1.8.7 以及1.9.2preview2 表现更好。如果只看JRuby 的起点,会发现比1.8.7 慢,但当Hotspot 运行后时间曲线迅速下降。