亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java編譯和解釋執(zhí)行對比及原理解析

 更新時間:2020年05月11日 09:45:41   作者:噠噠Da  
這篇文章主要介紹了Java編譯和解釋執(zhí)行對比及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

編程語言分為低級語言和高級語言,機器語言、匯編語言是低級語言,C、C++、java、python等是高級語言。

機器語言是最底層的語言,能夠直接執(zhí)行。而我們編寫的源代碼是人類語言, 計算機只能識別某些特定的二進制指令,在程序真正運行之前必須將源代碼轉換成二進制指令。

匯編語言通過匯編器翻譯成機器指令后執(zhí)行,一條匯編指令,對應著一條機器指令。

高級語言編程的程序有三種執(zhí)行方式:

1.一種是編譯執(zhí)行,源程序先通過編譯器(負責將源程序翻譯成目標機器指令)翻譯成機器指令,通過編譯-->鏈接-->目標可執(zhí)行文件,然后執(zhí)行;即提前將所有源代碼一次性轉換成二進制指令,也就是生成一個可執(zhí)行程序。比如C,C++等語言都是編譯執(zhí)行的。

2.一種是解釋執(zhí)行,是使用解釋器會將我們的一句句代碼解釋成機器可以識別的二進制代碼來執(zhí)行,可以認為是,解釋一句,執(zhí)行一句。在這個過程中,不會生成中間文件。如:腳本方式是一條條命令,在執(zhí)行時,是由系統(tǒng)的解釋器,將其一條條翻譯成機器可識別的指令,例如shell腳本是由shell程序執(zhí)行的,js是由瀏覽器解釋執(zhí)行的。

3.最后一種是編譯和解釋相結合的執(zhí)行方式,下面我們來說Java。

理解Java的幾個編譯器

前端編譯器:把.java文件轉變成.class文件。包括Sun的Javac、Eclipse JDT中的增量式編輯器(ECJ)

后端運行期即時編譯器(JIT編譯器,Just In Time Compiler):把字節(jié)碼轉成機器碼。包括HotSpot VM的C1、C2編譯器

靜態(tài)提前編譯器(AOT編譯器,Ahead Of Time Compiler):把*.java編譯成本地機器碼。包括GNU Compiler for the Java(GCJ)、Excelsior JET

Java采用的是解釋和編譯混合的模式

在編譯時期,我們通過將源代碼編譯成.class ,配合JVM這種跨平臺的抽象,屏蔽了底層計算機操作系統(tǒng)和硬件的區(qū)別,實現(xiàn)了“一次編譯,到處運行” 。 而在運行時期,目前主流的JVM 都是混合模式(-Xmixed),即解釋運行 和編譯運行配合使用。

Java一開始被定位為“解釋執(zhí)行”的語言,但是現(xiàn)在主流的虛擬機中都包含了即時編譯器JIT。

程序從源代碼到運行經(jīng)歷階段:java程序--(編譯javac)-->字節(jié)碼文件.class-->類裝載子系統(tǒng)化身為反射類Class--->運行時數(shù)據(jù)區(qū)--->(解釋執(zhí)行+JIT編譯器編譯)-->操作系統(tǒng)(Win,Linux,Mac JVM)。

.class文件就是可以到處運行的文件。然后Java字節(jié)碼會被轉化為目標機器代碼,這是是由JVM來執(zhí)行的,即Java的第二次編譯。

Java采用的是解釋和編譯混合的模式。它首先通過javac將源碼編譯成字節(jié)碼文件class.然后在運行的時候通過解釋器或者JIT將字節(jié)碼轉換成最終的機器碼。

JIT將字節(jié)碼轉換成最終的機器碼:

以 Oracle JDK提供的HotSpot虛擬機為例,在HotSpot虛擬機中,提供了兩種編譯模式:解釋執(zhí)行 和 即時編譯(JIT,Just-In-Time)。解釋執(zhí)行即逐條翻譯字節(jié)碼為可運行的機器碼,而即時編譯則以方法為單位將字節(jié)碼翻譯成機器碼(上述提到的“編譯執(zhí)行”)。前者的優(yōu)勢在于不用等待,后者則在實際運行當中效率更高。

  即時編譯存在的意義在于它是提高程序性能的重要手段之一。根據(jù)“二八定律”(即:百分之二十的代碼占據(jù)百分之八十的系統(tǒng)資源),對于大部分不常用的代碼,我們無需耗時間將之編譯為機器碼,而是采用解釋執(zhí)行的方式,用到就去逐條解釋運行;對于一些僅占據(jù)小部分的熱點代碼(可認為是反復執(zhí)行的重要代碼),則可將之翻譯為符合機器的機器碼高效執(zhí)行,提高程序的效率,此為運行時的即時編譯。

  為了滿足不同的場景,HotSpot虛擬機內(nèi)置了多個即時編譯器:C1,C2與Graal。Graal 是Java10正式引入的實驗性即時編譯器,在此暫不敘述(其實我不是很了解,尷尬···)。先看一下C1、C2 ,相信大家或多或少接觸過。

  • C1:即Client編譯器,面向?qū)有阅苡幸蟮目蛻舳薌UI程序,采用的優(yōu)化手段比較簡單,因此編譯的時間較短。
  • C2:即Server編譯器,面向?qū)π阅芊逯涤幸蟮姆斩顺绦颍捎玫膬?yōu)化手段復雜,因此編譯時間長,但是在運行過程中性能更好。

從Java7開始,HotSpot虛擬機默認采用分層編譯的方式:熱點方法首先被C1編譯器編譯,而后 熱點方法中的熱點再進一步被C2編譯,根據(jù)前面的運行計算出更優(yōu)的編譯優(yōu)化。為了不干擾程序的正常運行,JIT編譯時放在額外的線程中執(zhí)行的,HotSpot根據(jù)實際CPU的資源,以 1:2的比例分配給C1和C2線程數(shù)。在計算機資源充足的情況,字節(jié)碼的解釋運行和編譯運行時可以同時進行,JIT編譯執(zhí)行完后的機器碼會在下次調(diào)用該方法時啟動,已替換原本的解釋執(zhí)行(意思就是已經(jīng)翻譯出效率更高的機器碼,自然替換原來的相對低效率執(zhí)行的方法)。

  以上,可以看出在Java中不單單是解釋執(zhí)行,即時編譯(編譯執(zhí)行)在Java性能優(yōu)化中彰顯重要的作用,所以現(xiàn)在應該說:Java是解釋執(zhí)行和編譯執(zhí)行共同存在的,至少大部分是這樣。

編譯與解釋比較?

1.一段程序編譯會浪費時間,并且移植到其他平臺上時還要進行重新編譯,但是其編譯后生成的可執(zhí)行文件運行速度快。

2.解釋型程序可跨平臺執(zhí)行,無需將全部代碼編譯之后再運行,能夠及時運行,但因為是逐條解釋執(zhí)行所以最終的運行速度不如編譯型程序。

3.內(nèi)存使用:編譯執(zhí)行需要生成編譯后的機器碼文件,而解釋執(zhí)行時逐句解釋執(zhí)行,所以解釋執(zhí)行對內(nèi)存占用更少。

單獨使用解釋器的缺點:

拋棄了JIT可能帶來的性能優(yōu)勢。如果代碼沒有被JIT編譯的話,再次運行時需要重復解析。

單獨使用JIT編譯器的缺點:

需要將全部的代碼編譯成本地機器碼。要花更多的時間,JVM啟動會變慢非常多;

增加可執(zhí)行代碼的長度(字節(jié)碼比JIT編譯后的機器碼小很多),這將導致頁面調(diào)度,從而降低程序的速度。

有些JIT編譯器的優(yōu)化方式,比如分支預測,如果不進行profiling,往往并不能進行有效優(yōu)化。

因此,HotSpot采用了惰性評估(Lazy Evaluation)的做法,根據(jù)二八定律,消耗大部分系統(tǒng)資源的只有那一小部分的代碼(熱點代碼),而這也就是JIT所需要編譯的部分。JVM會根據(jù)代碼每次被執(zhí)行的情況收集信息并相應地做出一些優(yōu)化,因此執(zhí)行的次數(shù)越多,它的速度就越快。

JDK 9引入了一種新的編譯模式AOT(Ahead of Time Compilation),它是直接將字節(jié)碼編譯成機器碼,這樣就避免了JIT預熱等各方面的開銷。JDK支持分層編譯和AOT協(xié)作使用。

注:JIT為方法級,它會緩存編譯過的字節(jié)碼在CodeCache中,而不需要被重復解釋。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java代碼編譯和反編譯的那些事兒

    Java代碼編譯和反編譯的那些事兒

    這篇文章主要給大家介紹了關于Java代碼編譯和反編譯的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Spring概述和快速構建的方式

    Spring概述和快速構建的方式

    Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器(框架),Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情,本文給大家介紹spring概述和快速構建方式,一起看看吧
    2021-06-06
  • 教你怎么用Java數(shù)組和鏈表實現(xiàn)棧

    教你怎么用Java數(shù)組和鏈表實現(xiàn)棧

    本篇文章為大家詳細介紹了怎么用Java數(shù)組和鏈表實現(xiàn)棧,文中有非常詳細的代碼示例及注釋,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot整合Thymeleaf小項目及詳細流程

    SpringBoot整合Thymeleaf小項目及詳細流程

    這篇文章主要介紹了SpringBoot整合Thymeleaf小項目,本項目使用SpringBoot開發(fā),jdbc5.1.48,主要涉及到Mybatis的使用,Thymeleaf的使用,用戶密碼加密,驗證碼的設計,圖片的文件上傳(本文件上傳到本地,沒有傳到數(shù)據(jù)庫)登錄過濾,需要的朋友可以參考下
    2022-03-03
  • Spring Boot整合Thymeleaf詳解

    Spring Boot整合Thymeleaf詳解

    這篇文章主要介紹了Spring Boot整合Thymeleaf詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • SpringBoot整合Caffeine實現(xiàn)本地緩存的實踐分享

    SpringBoot整合Caffeine實現(xiàn)本地緩存的實踐分享

    緩存是提升系統(tǒng)性能的一個不可或缺的工具,通過緩存可以避免大部分重復的請求到數(shù)據(jù)庫層,減少IO鏈接次數(shù),提升整體的響應速率,本地緩存中比較常見的比如 Caffeine 緩存,這篇文章將結合具體的 Springboot 項目搭配 Caffeine 實現(xiàn)本地緩存的各種使用方式
    2024-07-07
  • java實現(xiàn)人民幣大小寫轉換方法分享

    java實現(xiàn)人民幣大小寫轉換方法分享

    本文介紹java人民幣數(shù)字大小寫轉換方法,代碼中有注釋,大家直接看代碼吧
    2014-01-01
  • 使用SpringBoot獲取resources文件路徑

    使用SpringBoot獲取resources文件路徑

    這篇文章主要介紹了使用SpringBoot獲取resources文件路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java并發(fā)無鎖多線程單線程示例詳解

    java并發(fā)無鎖多線程單線程示例詳解

    這篇文章主要為大家介紹了java并發(fā)無鎖多線程單線程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java注解實現(xiàn)動態(tài)數(shù)據(jù)源切換的實例代碼

    Java注解實現(xiàn)動態(tài)數(shù)據(jù)源切換的實例代碼

    本篇文章主要介紹了Java注解實現(xiàn)動態(tài)數(shù)據(jù)源切換的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論