亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java虛擬機JVM性能優化(二):編譯器

2019-11-26 15:25:19
字體:
來源:轉載
供稿:網友

本文將是JVM 性能優化系列的第二篇文章(第一篇:傳送門),Java 編譯器將是本文討論的核心內容。

本文中,作者(Eva Andreasson)首先介紹了不同種類的編譯器,并對客戶端編譯,服務器端編譯器和多層編譯的運行性能進行了對比。然后,在文章的最后介紹了幾種常見的JVM優化方法,如死代碼消除,代碼嵌入以及循環體優化。

Java最引以為豪的特性“平臺獨立性”正是源于Java編譯器。軟件開發人員盡其所能寫出最好的java應用程序,緊接著后臺運行的編譯器產生高效的基于目標平臺的可執行代碼。不同的編譯器適用于不同的應用需求,因而也就產生不同的優化結果。因此,如果你能更好的理解編譯器的工作原理、了解更多種類的編譯器,那么你就能更好的優化你的Java程序。

本篇文章突出強調和解釋了各種Java虛擬機編譯器之間的不同。同時,我也會探討一些及時編譯器(JIT)常用的優化方案。

什么是編譯器?

簡單來說,編譯器就是以某種編程語言程序作為輸入,然后以另一種可執行語言程序作為輸出。Javac是最常見的一種編譯器。它存在于所有的JDK里面。Javac 以java代碼作為輸出,將其轉換成JVM可執行的代碼―字節碼。這些字節碼存儲在以.class結尾的文件中,并在java程序啟動時裝載到java運行時環境。

字節碼并不能直接被CPU讀取,它還需要被翻譯成當前平臺所能理解的機器指令語言。JVM中還有另一個編譯器負責將字節碼翻譯成目標平臺可執行的指令。一些JVM編譯器需要經過幾個等級的字節碼代碼階段。例如,一個編譯器在將字節碼翻譯成機器指令之前可能還需要經歷幾種不同形式的中間階段。

從平臺不可知論的角度出發,我們希望我們的代碼能夠盡可能的與平臺無關。

為了達到這個目的,我們在最后一個等級的翻譯―從最低的字節碼表示到真正的機器代碼―才真正將可執行代碼與一個特定平臺的體系結構綁定。從最高的等級來劃分,我們可以將編譯器分為靜態編譯器和動態編譯器。 我們可以根據我們的目標執行環境、我們渴望的優化結果、以及我們需要滿足的資源限制條件來選擇合適的編譯器。在上一篇文章中我們簡單的討論了一下靜態編譯器和動態編譯器,在接下來的部分我們將更加深入的解釋它們。

靜態編譯 VS 動態編譯

我們前面提到的javac就是一個靜態編譯的例子。對于靜態編譯器,輸入代碼被解釋一次,輸出即為程序將來被執行的形式。除非你更新源代碼并(通過編譯器)重新編譯,否則程序的執行結果將永遠不會改變:這是因為輸入是一個靜態的輸入并且編譯器是一個靜態的編譯器。

通過靜態編譯,下面的程序:

復制代碼 代碼如下:

staticint add7(int x ){      return x+7;}

將會轉換成類似下面的字節碼:

復制代碼 代碼如下:

iload0 bipush 7 iadd ireturn

動態編譯器動態的將一種語言編譯成另外一種語言,所謂動態的是指在程序運行的時候進行編譯―邊運行邊編譯!動態編譯和優化的好處就是可以處理應用程序加載時的一些變化。Java 運行時常常運行在不可預知甚至變化的環境上,因此動態編譯非常適用于Java 運行時。大部分的JVM 使用動態編譯器,如JIT編譯器。值得注意的是,動態編譯和代碼優化需要使用一些額外的數據結構、線程以及CPU資源。越高級的優化器或字節碼上下文分析器,消耗越多的資源。但是這些花銷相對于顯著的性能提升來說是微不足道的。

JVM種類以及Java的平臺獨立性

所有JVM的實現都有一個共同的特點就是將字節碼編譯成機器指令。一些JVM在加載應用程序時對代碼進行解釋,并通過性能計數器來找出“熱”代碼;另一些JVM則通過編譯來實現。編譯的主要問題是集中需要大量的資源,但是它也能帶來更好的性能優化。

如果你是一個java新手,JVM的錯綜復雜肯定會搞得你暈頭轉向。但好消息是你并不需要將它搞得特別清楚!JVM將管理代碼的編譯和優化,你并不需要為機器指令以及采取什么樣的方式寫代碼才能最佳的匹配程序運行平臺的體系結構而操心。

從java字節碼到可執行

 一旦將你的java代碼編譯成字節碼,接下來的一步就是將字節碼指令翻譯成機器代碼。這一步可以通過解釋器來實現,也可以通過編譯器來實現。

解釋

解釋是編譯字節碼最簡單的方式。解釋器以查表的形式找到每條字節碼指令對應的硬件指令,然后將它發送給CPU執行。

你可以將解釋器想象成查字典:每一個特定的單詞(字節碼指令),都有一個具體的翻譯(機器代碼指令)與之對應。因為解釋器每讀一條指令就會馬上執行該指令,所以該方式無法對一組指令集進行優化。同時每調用一個字節碼都要馬上對其進行解釋,因此解釋器運行速度是相當慢得。解釋器以一種非常準確的方式來執行代碼,但是由于沒有對輸出的指令集進行優化,因此它對目標平臺的處理器來說可能不是最優的結果。

編譯

編譯器則是將所有將要執行的代碼全部裝載到運行時。這樣當它翻譯字節碼時,就可以參考全部或部分的運行時上下文。它做出的決定都是基于對代碼圖分析的結果。如比較不同的執行分支以及參考運行時上下文數據。

在將字節碼序列被翻譯成機器代碼指令集后,就可以基于這個機器代碼指令集進行優化。優化過的指令集存儲在一個叫代碼緩沖區的結構中。當再次執行這些字節碼時,就可以直接從這個代碼緩沖區中取得優化過的代碼并執行。在有些情況下編譯器并不使用優化器來進行代碼優化,而是使用一種新的優化序列―“性能計數”。

使用代碼緩存器的優點是結果集指令可以被立即執行而不再需要重新解釋或編譯!

這可以大大的降低執行時間,尤其是對一個方法被多次調用的java應用程序。

優化

通過動態編譯的引入,我們就有機會來插入性能計數器。例如,編譯器插入性能計數器,每次字節碼塊(對應某個具體的方法)被調用時對應的計數器就加一。編譯器通過這些計數器找到“熱塊”,從而就能確定哪些代碼塊的優化能對應用程序帶來最大的性能提升。運行時性能分析數據能夠幫助編譯器在聯機狀態下得到更多的優化決策,從而更進一步提升代碼執行效率。因為得到越多越精確的代碼性能分析數據,我們就可以找到更多的可優化點從而做出更好的優化決定,例如:怎樣更好的序列話指令、是否用更有效率的指令集來替代原有指令集,以及是否消除冗余的操作等。

例如

考慮下面的java代碼

復制代碼 代碼如下:

staticint add7(int x ){      return x+7;}

Javac 將靜態的將它翻譯成如下字節碼:
復制代碼 代碼如下:

iload0

bipush 7

iadd

ireturn


當該方法被調用時,該字節碼將被動態的編譯成機器指令。當性能計數器(如果存在)達到指定的閥值時,該方法就可能被優化。優化后的結果可能類似下面的機器指令集:
復制代碼 代碼如下:

lea rax,[rdx+7]  ret

不同的編譯器適用于不同的應用

不同的應用程序擁有不同的需求。企業服務器端應用通常需要長時間運行,所以通常希望對其進行更多的性能優化;而客戶端小程序可能希望更快的響應時間和更少的資源消耗。下面讓我們一起討論三種不同的編譯器以及他們的優缺點。

客戶端編譯器(Client-side compilers)

C1是一種大家熟知的優化編譯器。當啟動JVM時,添加-client參數即可啟動該編譯器。通過它的名字我們即可發現C1是一種客戶端編譯器。它非常適用于那種系統可用資源很少或要求能快速啟動的客戶端應用程序。C1通過使用性能計數器來進行代碼優化。這是一種方式簡單,且對源代碼干預較少的優化方式。

服務器端編譯器(Server-side compilers)

對于那種長時間運行的應用程序(例如服務器端企業級應用程序),使用客戶端編譯器可能遠遠不能夠滿足需求。這時我們應該選擇類似C2這樣的服務器端編譯器。通過在JVM啟動行中加入 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

欧美国产精品日韩| 亚洲免费av网址| 91在线观看免费高清完整版在线观看| 久久久av亚洲男天堂| 成人激情综合网| 国产精品成人一区二区三区吃奶| 国模私拍一区二区三区| 亚洲二区在线播放视频| 亚洲最大福利视频网| 欧美寡妇偷汉性猛交| 久久这里只有精品99| 亚洲综合一区二区不卡| 精品亚洲国产视频| 韩国三级日本三级少妇99| 亚洲成人免费在线视频| 国产精品久久在线观看| 久久久久久成人| 精品国产一区二区三区久久久狼| 疯狂做受xxxx高潮欧美日本| 国产成人精品免高潮在线观看| 日韩欧美黄色动漫| 91精品综合视频| 亚洲高清色综合| 久久久久久成人精品| 国产精品一区二区久久国产| 国产精品亚洲欧美导航| 国产欧美日韩中文字幕| 91精品国产乱码久久久久久久久| 亚洲在线视频观看| 久久久成人精品视频| 亚洲欧美国产一本综合首页| 97视频在线播放| 国产欧美日韩视频| 亚洲一区二区在线播放| 91av在线精品| 亚洲性视频网站| 久久久免费精品| 国产精品久久不能| 国产成人亚洲综合| 亚洲白拍色综合图区| 午夜免费久久久久| 日韩av电影在线播放| 中文字幕精品www乱入免费视频| 亚洲精品视频久久| 国内久久久精品| 欧美亚洲国产精品| 亚洲自拍偷拍色片视频| 欧美黑人巨大精品一区二区| 中文字幕久热精品视频在线| 久久久久久久久91| 色综合久久久888| 亚洲最大成人网色| 亚洲国产一区二区三区在线观看| 日韩专区在线观看| 亚洲国产另类久久精品| 夜夜嗨av一区二区三区免费区| 亚洲精品久久久久| 国产美女91呻吟求| 国产精品久久久久久久久久东京| 亚洲国产成人爱av在线播放| 伊人av综合网| 欧洲美女7788成人免费视频| 国产福利视频一区二区| 国产一区二区三区毛片| 日韩美女视频中文字幕| 亚洲成在人线av| 91免费高清视频| 亚洲激情在线视频| www国产91| 亚洲国产精品va在线看黑人动漫| 中文字幕精品久久| 亚洲无av在线中文字幕| 日韩av观看网址| 亚洲视频电影图片偷拍一区| 亚洲欧美三级在线| 亚洲成人激情在线观看| 国产精品久久久久久久一区探花| 精品久久久免费| 按摩亚洲人久久| 亚洲伊人久久综合| 国产日韩欧美黄色| 亚洲国产精品va在线| 91精品国产色综合久久不卡98口| 国产亚洲精品成人av久久ww| 国产在线a不卡| 成人欧美一区二区三区黑人孕妇| 亚洲区中文字幕| 精品国产一区二区在线| 97人洗澡人人免费公开视频碰碰碰| 久久国产精品亚洲| 久久91精品国产91久久跳| 欧美一级片免费在线| 日韩欧美国产免费播放| 中文字幕亚洲欧美日韩高清| 久久久久久免费精品| 欧美国产日韩在线| 欧美美女18p| 国产玖玖精品视频| 黄网动漫久久久| 欧美三级欧美成人高清www| 51ⅴ精品国产91久久久久久| 成人97在线观看视频| 91精品久久久久久| 日韩高清av一区二区三区| 亚洲国产一区自拍| 久久视频免费观看| 久久免费视频网站| 日韩国产精品视频| 国产日韩欧美在线看| 国产精品丝袜久久久久久高清| 亚洲黄色av网站| 国产精品一区二区在线| 另类视频在线观看| 色午夜这里只有精品| 亚洲美女自拍视频| 亚洲乱码av中文一区二区| 欧美大肥婆大肥bbbbb| 欧美日韩亚洲系列| 欧美人在线视频| 国产精品久久二区| 亚洲人永久免费| 亚洲精品视频免费在线观看| 色婷婷av一区二区三区久久| 中文字幕精品www乱入免费视频| 久久电影一区二区| 欧美一区二区大胆人体摄影专业网站| 一区二区三区高清国产| 欧美一级淫片videoshd| 亚洲日本aⅴ片在线观看香蕉| 欧美国产日本高清在线| 日韩精品极品在线观看| 在线看国产精品| 亚洲mm色国产网站| 日韩电影大片中文字幕| 亚洲另类图片色| 久久久久中文字幕2018| 国内成人精品视频| 国产精品久久久久久久久久久新郎| 中文精品99久久国产香蕉| 久久夜色精品国产亚洲aⅴ| 成人激情视频在线观看| 国产小视频国产精品| 欧美激情乱人伦| 国产日韩在线亚洲字幕中文| 97人洗澡人人免费公开视频碰碰碰| 亚洲精品在线不卡| 欧美激情一区二区三区在线视频观看| 精品视频久久久| 久久亚洲国产精品| 亚洲在线免费观看| 日本精品一区二区三区在线播放视频| 国产日韩欧美自拍| 久久久久久久久电影| 国产精品色婷婷视频| 91青草视频久久| 欧美国产日本高清在线| 久久久久久亚洲精品不卡| 亚洲人成在线免费观看| 久久精品国产精品亚洲| 午夜精品久久久久久99热软件| 精品成人乱色一区二区| 久久精品福利视频| 在线播放国产一区中文字幕剧情欧美| 亚洲天堂日韩电影|