jvm(Java virtual machine) JVM架構解釋

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

JVM 架構解釋

每個Java開發者都知道通過JRE【Java運行環境】執行字節碼。

但是很多人都不知道JRE是JVM實現的事實。JVM負責執行字節碼的分析

代碼的解釋和運行。

我們應該了解JVM的架構,這對開發者來說是很重要的,這促進我們更有效的

編寫代碼。在本文中,我們將深入學習有關JVM的架構和JVM組件的區別。

什么是JVM?

虛擬機是物理機的一個軟件實現。

JAVA是基于WORA(一次編寫,到處運行)的概念開發的,它運行在虛擬機上。

編譯器將Java文件編譯成class文件,然后將class文件輸入到JVM,JVM加載并運行class文件。

下面是JVM架構

1e908c486e02789f0793e9d524b8b462ad5.jpg

JVM是如何工作的?

像上面圖表顯示那樣,JVM分成3個主要的子系統:

  1. 類加載器子系統
  2. 運行時數據區
  3. 執行引擎

?

1、類加載器子系統

Java的動態類加載功能是通過類加載子系統去處理的。

它并不是在編譯時候,而是在首次運行時加載引用類時、連接并初始化類文件。

?

1.1 加載

類通過該組件加載。通過引導類加載器,擴展類加載器,應用類加載器這三個類加載器幫助完成加載。

  1. 引導類加載器

負責從引導類路徑去加載類,除了rt.jar之外,沒其他別的jar。給予該加載器最高的優先級。

  1. 擴展類加載器

負責加載ext目錄(jre\lib)的類

  1. 應用加載器

負責加載類路徑中應用級別的類,path提到的環境變量,等等。

以上的類加載器在加載類文件的時候遵循委托層次算法。

1.2連接

  1. 驗證-字節碼驗證器驗證生成的字節碼是否正確,如果驗證失敗,我們將收到驗證的錯誤信息。
  2. 準備-為所有的靜態變量分配內存和默認值
  3. 解析-用方法區的原始引用代替所有符號內存引用。

?

1.3 初始化

這是類加載的最后一個階段,此時所有的靜態變量都用原始值去賦值,并且將運行靜態代碼塊。

2、運行時數據區

運行時數據區域分成5個主要的組件:

  1. 方法區-所有類級的數據都存儲在這里,包括靜態變量。

每個JVM只有一個方法區,它是一個共享資源。

  1. 堆區-所有的對象和對應的實例變量以及數組都存儲在這里。

每個JVM只有一個堆區,由于方法區和堆區為多個線程共享內存,所以

存儲的數據不是線程安全的。

  1. 棧區-為每個線程,創建一個單獨的運行時棧。為每個方法調用,在棧內存創建一個條目,稱之為棧幀。所有本地變量都會在棧內存中創建。由于它不是共享的資源,所有是線程安全的。

棧幀被分成3子實體

  1. 本地變量數組-涉及跟方法有關的本地變量和對應的值都存儲在這里。
  2. 操作數棧-如果需要執行中間操作,操作數堆棧作為運行時工作區來執行操作。
  3. 幀數據-所有和對應方法的標記都存儲在里面。在發生異常的情況下,捕捉塊信息在這里維護。
  1. 程序計數器寄存器--每個線程都有自己的程序計數器寄存器,持有當前執行指令的地址,一旦當前指令執行被運行,下一個指令將會更新到程序計數器寄存器。

3、執行引擎

字節碼被分配到執行引擎執行的運行時數據區。執行引擎一塊一塊的讀取字節碼并執行。

  1. 解釋器-解釋器解釋字節碼很快,但是執行的很慢。解釋器的缺點是當一個方法被調用多次,每次都需要一個新的解釋。
  2. JIT編譯器-JIT彌補了解釋器的缺點。執行引擎將利用解釋器轉換字節碼,但是當他找到重復的編碼,它就使用編譯器。編譯器編譯全部的字節碼并變成本地代碼

這些本地碼將直接被方法調用重復地使用,這就改善了系統的性能。

  1. 中間代碼生成器-生成中間代碼。
  2. 代碼優化器-負責優化上面生成的代碼
  3. 目標代碼生成器-負責生成機器碼或者本地代碼
  4. 分析器-一個特殊的組件,負責尋找hotspots,即是否方法被調用多次。

?

  1. 垃圾收集器:收集和清除未被引用的對象,可以通過System.gc()觸發垃圾回收,但是不保證一定執行。創建收集對象的JVM垃圾收集。

?

Java Native Interface (JNI):JNI和本地方法庫互動,特供本地庫所需的執行引擎。

Native Method Libraries: 這是執行引擎所需的本地方法的一個集合

?

本文為在下翻譯外文的處女作,水平有限,翻譯不恰當之處,煩請讀者指正!

原文地址:https://dzone.com/articles/jvm-architecture-explained

?

轉載于:https://my.oschina.net/benz001/blog/2990014

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

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

相關文章

Hyper-V 嵌套虛擬化

先決條件運行 Windows Server 2016 或Windows 10 周年更新的 Hyper-V 主機。運行 Windows Server 2016 或Windows 10 周年更新的 Hyper-V VM。配置版本為 8.0 或更高的 Hyper-V VM。采用 VT-x 和 EPT 技術的 Intel 處理器(AMD-V技術的暫時不支持)>Set…

簡單的面試題簡解思路(搜集)

1. 統計字符串中單詞出現次數 "hi how are you i am fine thank you youtube am am ",統計"you"出現的次數。 方法一 : split() function wordCount(str,word){var str str || "";var word word || "";var strArr s…

WinForm(十五)窗體間通信

在很多WinForm的程序中,會有客戶端之間相互通信的需求,或服務端與客戶端通信的需求,這時就要用到TCP/IP的功能。在.NET中,主要是通過Socket來完成的,下面的例子是通過一個TcpListerner作為監聽,等待TcpClie…

905. 按奇偶排序數組

1// 905. 按奇偶排序數組 2/** 3 * param {number[]} A 4 * return {number[]} 5 */ 6var sortArrayByParity function(A) { 7 return A.filter(value > value % 2 0).concat( 8 A.filter(value > value % 2 1) 9 )10}; 轉載于:https://www.cnblogs.com/…

關于Java開發需要注意的十二點流程

1.將一些需要變動的配置寫在屬性文件中 比如,沒有把一些需要并發執行時使用的線程數設置成可在屬性文件中配置。那么你的程序無論在DEV環境中,還是TEST環境中,都可以順暢無阻地運行,但是一旦部署在PROD上,把它作為多線…

Unity經典游戲教程之:雪人兄弟

版權聲明: 本文原創發布于博客園"優夢創客"的博客空間(網址:http://www.cnblogs.com/raymondking123/)以及微信公眾號"優夢創客"(微信號:unitymaker)您可以自由轉載&#x…

使用webpack搭建個性化項目

安裝主包 yarn add webpack webpack-cli webpack-dev-server -D根據項目實際需求安裝loaders,webpack-loaders列表 根據項目實際需求安裝插件, webpack-plugins列表 常用包列表 包名說明webpackwebpack主程序,配置列表webpack-cliwebpack…

.NET周報【11月第1期 2022-11-07】

國內文章開源安全賦能 - .NET Conf China 2022https://mp.weixin.qq.com/s/_tYpfPeQgyEGsnR4vVLzHg.NET Conf China 2022 是面向開發人員的社區峰會,延續 .NET Conf 2022 的活動,慶祝 .NET 7 的發布和回顧過去一年來 .NET 在中國的發展成果,它…

React - 狀態提升

從入門的角度來聊一下React 的狀態提升。我們先來看一下React官網是怎么介紹這一概念的:使用 react 經常會遇到幾個組件需要共用狀態數據的情況。這種情況下,我們最好將這部分共享的狀態提升至他們最近的父組件當中進行管理。很簡單的一句介紹&#xff0…

saltstack(三) --- salt-httpapi

以下操作均在master上操作 1. 安裝api netapi modules(httpapi)有三種,分別是rest_cherrypy、rest_tornado、rest_wsig,接下來要講的是rest_cherrypydoc:https://docs.saltstack.com/en/latest/ref/netapi/all/salt.ne…

c++實現二叉搜索樹

自己實現了一下二叉搜索樹的數據結構。記錄一下&#xff1a; #include <iostream>using namespace std;struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int value) { valvalue; leftNULL; rightNULL; } };class SearchTree{public:SearchTree();~Sear…

一款自用的翻譯小工具,開源了

一款自用的翻譯小工具&#xff0c;開源了TranslationTool作者&#xff1a;WPFDevelopersOrg - 唐宋元明清|驚鏵原文鏈接&#xff1a;https://github.com/Kybs0/TranslationTool此項目使用WPF MVVM開發。框架使用大于等于.NET461。Visual Studio 2019。最初是支持以下&#xff1…

JS使用按位異或方式加密字符串

按位異或加密字符串&#xff0c;字符串加解密都是該函數 缺陷是加密密鑰使用的字符最好不要出現需要加密的字符串中的字符&#xff0c;一旦出現原字符與加密字符一樣額情況&#xff0c;異或結果為0&#xff0c;導致不能還原字符串&#xff0c;可以考慮更改算法避免這種情況 im…

SCSS 實用知識匯總

1、變量聲明 $nav-color: #F90; nav {//$width 變量的作用域僅限于{}內$width: 100px;width: $width;color: $nav-color; }.a {//報錯&#xff0c;$width未定義width: $width; } 2、父選擇器& scss代碼&#xff1a; article a {color: blue;&:hover { color: red } } 編…

【ELK集群+MQ】通用部署方案以及快速實現MQ發布訂閱服務功能

前言&#xff1a;大概一年多前寫過一個部署ELK系列的博客文章&#xff0c;前不久剛好在部署一個ELK的解決方案&#xff0c;我順便就把一些基礎的部分拎出來&#xff0c;再整合成一期文章。大概內容包括&#xff1a;搭建ELK集群&#xff0c;以及寫一個簡單的MQ服務。如果需要看一…

python容錯

#try: except: else: #為什么叫容錯呢&#xff0c;先說說錯誤&#xff0c;這里說的錯誤并不是因為馬虎或者什么原因在腳本中留下的bug&#xff0c;這個不能容掉&#xff0c;所謂容掉就是略過這個錯誤&#xff0c;要在測試時候發現并修正&#xff0c;需要容錯的錯誤是在腳本執行…

git stash參數介紹

git stash 用于暫存工作區未提交的內容&#xff0c;便于在同時開發多個分支需要切換時保存當前分支進度。 list 語法 git stash list [<options>] &#xff0c;與git log功能類似&#xff0c;列出儲藏列表&#xff0c;options 參數可以參考git log的參數 show 語法 git …

多語言報表的改動方法

在定義上傳RTF模板的時候&#xff0c;會有一個是否可翻譯的選項&#xff0c;選擇之后。就能夠上傳xlf文件作為翻譯內容。 對于已經存在的多語言類型報表&#xff0c;稍作改動之后再上傳&#xff0c;可能會出現下面現象&#xff1a; 進程出現了“未完畢”的提示 想要改動非常eas…

自定義Cell的流程

1、.h文件 // // 文 件 名:CHBackupGateWayCell.h // // 版權所有:Copyright © 2018 lelight. All rights reserved. // 創 建 者:lelight // 創建日期:2018/12/19. // 文檔說明: // 修 改 人: // 修改日期: //#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGINclass…

JS實時監聽DOM元素變化 - MutationObserver

使用 MutationObserver API實時監聽DOM元素變化 創建 MutationObserver 實列&#xff0c;接受一個用于監聽到DOM元素變化的回調函數 const handleListenChange (mutationsList, observer) > {console.log(mutationsList, observer) } const mutationObserver new Mutati…