摘要:框架說明開發(fā)者都知道會執(zhí)行字節(jié)碼。但是可能大多數(shù)人都不知道一個事實(shí)是的實(shí)現(xiàn),它分析字節(jié)碼,解釋并執(zhí)行代碼。執(zhí)行引擎字節(jié)碼加載到運(yùn)行時數(shù)據(jù)區(qū)后,會被執(zhí)行引擎執(zhí)行。解釋器更快的解釋字節(jié)碼,但是執(zhí)行非常慢。垃圾收集收集并移除不再被使用的對象。
JVM框架說明
java開發(fā)者都知道JRE(Java Runtime Environment)會執(zhí)行字節(jié)碼。但是可能大多數(shù)人都不知道一個事實(shí):JRE是JVM的實(shí)現(xiàn),它分析字節(jié)碼,解釋并執(zhí)行代碼。作為一個開發(fā)者,了解JVM的架構(gòu)是非常重要的,這會讓我們寫的代碼更有效率。本文會深入學(xué)習(xí)JVM架構(gòu)和它的各個重要組件。
什么是JVM虛擬機(jī)是物理機(jī)器的軟件實(shí)現(xiàn)。JAVA被設(shè)計成WORA(Write Once Run Anywhere), java程序是運(yùn)行在虛擬機(jī)上的。編譯器將java文件編譯成.class文件,然后將.class文件載入到JVM,這一步會加載和執(zhí)行class文件。下面的圖是展示了JVM的架構(gòu)。
JVM 架構(gòu)圖 JVM如何工作如上圖所示,jvm主要分成三個子系統(tǒng)
類加載系統(tǒng)
運(yùn)行時數(shù)據(jù)區(qū)
執(zhí)行引擎
類加載系統(tǒng)java的動態(tài)類加載功能在類加載子系統(tǒng)中實(shí)現(xiàn)。當(dāng)?shù)谝淮卧谶\(yùn)行時(不是在編譯時)涉及到一個class時,它會加載,鏈接并初始化類文件。
加載:類會通過這個組件加載。根加載器(rt.jar),擴(kuò)展加載器(jrelibext)和系統(tǒng)加載器(classpath下的)是其主要的工具。
鏈接:主要分層三步
檢查:判斷其字節(jié)碼是否符合虛擬器要求
準(zhǔn)備:分配靜態(tài)變量的空間,同時賦缺省值
解析:解析符號鏈接,鏈接到方法區(qū)的引用上去。
初始化:給靜態(tài)變量賦初值,并執(zhí)行靜態(tài)代碼區(qū)
運(yùn)行時數(shù)據(jù)區(qū)運(yùn)行時數(shù)據(jù)區(qū)分成5個組件
方法區(qū):保存所有類數(shù)據(jù),包括靜態(tài)變量。一個jvm對應(yīng)一個方法區(qū)。
堆 :保存所有的對象,對象中的變量以及數(shù)組。一個jvm對應(yīng)一個堆。因為多個線程共享一個方法區(qū)和堆,所以數(shù)據(jù)保存不是線程安全的。
棧:每一個線程都會創(chuàng)建一個運(yùn)行時的棧。對于每一個方法調(diào)用,都會在棧中創(chuàng)建一個棧幀。棧中保存了所有的本地變量。棧是線程安全的,因為它是線程獨(dú)享資源。
PC寄存器:每個線程有一個PC寄存器,用來記錄當(dāng)前執(zhí)行指令的地址,當(dāng)一條指令執(zhí)行完畢,它就會指向下一條指令。
本地方法棧:保存了本地方法的信息,每個線程會創(chuàng)建自己的本地方法棧。
執(zhí)行引擎字節(jié)碼加載到運(yùn)行時數(shù)據(jù)區(qū)后,會被執(zhí)行引擎執(zhí)行。執(zhí)行引擎讀取字節(jié)碼文件,逐個執(zhí)行。
解釋器:更快的解釋字節(jié)碼,但是執(zhí)行非常慢。其缺點(diǎn)是當(dāng)多次調(diào)用一個方法時,每次都會創(chuàng)建新的解釋器。
JIT編譯器:JIT編譯器彌補(bǔ)了解釋器的缺點(diǎn)。執(zhí)行引擎會使用解釋器來轉(zhuǎn)換字節(jié)碼,當(dāng)發(fā)現(xiàn)重復(fù)的代碼時就會使用JIT編譯器,它會編譯整個字節(jié)碼,將之轉(zhuǎn)換為本地代碼,這個本地代碼會直接用于多次的方法調(diào)用,以此來改進(jìn)系統(tǒng)的性能。
垃圾收集:收集并移除不再被使用的對象。可以通過代碼system.gc()來觸發(fā)垃圾收集,
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67720.html
摘要:圖片含義如下源代碼程序編譯器編譯在執(zhí)行字節(jié)碼編譯器會將源代碼編譯成字節(jié)碼在虛擬機(jī)上執(zhí)行字節(jié)碼。字節(jié)碼只能在上執(zhí)行。的構(gòu)成要素的構(gòu)成如下圖所示每一欄分別的含義如下源程序字節(jié)碼編譯調(diào)試程序等源代碼由開發(fā)者編寫。 源自Javaの道日語技術(shù)社區(qū)原文地址譯者 夢夢的幻想鄉(xiāng)見てくれてありがとうござい!??! はじめてのJava 初識Java 本章將會對Java的執(zhí)行順序、Java的構(gòu)成要素、Java...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學(xué)習(xí)即將閱讀的一些優(yōu)秀經(jīng)典前端后端書籍。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學(xué)習(xí)、即將閱讀)的一些優(yōu)秀經(jīng)典前端/Java后端書籍。全文為純原創(chuàng),且將持續(xù)更新,未經(jīng)許可,不得進(jìn)行轉(zhuǎn)載。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 基礎(chǔ) 基礎(chǔ)書籍 進(jìn)階 進(jìn)階階段,深入學(xué)習(xí)的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學(xué)習(xí)即將閱讀的一些優(yōu)秀經(jīng)典前端后端書籍。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學(xué)習(xí)、即將閱讀)的一些優(yōu)秀經(jīng)典前端/Java后端書籍。全文為純原創(chuàng),且將持續(xù)更新,未經(jīng)許可,不得進(jìn)行轉(zhuǎn)載。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 基礎(chǔ) 基礎(chǔ)書籍 進(jìn)階 進(jìn)階階段,深入學(xué)習(xí)的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學(xué)習(xí)即將閱讀的一些優(yōu)秀經(jīng)典前端后端書籍。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學(xué)習(xí)、即將閱讀)的一些優(yōu)秀經(jīng)典前端/Java后端書籍。全文為純原創(chuàng),且將持續(xù)更新,未經(jīng)許可,不得進(jìn)行轉(zhuǎn)載。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 基礎(chǔ) 基礎(chǔ)書籍 進(jìn)階 進(jìn)階階段,深入學(xué)習(xí)的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學(xué)習(xí)即將閱讀的一些優(yōu)秀經(jīng)典前端后端書籍。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學(xué)習(xí)、即將閱讀)的一些優(yōu)秀經(jīng)典前端/Java后端書籍。全文為純原創(chuàng),且將持續(xù)更新,未經(jīng)許可,不得進(jìn)行轉(zhuǎn)載。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 基礎(chǔ) 基礎(chǔ)書籍 進(jìn)階 進(jìn)階階段,深入學(xué)習(xí)的書...
閱讀 4123·2021-11-17 09:33
閱讀 3332·2021-10-08 10:05
閱讀 3230·2021-09-22 15:36
閱讀 1210·2021-09-06 15:02
閱讀 2817·2019-08-29 12:45
閱讀 1636·2019-08-26 13:40
閱讀 3477·2019-08-26 13:37
閱讀 475·2019-08-26 13:37