java 动态编译 canino_java动态编译
在HotSpot虛擬機中,有兩個技術是至關重要的,即動態編譯(Dynamic compilation)和Profiling。
HotSpot是如何動態編譯Javad的bytecode呢?Java bytecode是以解釋方式被load到虛擬機的。HotSpot里有一個運行監視器,即Profile Monitor,專門監視程序運行中,哪一部分運用頻度大,哪些對性能影響至關重要。對于那些對程序運行效率影響交大的代碼,稱為熱點,即hot spot,HotSpot會把這些部門動態地編譯成機器碼,Native code,同時也對機器碼進行優化(類似C編譯器的一些優化),從而而提高運行效率。而那些較少運行的Code,HotSpot虛擬機就不再浪費時間把它們編譯。總的來說,HotSpot對bytecode有三層處理:不編譯,編譯,編譯并優化。
那么為什么Java采用動態編譯器而不是象C++這樣采用靜態編譯器呢?
1.虛擬機提供的跨平臺運行條件。
2.Profiling。靜態編譯器通常很難準確預知程序運行過程中究竟什么部分最需要優化。靜態編譯器雖然可以把Java全部編譯成Native Code,但卻做不到動態編譯器那樣的優化。
3.Method inlining。無論是在C還是在Java里,函數調用都是很浪費系統時間的,因為有許多進棧出棧操作。因此有一種優化辦法,就是把原來的函數調用,通過編譯器的編譯,改成非函數調用,把函數代碼直接嵌到調用出,變成順序執行。但這一方法在Java/C++這樣的面向對象的語言的編譯器中,較難很好實現。那些靜態編譯器,通??梢园裵rivate,static等函數進行Method inlining,但由于這些面向對象的語言支持函數重載,支持dynamic binding,因此靜態編譯器并不知道究竟應該把函數的哪個實現給inline了。
HotSpot的動態編譯,由于有對函數調用的監視,因此可以準確地知道一些環境下,那些被重載和動態識別的函數可以如何被inline到調用者那里去,因此實際上對于一些Server應用來說,可以大幅度提高效率。
了解了這些,就知道,有時候Java的程序甚至能比C程序運行還快。
posted on
2013-02-17 13:55
蜜雪薇琪
閱讀(147)
評論(0)
編輯
收藏
總結
以上是生活随笔為你收集整理的java 动态编译 canino_java动态编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java rocketmq消费_rock
- 下一篇: java编程题库下载_Java习题