大部分Java程序的性能都是通過提升執行引擎的性能來達到的。正如JIT編譯器一樣,很多優化的技術都被引入進來使得JVM的性能一直能夠得到提升。最原始的JVM和最新的JVM最大的差別之處就是在于執行引擎。
Hotspot編譯器在1.3版本的時候就被引入到Oracle Hotspot VM里了,JIT編譯技術在Anroid 2.2版本的時候被引入到Dalvik VM里。
引入一種中間語言,例如字節碼,虛擬機執行字節碼,并且通過JIT編譯器來提升JVM的性能的這種技術以及廣泛應用在使用中間語言的編程語言上。例如微軟的.Net,CLR(Common Language Runtime 公共語言運行時),也是一種VM,它執行一種被稱作CIL(Common Intermediate Language)的字節碼。CLR提供了AOT編譯器和JIT編譯器。因此,用C#或者VB.NET編寫的源代碼被編譯后,編譯器會生成CIL并且CIL會執行在有JIT編譯器的CLR上。CLR和JVM相似,它也有垃圾回收機制,并且也是基于堆棧運行。
Java 虛擬機規范,Java SE 第7版
2011年7月28日,Oracle發布了Java SE的第7個版本,并且把JVM規也更新到了相應的版本。在1999年發布《The Java Virtual Machine Specification,Second Edition》后,Oracle花了12年來發布這個更新的版本。這個更新的版本包含了這12年來累積的眾多變化以及修改,并且更加細致地對規范進行了描述。此外,它還反映了《The Java Language Specificaion,Java SE 7 Edition》里的內容。主要的變化總結如下:
來自Java SE 5.0里的泛型,支持可變參數的方法
從Java SE 6以來,字節碼校驗的處理技術所發生的改變
添加invokedynamic指令以及class文件對于該指令的支持
刪除了關于Java語言概念的內容,并且指引讀者去參考Java語言規范
刪除關于Java線程和鎖的描述,并且把它們移到Java語言規范里
最大的改變是添加了invokedynamic指令。也就是說JVM的內部指令集做了修改,使得JVM開始支持動態類型的語言,這種語言的類型不是固定的,例如腳本語言以及來自Java SE 7里的Java語言。之前沒有被用到的操作碼186被分配給新指令invokedynamic,而且class文件格式里也添加了新的內容來支持invokedynamic指令。
Java SE 7的編譯器生成的class文件的版本號是51.0。Java SE 6的是50.0。class文件的格式變動比較大,因此,51.0版本的class文件不能夠在Java SE 6的虛擬機上執行。
盡管有了這么多的變動,但是Java方法的65535字節的限制還是沒有被去掉。除非class文件的格式徹底改變,否者這個限制將來也是不可能去掉的。
值得說明的是,Oracle Java SE 7 VM支持G1這種新的垃圾回收機制,不過,它被限制在Oracle JVM上,因此,JVM本身對于垃圾回收的實現不做任何限制。也因此,在JVM規范里沒有對它進行描述。
switch 語句里的String
Java SE 7里添加了很多新的語法和特性。不過,在Java SE 7的版本里,相對于語言本身而言,JVM沒有多少的改變。那么,這些新的語言特性是怎么來實現的呢?我們通過反匯編的方式來看看switch語句里的String(把字符串作為switch()語句的比較對象)是怎么實現的?
例如,下面的代碼:
1
2
3
4
5
6
7
8
9
10
|
// SwitchTest public class SwitchTest { public int doSwitch(String str) { switch (str) { case "abc" : return 1 ; case "123" : return 2 ; default : return 0 ; } } } |
原文轉自:http://www.anti-gravitydesign.com