JVM學習-執行引擎

執行引擎

  1. 執行引擎是Java虛擬機核心組成部分之一
  2. 虛擬機是一個相對于物理機的概念,這兩種機器都有代碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、緩存、指令集和操作系統層面上的,而虛擬機的執行引擎是由軟件自行實現的,因此可以不受物理條件制約地定制指令集與執行引擎的結構體系,能夠執行那些不被硬件直接支持的指令集格式
  3. JVM主要任務負責裝載字節碼到其內部,但字節碼并不能直接運行在操作系統上,因為字節碼指令并非等價于本地機器指令,它內部包含的僅只是一些能夠被JVM所識別的字節碼指令、符號表、以及其他輔助信息。
  4. 如果一個Java程序運行起來,執行引擎的任務就是將字節碼指令解釋/編譯為對應平臺上的本地機器指令才可以,JVM的執行引擎充當了將高級語言翻譯為機器語言的翻譯者
執行引擎工作過程
  1. 執行引擎在執行的過程中究竟需要執行什么樣的字節碼指令完全依賴于PC寄存器
  2. 每當執行完一項指令操作后,PC寄存器就會更新下一條需要執行的指令地址
  3. 當方法在執行的過程中,執行引擎有可能會通過存儲在局部變量表中的對象引用準備定位到存儲在Java堆區中的對象實例信息,以及通過對象頭中的元數據指針定位目標對象的類型信息

在這里插入圖片描述

Java代碼編譯和執行
  • 大部分的程序代碼轉換為物理機的目標代碼或虛擬機能執行的指令集之前,都需要經過下圖各個步驟
    在這里插入圖片描述

  • Java代碼編譯是由Java源碼編譯器來完成,流程圖如下
    在這里插入圖片描述

  • Java字節碼的執行是由JVM執行引擎來完成
    在這里插入圖片描述

  • 什么是解釋器(Interpreter),什么是JIT編譯器

  • 解釋器:當Java虛擬機啟動時會根據預定義的規范對字節碼采用逐行解釋的方式執行,將每條字節碼文件中的內容翻譯為對應平臺的本地機器指令執行
  • JIT(Just In Time Compiler)編譯器:虛擬機將源代碼直接編譯成和本地機器平臺相關的機器語言

在這里插入圖片描述

機器碼
  • 各種用于進制編碼方式表示的指令,叫機器指令碼
  • 機器語言雖然被計算機理解和接受,但和人們的語言差別太大,不易被人們理解和記憶,并且編程容易出錯
  • 用它編寫的程序一經輸入計算機,CPU直接讀取執行,執行速度更快
  • 機器指令與CPU緊密相關,所以不同種類CPU所對應的機器指令不同
指令
  • 由于機器碼有0和1組成二進制序列,可讀性差,人們發明了指令
  • 指令就是把機器中的0和1序列,簡化成對應的指令,可讀性稍好
  • 由于不同硬件平臺,執行同一個操作,對應的機器碼可能不同,所以不同硬件平臺的同一種指令,對應機器碼不同
指令集
  • 不同硬件平臺,各自支持的指令,是有差別的,每個平臺所支持的指令稱之為對應平臺的指令集
  • x86指令集,對應的是x86架構的平臺
  • ARM指令集,對應的是Arm架構的平臺
匯編語言
  • 由于指令的可讀性還是太差,于是人們發明了匯編語言
  • 在匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數地址
  • 在不同硬件平臺,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器語言
    • 由于計算機只認識指令碼所以匯編還必須翻譯成機器指令碼,計算機才能識別和執行
高級語言
  • 為了使計算機用戶編寫程序更容易,后來出現了更接近人類的高級語言
  • 當計算機執行高級語言編寫的程序時,仍然需要把程序解釋和編譯成機器的指令碼,完成這個過程的程序叫解釋程序或編譯程序
    在這里插入圖片描述
字節碼
  • 字節碼是一種中間狀態的二進制代碼,它比機器碼更抽象,需要直譯器轉譯后才能成為機器碼
  • 字節碼主要為了實現特定軟件運行和軟件環境、硬件環境無關
  • 字節碼實現方式是通過編譯器和虛擬機器,編譯器將源碼編譯成字節碼
    • 字節碼的典型應用為Java bytecode
      在這里插入圖片描述
解釋器
  • JVM設計進初衷只是單純為了滿足Java程序實現跨平臺特性,因此避免采用靜態編譯的方式直接生成本地機器指令,從而誕生了實現解釋器在運行時采用逐行解釋字節碼執行程序的想法
  • 解釋器真正意義上所承擔的角色就是一個運行時“翻譯者”,將字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行
  • 當一條字節碼指令被解釋執行完成后,接著再根據PC寄存器中記錄的下一條需要被執行的字節碼指令執行解釋操作
  • 在Java發展歷史中,一共有兩套解釋器,一種為古老的字節碼解釋器,另一種為目前使用的模板解釋器
    • 字節碼解釋器在執行時通過純軟件代碼模氛字節碼的執行,效率非常低下
    • 模板解釋字將每一條字節碼和一個模板函數相關聯,模板函數直接產生這條字節碼執行時的機器碼,從而很大程度上提高了解釋器的性能
      • 在Hotspot VM中,解釋器由Interpreter模塊和Code模塊構成。
        • Intercepter實現了解釋器的核心功能
        • Code模塊用于管理Hotspot VM在運行時生成的本地機器指令
JIT編譯器
  • 前端編譯器
    • Sun的Javac
    • Eclipse JDT中的增量式編譯器(ECJ)
  • 后端編譯器
    • JIT編譯器(后端運行期編譯器)
      • Hotspot VM的C1、C2編譯器
    • AOT編譯器(靜態提前編譯器)
      • GNU Compiler for the Java(GCJ)
      • Excelsior JET
有了JIT,為什么還需要解釋器
  • 當程序啟動后,解釋器可以馬上發揮作用,省去編譯時間,立即執行
  • 編譯器要想發揮作用,把代碼編譯成本地代碼,需要一定的執行時間,但編譯為本地代碼后,執行效率高
  • 對于服務器端應用,啟動時間并非是關注重點,但對于看中啟動時間的應用場景而言,采用解釋器與即時編譯器共存的架構換取一個平衡點,Java虛擬機啟動時,解釋器可以首先發揮作用,而不必等待即時編譯器全部編譯完成后再執行,這樣可以省去許多不必要的編譯時間,隨著時間推移,編譯器發揮作用,根據熱點探測功能,把越來越多的代碼編譯成本地代碼,獲得更高的執行效率
  • 解釋執行在編譯激進優化不成立時,作為編譯器的“逃生門”
熱點代碼及探測方式

當然是否需要啟動JIT編譯器將字節碼直接編譯為對應平臺的本地機器指令,則需要根據代碼被調用執行的頻率而定,關于那些需要被編譯為本地代碼的字節碼,稱為“熱點代碼”,JIT編譯器在運行時會針對那些頻繁被調用的熱點代碼做出深度優化,將其直接編譯為對應平臺的本地機器指令,以此提升Java程序的執行性能。

  • 一個被多次調用的方法,或一個方法體內部循環次數較多的循環體都可以被稱為熱點代碼,因此可以通過JIT編譯為本地機器指令,由于這種編譯方式發生在方法的執行過程中,因此稱為棧上替換或OSR(On Stack Replacement)編譯
  • 一個方法究竟要被調用多少次,或者循環體究竟需要執行多少次循環才可以達到這個標準,需要一個明確的閾值,依靠熱點探測功能
  • 目前Hotspot采用基于計數器的熱點探測
  • 采用計數器的熱點探測,Hotspot VM將為每個方法建立2個不同類型的計數器,分別為方法調用計數器(Invocation Counter)和回邊計數器(Back Edge Counter)
    • 方法調用計數器用于統計方法的調用次數
      • 默認閾值在Client模式下1500次,在Server模式下10000次,超過這個閾值,會觸發JIT編譯
      • 閾值可能通過虛擬機參數-XX:CompileThreshold來人為設定
      • 當一個方法被調用時,會先檢查該方法是否存在被JIT編譯過的版本,如果存在,則優先使用編譯后的本地代碼來執行,不存在,則將此方法的調用計數器加1,然后判斷方法調用計數器與回邊計數器之各是否超過方法閾值。如果超過,那么將會向即時編譯器提交一個該方法的代碼編譯請求
      • 熱度衰減
        • 如果不做任何設置,方法調用計數器統計的并不是方法被調用的絕對次數,而是一個相對的執行頻率,即一段時間之內方法被調用的次數。當超過一定的時間限制,如果方法的調用次數仍然不足以讓它提交給即時編譯器編譯,那這個方法的調用計數器就會被減少一半,這個過程稱為方法調用計數器熱度的衰減(Counter Decay),而這段時間稱為方法統計的半衰周期(Counter Half Life Time)
        • 進行熱度衰減的動作是在虛擬機進行垃圾收集時順便進行的,可以使用虛擬機參數-XX:-UseCounterDecay來關閉熱度衰減,讓方法計數器統計方法調用的絕對次數,這樣,只要系統運行時間足夠長,絕大部分方法都會被編譯成本地代碼
        • 另外,可以使用-XX:CounterHalfLifeTime參數設置半衰周期的時間,單位秒
    • 回邊計數器用于統計循環體執行的循環次數
      • 在字節碼中遇到控制流向后跳轉的指令稱為“回邊”,建立回邊計數器統計的目的是為了觸發OSR編譯
        在這里插入圖片描述
修改VM編譯模式
  • -Xint:完全采用解釋器模式執行程序
  • -XComp:完全采用即時編譯器模式,如即時編譯出現問題,解釋器會介入執行
  • -Xmixed:采用解釋器和即時編譯器混合模式共同執行程序(默認)
/*** 測試三種模式* -Xint:花費時間:4453* -Xcomp:花費時間:594* -Xmixed:花費時間:672*/
public class IntCompTest {public static void main(String[] args) {long start = System.currentTimeMillis();testPrimeNumber(1000000);long end = System.currentTimeMillis();System.out.println("花費時間:" + (end - start));}private static void testPrimeNumber(int counter) {for (int i = 0; i < counter; i++) {//計算100內質數label:for (int j = 2; j < 100; j++) {for (int k = 2; k<=Math.sqrt(j); k++) {if (j % k == 0) {continue label;}}}}}
}
Hotspot JIT分類
  • Client Compiler
      • client:指定Java虛擬機運行在Client模式下,并使用C1編譯器
    • C1編譯器會對字節碼進行簡單和可靠的優化,耗時短,以達到更快的編譯速度
    • 優化策略
      • 方法內聯:將引用的函數代碼編譯到引用點處,這樣可以減少棧幀的生成,減少參數傳遞以及跳轉過程
      • 去虛擬化:對唯一的實現類進行內聯
      • 冗余消除:在運行期間把一些不會執行的代碼折疊掉
  • Server Compiler
    • -server:指定Java虛擬機運行在Server模式下,并使用C2編譯器
      • C2進行耗時較長的優化,以及激進優化,但優化代碼執行效率更高
      • 優化策略,在全局層面,逃逸分析是優化基礎
        • 標量替換:用于標量值代替聚合對象的屬性值
        • 線上分配:對于未逃逸的對象分配對象在棧而不在堆
        • 同步消除:消除同步操作,通常指sychronized

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15693.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法】遞歸、搜索與回溯——簡介

簡介&#xff1a;遞歸、搜索與回溯&#xff0c;本節博客主要是簡單記錄一下關于“遞歸、搜索與回溯”的相關簡單概念&#xff0c;為后續算法做鋪墊。 目錄 1.遞歸1.1遞歸概念2.2遞歸意義2.3學習遞歸2.4寫遞歸代碼步驟 2.搜索3.回溯與剪枝 遞歸、搜索、回溯的關系&#xff1a; …

ICML2024 定義新隱私保護升級:DP-BITFIT新型微調技術讓AI模型學習更安全

DeepVisionary 每日深度學習前沿科技推送&頂會論文分享&#xff0c;與你一起了解前沿深度學習信息&#xff01; 引言&#xff1a;差分隱私在大模型微調中的重要性和挑戰 在當今的深度學習領域&#xff0c;大型預訓練模型的微調已成為提高各種任務性能的關鍵技術。然而&am…

推特熱帖:大語言模型自薦能夠替代的20種人類工作!快來看你是否需要轉行!

最近推特上有一個例子引起了廣泛的討論&#xff0c;事情的起因是這樣的&#xff1a;網友讓 GPT-4o 預測一下自己未來將會替代人類哪些工作&#xff1f; 這聽起來很有趣&#xff01;GPT-4o會給出什么樣的預測呢&#xff1f; 3.5研究測試&#xff1a;hujiaoai.cn 4研究測試&…

02-Linux【基礎篇】

一、Linux的目錄結構 1.基本介紹 Linux的文件系統采用層級式的樹狀目錄結構&#xff0c;在此結構中的最上層是根目錄"/"&#xff0c;然后在此目錄下再創建其他的目錄 深刻理解Linux樹狀文件目錄是非常重要的 記住一句經典的話&#xff1a;在Linux世界里&#xff…

如何在 DigitalOcean Droplet 云主機上創建 Ubuntu 服務器

在本文中&#xff0c;你將通過 DigitalOcean 的管理面板創建一個 Ubuntu 服務器&#xff0c;并將其配置為使用你的 SSH 密鑰。設置好服務器后&#xff0c;你可以在其上部署應用程序和網站。 本教程是DigitalOcean云課程簡介的一部分&#xff0c;它指導用戶完成將應用程序安全地…

win10右鍵沒有默認打開方式的選項的處理方法

問題描述 搞了幾個PDF書籍學習一下&#xff0c;不過我不想用默認的WPS打開&#xff0c;因為WPS太惡心人了&#xff0c;占用資源又高。我下載了個Sumatra PDF&#xff0c;這時候我像更改pdf文件默認的打開程序&#xff0c;發現右擊沒有這個選項。 問題解決 右擊文件–屬性–…

汽車以太網發展現狀及挑戰

一、汽車以太網技術聯盟 目前推動汽車以太網技術應用與發展的組織包括&#xff1a;OPEN Alliance&#xff08;One-Pair Ether-Net Alliance SIG&#xff09;聯盟&#xff0c;主要致力于汽車以太網推廣與使用&#xff0c;該聯盟通過推進 BroadR- Reach 單對非屏蔽雙絞線以太網傳…

設計新境界:大數據賦能UI的創新美學

設計新境界&#xff1a;大數據賦能UI的創新美學 引言 隨著大數據技術的蓬勃發展&#xff0c;它已成為推動UI設計創新的重要力量。大數據不僅為界面設計提供了豐富的數據資源&#xff0c;還賦予了設計師以全新的視角和工具來探索美學的新境界。本文將探討大數據如何賦能UI設計…

面試八股之JVM篇3.5——垃圾回收——G1垃圾回收器

&#x1f308;hello&#xff0c;你好鴨&#xff0c;我是Ethan&#xff0c;一名不斷學習的碼農&#xff0c;很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 &#x1f3c3;人生之義&#xff0c;在于追求&#xff0c;不在成敗&#xff0c;勤通…

1688. 比賽中的配對次數

題目&#xff1a; 給你一個整數 n &#xff0c;表示比賽中的隊伍數。比賽遵循一種獨特的賽制&#xff1a; 如果當前隊伍數是 偶數 &#xff0c;那么每支隊伍都會與另一支隊伍配對。總共進行 n / 2 場比賽&#xff0c;且產生 n / 2 支隊伍進入下一輪。 如果當前隊伍數為 奇數 …

python梯度下降法求解三元線性回歸系數,并繪制結果

import numpy as np import matplotlib.pyplot as plt # 生成隨機數據 np.random.seed(0) X1 2 * np.random.rand(100, 1) X2 3 * np.random.rand(100, 1) X3 4 * np.random.rand(100, 1) y 4 3 * X1 5 * X2 2 * X3 np.random.randn(100, 1) # 合并特征 X_b np.hsta…

Vue中組件之間的通信有哪些方法

在Vue中&#xff0c;組件之間的通信有多種方法&#xff0c;以下是一些常見的方法&#xff1a; Props和$emit&#xff1a; 父組件通過props向子組件傳遞數據。子組件通過$emit觸發事件&#xff0c;將數據傳遞給父組件。 provide和inject&#xff1a; 在Vue 2.2.0版本中引入的選…

云計算-特殊機制(Specialsed Mechanisms)

自動擴展監聽器 (Automated Scaling Listener) 自動擴展監聽器是一種特定類型的服務代理。它運行在云提供商的網絡中&#xff0c;監控云消費者和云服務之間的網絡流量。通過分析消費者和服務之間的消息量和類型&#xff0c;它可以測量云服務的負載。 自動擴展監聽器對變化的負載…

常見 JVM 面試題補充

原文地址 : 26 福利&#xff1a;常見 JVM 面試題補充 (lianglianglee.com) CMS 是老年代垃圾回收器&#xff1f; 初步印象是&#xff0c;但實際上不是。根據 CMS 的各個收集過程&#xff0c;它其實是一個涉及年輕代和老年代的綜合性垃圾回收器。在很多文章和書籍的劃分中&…

SpringCloud Alibaba的相關組件的簡介及其使用

Spring Cloud Alibaba是阿里巴巴為開發者提供的一套微服務解決方案&#xff0c;它基于Spring Cloud項目&#xff0c;提供了一系列功能強大的組件&#xff0c;包括服務注冊與發現、配置中心、熔斷與限流、消息隊列等。 本文將對Spring Cloud Alibaba的相關組件進行簡介&#xff…

React Native 之 動畫Animated(十二)

react-native 的 Animated API提供了一種聲明式的方式來創建平滑的動畫效果。它允許你編寫動畫邏輯&#xff0c;并將動畫值直接綁定到組件的樣式或布局屬性上。 react-native 的 Animated 庫通過以下方式工作&#xff1a; 創建動畫值&#xff1a;首先&#xff0c;你需要使用 A…

ROCm上運行預訓練BERT

14.10. 預訓練BERT — 動手學深度學習 2.0.0 documentation (d2l.ai) 下載數據集 在d2l-zh/pytorch/data目錄解壓&#xff1a; ~/d2l-zh/pytorch/data$ unzip wikitext-2-v1.zip Archive: wikitext-2-v1.zipcreating: wikitext-2/inflating: wikitext-2/wiki.test.tokens …

【第17章】MyBatis-Spring之注入映射器

文章目錄 前言一、注冊映射器1. XML 配置2. Java 配置 二、發現映射器1. <mybatis:scan/>2.MapperScan ( 建議 ) \color{#00FF00}{(建議)} (建議) 三、MapperScannerConfigurer總結 前言 與其在數據訪問對象&#xff08;DAO&#xff09;中手工編寫使用 SqlSessionDaoSu…

數據庫--數據庫基礎(一)

目錄 第一章 緒論 一.數據庫的基本概念 1. 數據庫的4個基本概念 2、數據庫系統的特點 二.數據庫和文件 三.數據模型 1.概念模型 2.邏輯模型(物理模型) 2.1關系模型 四.數據庫系統的三級模式結構&#xff1a; 五數據庫的二級映像功能與數據獨立性 第二章 關系數據庫…

WEBPACK開發|生產環境配置(抽離公共部分)

這是webpack4演示&#xff0c;webpack5有些插件不在推薦&#xff0c; 1. webpack.base.config.js文件的配置說明 const path require(path); const webpack require(webpack); const ExtractTextPlugin require(extract-text-webpack-plugin); // 該插件的主要是為了抽離c…