国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JVM(1) - 基礎體系結構

2019-11-06 06:13:32
字體:
來源:轉載
供稿:網友

概述

基本概念

JVM:全稱是java Virtual Machine,是一種能夠執行java bytecode(字節碼)的虛擬機。JIT:全稱為Just-in-time compiler,即時編譯編譯器,用于將java字節碼轉換成可以直接發送給處理器的指令程序java字節碼:java虛擬機執行的一種指令格式,對應為java的class文件,具體可以通過javac命令進行源碼編譯來生成Garbage Collector:PC Register:全稱為:PRogram Counter Register

jvm的存在價值

      談起java語言,不得不說的就是jvm虛擬機。主要由于jvm實現了“平臺無關性”。編譯后的java程序指令并不能直接在硬件系統CPU上執行,而是由JVM執行。JVM屏蔽了與具體平臺相關的信息,使得java語言編譯程序只需要生成在JVM上運行的目標字節碼(.class),就可以在多種平臺上不加修改地運行。java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。因此jvm是java程序能在多平臺進行無縫移植的可靠保證,同時jvm也是java程序安全檢查的檢測引擎。

jvm的生命周期

概念區分-jvm實例和jvm執行引擎實例

JVM實例對應了一個獨立運行的java程序,它是進程級別。JVM執行引擎實例則對應了屬于用戶運行程序的線程,它是線程級別的。 PS:jvm的生命周期,和jvm對象的生命周期是不一樣的,對象生命周期后續可以專門文章來做下分享哈。

jvm實例生命周期

啟動階段:啟動一個java程序,jvm實例就誕生;任何一個擁有main方法的class類都可以作為jvm實例運行的起點。 PS:同一機器運行多個main應用,則會生成多個jvm實例運行階段:main作為程序初始線程的起點,其他線程均由該線程啟動;jvm內部有兩種線程,守護線程和非守護線程,main屬于非守護線程,守護線程由jvm自己使用。消亡階段:當程序中的所有非守護線程都終止時,jvm就會退出;若安全管理器允許,程序也可以使用Runtime類或System.exit退出。

jvm體系結構

結構圖

這里寫圖片描述 圖片摘自javapapers網站:http://javapapers.com

體系模塊劃分

ClassLoader Subsystem,加載器子系統 專用來加載.class文件,注意只載入需要的類文件到JVM中的運行時數據區域中,但不負責類的執行與否

Runtime Data Area,運行時數據區 提供程序運行時所需要的數據,包含方法區、堆、java棧、PC寄存器、本地方法棧

Execution Engine,執行引擎 包含兩部分:JIT和GC,而JIT用于執行字節碼,或執行本地方法;執行過程采用的是自定義的一套指令系統。GC則用于堆內存空間的回收管理。

Native Method Interface和Library,本地方法接口和本地方法庫

類加載器原理

什么是類加載器

      類加載器是一個用來加載類文件的類,名為ClassLoader。java源代碼通過javac編譯器編譯成class文件,然后由jvm的執行引擎來負責程序實行。那么類加載器負責加載文件系統、網絡或其他來源的類文件,默認有三種類加載器:Bootstrap類加載器、Extension類加載器和System類加載器(也叫APPClassLoader)。

Bootstrap類加載器:也稱為初始類加載器。對應JRE/lib/rt.jar PS:負責加載rt.jar中的JDK類文件,它是所有類加載器的父加載器。Bootstrap類加載器沒有任何父類加載器,如果你調用String.class.getClassLoader(),會返回null,任何基于此的代碼會拋出NUllPointerException異常。

Extension類加載器:對應JRE/lib/ext或java.ext.dirs指向的目錄。 PS:負責將加載類的請求先委托給它的父加載器,也就是Bootstrap,如果沒有成功加載的話,再從jre/lib/ext目錄下或者java.ext.dirs系統屬性定義的目錄下加載類。Extension加載器由sun.misc.Launcher$ExtClassLoader實現。

APPClassLoader類加載器:對應ClassPath環境變量,或由-classpath或-cp選項定義,或者是JAR中的Manifest的classpath屬性定義. PS:其負責從classpath環境變量中加載某些應用相關的類,classpath環境變量通常由-classpath或-cp命令行選項來定義,或者是JAR中的Manifest的classpath屬性。application類加載器是Extension類加載器的子加載器。通過sun.misc.Launcher$AppClassLoader實現。

用戶自定義類加載器:該加載器是留給程序員拓展用的,主要實現是通過java.lang.ClassLoader來繼承實現的

工作原理

類加載的方式

隱式裝載: PS:顯式裝載: PS:

類加載過程

類加載順序

核心工作機制

委托機制

可見性機制

單一性機制

何時使用類加載器

自定義類加載器

jvm執行引擎

主要的執行技術

四種執行指令

執行過程解析

運行時數據區

PC寄存器

JVM棧

堆(heap)

方法區域(Method Area)

運行時常量池(Runtime Constant Pool)

本地方法堆棧(Native Method Stacks)

垃圾回收器GC

PS:該部分此處不詳細展開,后續會單獨專題來做深入的學習和探討

字節碼技術的應用

怎樣用字節碼分析程序性能

如何實現字節碼加載的hotswap


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 牟定县| 西安市| 枣庄市| 蕲春县| 永清县| 舟曲县| 尚志市| 太谷县| 环江| 札达县| 宜兴市| 丹棱县| 名山县| 启东市| 林西县| 松潘县| 黎城县| 海城市| 扎鲁特旗| 昌图县| 湖口县| 嫩江县| 锡林郭勒盟| 贵溪市| 昌都县| 南京市| 图片| 大余县| 景洪市| 五寨县| 白山市| 南郑县| 安龙县| 阳江市| 阳信县| 扎兰屯市| 龙口市| 安福县| 辰溪县| 榆林市| 黎平县|