中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)運(yùn)營知乎淮安百度推廣公司

網(wǎng)站建設(shè)運(yùn)營知乎,淮安百度推廣公司,steam網(wǎng)站代做,常州網(wǎng)站制作多少錢一、前端編譯:java設(shè)計之初就是強(qiáng)調(diào)跨平臺,通過javac將源文件編譯成于平臺無關(guān)的class文件, 它定義了執(zhí)行 Java 程序所需的所有信息(許多Java"語法糖",是在這個階段完成的,不依賴虛擬機(jī)&#xff…

一、前端編譯:

java設(shè)計之初就是強(qiáng)調(diào)跨平臺,通過javac將源文件編譯成于平臺無關(guān)的class文件, 它定義了執(zhí)行 Java 程序所需的所有信息(許多Java"語法糖",是在這個階段完成的,不依賴虛擬機(jī));同時,jvm提供了運(yùn)行時環(huán)境(JRE)——實(shí)現(xiàn)了所有特定的本地平臺支持(例如:Linux 的 Intel x86 平臺、Sun Solaris 平臺和 AIX ...的jre)。

Java 程序一個重要部分是字節(jié)碼序列,它描述了 Java 類中每個方法所執(zhí)行的操作。字節(jié)碼使用一個理論上無限大的操作數(shù)堆棧來描述計算(操作數(shù)堆棧的大小是有限制,但程序極少超出該限制,此外JVM 提供了安全性檢查,超出后進(jìn)行通知),在操作數(shù)堆棧上執(zhí)行的各種操作計算都獨(dú)立于所有本地處理器的指令集,Java 虛擬機(jī)(JVM)規(guī)范定義了這些字節(jié)碼的執(zhí)行,任何特定本地平臺的JRE 都必須遵守 JVM 規(guī)范。

因?yàn)榛诙褩5谋镜仄脚_很少(Intel X87 浮點(diǎn)數(shù)協(xié)處理器是一個明顯的例外),所以大多數(shù)本地平臺不能直接執(zhí)行 Java 字節(jié)碼。為了解決這個問題,早期的 JRE 通過解釋字節(jié)碼來執(zhí)行 Java 程序。即 JVM 在一個循環(huán)中重復(fù)操作:

獲取待執(zhí)行的下一個字節(jié)碼;

解碼;

從操作數(shù)堆棧獲取所需的操作數(shù);

按照 JVM 規(guī)范執(zhí)行操作;

將結(jié)果寫回堆棧。

這一過程稱作前端編譯。

優(yōu)點(diǎn):簡單,很方便跨平臺,JRE 開發(fā)人員只需編寫代碼來處理每種字節(jié)碼即可,并且因?yàn)橛糜诿枋霾僮鞯淖止?jié)碼少于 255 個,所以實(shí)現(xiàn)的成本比較低;

缺點(diǎn):性能比較差,因?yàn)樵谶\(yùn)行代碼時每次都要重復(fù)的解釋;

二、JIT編譯(即時編譯、動態(tài)編譯):

java設(shè)計初衷是使用解釋的方式支持應(yīng)用程序的可移植性目標(biāo),早期java運(yùn)行時提供的性能遠(yuǎn)低于C/C++之類的編譯語言(這類語言盡管性能更高,但生成的代碼只能在指定平臺上執(zhí)行),但在過去的十幾年中,Java 運(yùn)行時供應(yīng)商開發(fā)了一些復(fù)雜的動態(tài)編譯器,也稱即時編譯(Just-in-time,JIT)極大的提升了java運(yùn)行效率。JIT是在java程序運(yùn)行時,將最頻繁執(zhí)行的代碼(hot spot)編譯成本地代碼,接下來這些hot spot code直接通過機(jī)器碼執(zhí)行,省去了重復(fù)解釋。JIT執(zhí)行原理如下圖:

1、挑戰(zhàn):

1)JIT這種技術(shù),既保證了程序可移植性又提升了運(yùn)行效率,但仍會帶來運(yùn)行時性能的下降(因?yàn)樵诔绦驁?zhí)行時進(jìn)行編譯,所以編譯代碼的時間將計入程序的執(zhí)行時間。任何編寫過大型 C 或 C++ 程序的人都知道,編譯過程往往較慢)。與之相對應(yīng),C++是在運(yùn)行前編譯成本地代碼,但這犧牲了移植性。

2)Java 支持動態(tài)加載類,這對JIT的設(shè)計有著重要的影響。如果待編譯代碼引用的其他類還沒有加載怎么辦?比如一個方法需要讀取某個尚未加載的類的靜態(tài)字段值。Java 語言要求第一次執(zhí)行類引用時加載這個類并將其解析到當(dāng)前的 JVM 中。直到第一次執(zhí)行時才解析引用,這意味著沒有地址可供從中加載該靜態(tài)字段。編譯器如何處理這種可能性?編譯器生成一些代碼,用于在沒有加載類時加載并解析類。類一旦被解析,就會以一種線程安全的方式修改原始代碼位置以便直接訪問靜態(tài)字段的地址,因?yàn)榇藭r已獲知該地址。

2、優(yōu)缺點(diǎn):

1)優(yōu)點(diǎn):

Java的動態(tài)編譯有些時候能夠比靜態(tài)編譯語言生成更好的本地代碼?,F(xiàn)代的 JIT 編譯器常常向生成的代碼中插入掛鉤以收集有關(guān)程序行為的信息,以便如果要選擇方法進(jìn)行重編譯,就可以更好地優(yōu)化動態(tài)行為。舉一個例子:

一個虛方法調(diào)用需要查看接收方對象的類調(diào)用,以便找出哪個實(shí)際目標(biāo)實(shí)現(xiàn)了接收方對象的虛方法。研究表明:大多數(shù)虛調(diào)用只有一個目標(biāo)對應(yīng)于所有的接收方對象,而 JIT 編譯器可以為直接調(diào)用生成比虛調(diào)用更有效率的代碼。通過分析代碼編譯后類層次結(jié)構(gòu)的狀態(tài),JIT 編譯器可以為虛調(diào)用找到一個目標(biāo)方法,并且生成直接調(diào)用目標(biāo)方法的代碼而不是執(zhí)行較慢的虛調(diào)用。當(dāng)然,如果類層次結(jié)構(gòu)發(fā)生變化,并且出現(xiàn)另外的目標(biāo)方法,則 JIT 編譯器可以更正最初生成的代碼以便執(zhí)行虛調(diào)用。在實(shí)踐中,很少需要作出這些更正。另外,由于可能需要作出此類更正,因此靜態(tài)地執(zhí)行這種優(yōu)化非常麻煩。

總之,對于大量的 Java 應(yīng)用程序來說,動態(tài)編譯已經(jīng)彌補(bǔ)了與C++ 之類語言的靜態(tài)本地編譯性能之間的差距,在某些情況下,甚至超過了后者的性能。

2)缺點(diǎn):

由于識別、編譯hot spot code 都需要一定的時間,所以應(yīng)用程序通常要經(jīng)歷一個準(zhǔn)備過程。其次,JIt在運(yùn)行時也會帶來一定的性能損失,有些應(yīng)用可能無法容忍。

三、AOT編譯(靜態(tài)編譯):

由于動態(tài)編譯技術(shù)的多項(xiàng)改進(jìn),在很多應(yīng)用程序中,現(xiàn)代的 JIT 編譯器可以產(chǎn)生與 C 或 C++ 靜態(tài)編譯相當(dāng)?shù)膽?yīng)用程序性能。但是,仍然有很多軟件開發(fā)人員認(rèn)為動態(tài)編譯可能嚴(yán)重干擾程序操作,所以有另外一些開發(fā)人員強(qiáng)烈呼吁對 Java 代碼進(jìn)行靜態(tài)編譯(Ahead-of-time AOT),并且堅信那樣可以解決性能問題。目的在于避免 JIT 編譯器的運(yùn)行時性能消耗或內(nèi)存消耗或CPU共享,以及避免解釋程序的早期性能開銷。

人們希望java能像C++一樣在運(yùn)行之前編譯生成本地代碼,但不幸的是Java 語言本身的動態(tài)特性帶來了額外的復(fù)雜性,影響了 Java 程序靜態(tài)編譯代碼的質(zhì)量。

1、挑戰(zhàn):

動態(tài)類加載是動態(tài) JIT 編譯器面臨的一個挑戰(zhàn),也是 AOT 編譯的一個更重要的問題。只有在執(zhí)行代碼引用類的時候才加載該類。因?yàn)槭窃诔绦驁?zhí)行前進(jìn)行 AOT 編譯的,所以編譯器無法預(yù)測加載了哪些類。就是說編譯器無法獲知任何靜態(tài)字段的地址、任何對象的任何實(shí)例字段的偏移量或任何調(diào)用的實(shí)際目標(biāo),甚至對直接調(diào)用(非虛調(diào)用)也是如此。在執(zhí)行代碼時,如果證明對任何這類信息的預(yù)測是錯誤的,這意味著一切都將完蛋!

此外,Java 代碼可能在程序執(zhí)行前根本不存在:比如 Java 反射服務(wù)通常在運(yùn)行時生成新類來支持程序的行為。

缺少關(guān)于靜態(tài)、字段、類和方法的信息意味著嚴(yán)重限制了 Java 編譯器中優(yōu)化框架的大部分功能。內(nèi)聯(lián)可能是靜態(tài)或動態(tài)編譯器應(yīng)用的最重要的優(yōu)化,但是由于編譯器無法獲知調(diào)用的目標(biāo)方法,因此無法再使用這種優(yōu)化。

2、內(nèi)聯(lián):

內(nèi)聯(lián)是一種用于在運(yùn)行時生成代碼避免程序開始和結(jié)束時開銷的技術(shù),方法是將函數(shù)的調(diào)用代碼插入到調(diào)用方的函數(shù)中。但是內(nèi)聯(lián)最大的益處可能是優(yōu)化方可見的代碼的范圍擴(kuò)大了,從而能夠生成更高質(zhì)量的代碼。下面是一個內(nèi)聯(lián)前的代碼示例:

int foo() { int x=2, y=3; return bar(x,y); }final int bar(int a, int b) { return a+b; }

如果編譯器可以證明這個 bar就是 foo()中調(diào)用的那個方法,則 bar中的代碼可以取代 foo()中對 bar()的調(diào)用。這時,bar()方法是 final類型,因此肯定是 foo()中調(diào)用的那個方法。甚至在一些虛調(diào)用例子中,動態(tài) JIT 編譯器通常能夠推測性地內(nèi)聯(lián)目標(biāo)方法的代碼,并且在絕大多數(shù)情況下能夠正確使用。編譯器將生成以下代碼:

int foo() { int x=2, y=3; return x+y; }

2、優(yōu)缺點(diǎn):

優(yōu)點(diǎn):合理的使用AOT,可以提高運(yùn)行效率;

缺點(diǎn):靜態(tài)(AOT)編譯器則犧牲了平臺無關(guān)性和代碼質(zhì)量,因?yàn)樗鼈儾荒芾贸绦虻膭討B(tài)行為,也不具有關(guān)于加載的類或類層次結(jié)構(gòu)的信息。

-----------------------------------

?著作權(quán)歸作者所有:來自51CTO博客作者趕路人兒的原創(chuàng)作品,請聯(lián)系作者獲取轉(zhuǎn)載授權(quán),否則將追究法律責(zé)任

Java編譯方式總結(jié):前端編譯、JIT編譯、AOT編譯

http://www.risenshineclean.com/news/62781.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)注意企業(yè)網(wǎng)站設(shè)計代碼
  • 朝陽做網(wǎng)站的公司杭州百度整站優(yōu)化服務(wù)
  • 石家莊網(wǎng)站建站公司百度廣告位價格
  • 怎樣下載網(wǎng)頁上的視頻如何將網(wǎng)站的關(guān)鍵詞排名優(yōu)化
  • 做網(wǎng)站的書籍推薦網(wǎng)絡(luò)小說網(wǎng)站三巨頭
  • 網(wǎng)站加載特效聊城網(wǎng)站推廣的公司
  • 沙井網(wǎng)站建設(shè)嵌入式培訓(xùn)
  • 以遇見為主題做網(wǎng)站蘇州疫情最新通知
  • 清遠(yuǎn)建網(wǎng)站的公司seo軟文推廣工具
  • 做的網(wǎng)站每年都要交費(fèi)嗎搜索引擎優(yōu)化
  • 網(wǎng)站精品案例推廣運(yùn)營是做什么的
  • 漢中網(wǎng)站建設(shè)百度搜索資源平臺token
  • 微商怎么做網(wǎng)站深圳網(wǎng)絡(luò)推廣收費(fèi)標(biāo)準(zhǔn)
  • 小清新個人網(wǎng)站今日頭條新聞發(fā)布
  • 企業(yè)家居網(wǎng)站建設(shè)東莞seo建站
  • 網(wǎng)站flash引導(dǎo)頁下載廣州最新疫情最新消息
  • 做投資的網(wǎng)站好百度搜索官網(wǎng)
  • b2b電子商務(wù)的模式有哪些seo是指什么崗位
  • 嘉興快速建站合作阿里云域名注冊官網(wǎng)網(wǎng)址
  • 做的網(wǎng)站百度沒收錄關(guān)鍵詞舉例
  • 怎么看網(wǎng)站是用什么程序做的百度網(wǎng)頁電腦版入口
  • 簡單網(wǎng)頁html模板西安的網(wǎng)絡(luò)優(yōu)化公司
  • 網(wǎng)站建設(shè) 網(wǎng)址導(dǎo)航網(wǎng)站seo啥意思
  • 常州免費(fèi)網(wǎng)站制作百度推廣登錄后臺登錄入口
  • 做外包胡it網(wǎng)站有哪些網(wǎng)頁設(shè)計公司
  • 建個可以注冊會員網(wǎng)站多少錢陽泉seo
  • 做網(wǎng)站運(yùn)維應(yīng)該看的書朋友圈產(chǎn)品推廣文案
  • 玉林市城鄉(xiāng)建設(shè)委員會網(wǎng)站什么軟件可以免費(fèi)引流
  • 百度站長工具鏈接提交長沙優(yōu)化網(wǎng)站
  • 網(wǎng)站建設(shè)銷售好做合肥seo網(wǎng)站排名