成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java程序員必備基礎(chǔ):Java代碼是怎么運(yùn)行的?

開(kāi)發(fā) 后端
作為一名Java程序員,我們需要知道Java代碼是怎么運(yùn)行的。最近復(fù)習(xí)了深入理解Java虛擬機(jī),做了一下總結(jié),希望對(duì)大家有幫助,如果有不正確的地方,歡迎提出,感激不盡。

 前言

作為一名Java程序員,我們需要知道Java代碼是怎么運(yùn)行的。最近復(fù)習(xí)了深入理解Java虛擬機(jī),做了一下總結(jié),希望對(duì)大家有幫助,如果有不正確的地方,歡迎提出,感激不盡。

[[318672]]

java 代碼運(yùn)行主要流程

 

本文主要講解流程如下:

  • java源文件編譯為class字節(jié)碼
  • 類(lèi)加載器把字節(jié)碼加載到虛擬機(jī)的方法區(qū)。
  • 運(yùn)行時(shí)創(chuàng)建對(duì)象
  • 方法調(diào)用,執(zhí)行引擎解釋為機(jī)器碼
  • CPU執(zhí)行指令
  • 多線(xiàn)程切換上下文

編譯

我們都知道,java代碼是運(yùn)行在Java虛擬機(jī)上的。但是java是一門(mén)面向?qū)ο蟮母呒?jí)語(yǔ)言,它不僅語(yǔ)法非常復(fù)雜,抽象程度也非常高,并不能直接運(yùn)行在計(jì)算機(jī)硬件機(jī)器上。

Java虛擬機(jī)(Java Virtual Machine 簡(jiǎn)稱(chēng)JVM)是運(yùn)行所有Java程序的抽象計(jì)算機(jī),是Java語(yǔ)言的運(yùn)行環(huán)境。

因此,在運(yùn)行Java程序之前,需要編譯器把代碼編譯成java虛擬機(jī)所能識(shí)別的指令程序,這就是Java字節(jié)碼,即class文件。

所以,Java代碼運(yùn)行的第一步是:把Java源代碼編譯成.class 字節(jié)碼文件。

 

類(lèi)加載

在Class文件中描述的各種信息,需要被加載到虛擬機(jī)之后才能運(yùn)行和使用。因此,需要把class字節(jié)碼文件加載到Java虛擬機(jī)來(lái)。

虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的 Java 類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。

加載

在加載階段,虛擬機(jī)需要完成以下3件事情:

  • 通過(guò)一個(gè)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。
  • 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
  • 在內(nèi)存中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類(lèi)的各種數(shù)據(jù)的訪(fǎng)問(wèn)入口

加載階段完成后,這些二進(jìn)制字節(jié)流按照虛擬機(jī)所需的格式存儲(chǔ)在方法區(qū)之中。

 

驗(yàn)證

為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,不會(huì)危害虛擬機(jī)的安全,Java虛擬機(jī)對(duì)輸入的字節(jié)流走驗(yàn)證過(guò)程。

驗(yàn)證階段包括四個(gè)階段:文件格式驗(yàn)證、元數(shù)據(jù)驗(yàn)證、字節(jié)碼驗(yàn)證、符號(hào)引用驗(yàn)證。

 

  • 文件格式驗(yàn)證: 驗(yàn)證字節(jié)流是否符合Class文件格式規(guī)范,如:是否以魔數(shù)0xCAFEBABE開(kāi)頭。
  • 元數(shù)據(jù)驗(yàn)證: 對(duì)字節(jié)碼描述的信息進(jìn)行語(yǔ)義分析,如:這個(gè)類(lèi)的父類(lèi)是否繼承了不允許被繼承的類(lèi)(被final修飾的類(lèi));
  • 字節(jié)碼驗(yàn)證: 主要目的是通過(guò)數(shù)據(jù)流和控制流分析,確定程序語(yǔ)義是合法的、符合邏輯的。如:保證跳轉(zhuǎn)指令不會(huì)跳轉(zhuǎn)到方法體以外的字節(jié)碼指令上。
  • 符號(hào)引用驗(yàn)證: 發(fā)生在虛擬機(jī)將符號(hào)引用轉(zhuǎn)化為直接引用的時(shí)候,如:校驗(yàn)符號(hào)引用中通過(guò)字符串描述的全限定名是否能找到對(duì)應(yīng)的類(lèi)。

準(zhǔn)備

準(zhǔn)備階段是正式為類(lèi)變量分配內(nèi)存并設(shè)置類(lèi)變量初始值,這些變量所使用的內(nèi)存都將在方法區(qū)中進(jìn)行分配。如:

 

  1. public static int value =123; 

變量value在準(zhǔn)備階段過(guò)后的初始值是0而不是123。

解析

解析階段是虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過(guò)程。

比如:com.User類(lèi)引用com.Tool類(lèi),在編譯時(shí),User類(lèi)不知道Tool類(lèi)的實(shí)際內(nèi)存地址,因此只能使用符號(hào)com.Tool(假設(shè))來(lái)表示。而在類(lèi)加載加載User類(lèi)的時(shí)候,可以通過(guò)虛擬機(jī)獲取Tool類(lèi)的實(shí)際內(nèi)存地址,因此便可以將符號(hào)com.Tool替換為T(mén)ool類(lèi)的實(shí)際內(nèi)存地址,即直接引用地址。

解析動(dòng)作主要針對(duì)類(lèi)或接口、字段、類(lèi)方法、接口方法、方法類(lèi)型、方法句柄和調(diào)用點(diǎn)限定符 7 類(lèi)符號(hào)引用進(jìn)行。

初始化

到了初始化階段,才真正開(kāi)始執(zhí)行類(lèi)中定義的Java字節(jié)碼。在這個(gè)階段,則根據(jù)程序員通過(guò)程序制定的主觀計(jì)劃去初始化類(lèi)變量和其他資源。

創(chuàng)建對(duì)象

Java虛擬機(jī)是如何執(zhí)行字節(jié)碼的呢?我們先來(lái)看一下運(yùn)行時(shí)創(chuàng)建對(duì)象。

Java是面向?qū)ο蟮木幊陶Z(yǔ)言,程序的運(yùn)行是以對(duì)象為調(diào)用單位的。

  • 字節(jié)碼文件加載到虛擬機(jī)的方法區(qū)后,在程序運(yùn)行過(guò)程,通過(guò) class字節(jié)碼文件創(chuàng)建與其對(duì)應(yīng)的對(duì)象信息 。
  • 創(chuàng)建對(duì)象的方式有:new關(guān)鍵字,反射等。
  • Java堆內(nèi)存是線(xiàn)程共享的區(qū)域,創(chuàng)建后的對(duì)象信息就保存在Java堆內(nèi)存中。

 

方法調(diào)用

JVM的調(diào)用單位是對(duì)象,但是真正執(zhí)行功能性的代碼還是對(duì)象上的方法。

在運(yùn)行過(guò)程中,每當(dāng)調(diào)用進(jìn)入一個(gè)java方法,java虛擬機(jī)會(huì)在當(dāng)前線(xiàn)程的java方法棧中生成一個(gè)棧幀,用以存放局部變量以及字節(jié)碼的操作數(shù)。方法棧內(nèi)存是線(xiàn)程私有的,每個(gè)線(xiàn)程都有自己的方法棧。如果對(duì)應(yīng)的方法是本地方法,則對(duì)應(yīng)的就是本地方法棧。

java運(yùn)行時(shí)數(shù)據(jù)區(qū)域如下:

 

解釋

當(dāng)調(diào)用Java對(duì)象的某個(gè)方法時(shí),JVM執(zhí)行引擎會(huì)將該方法的字節(jié)碼文件翻譯成計(jì)算機(jī)所能識(shí)別的機(jī)器碼,機(jī)器碼信息保存在方法區(qū)中。翻譯有解釋執(zhí)行和即時(shí)編譯兩種方式。

 

種翻譯方式的區(qū)別如下:

解釋執(zhí)行

 

來(lái)一行代碼,解釋一行,大部分不常用的代碼,都是采用這種方式。

即使編譯

對(duì)于部分熱點(diǎn)代碼,將一個(gè)方法包含的所有字節(jié)碼翻譯成機(jī)器指令,以提高java虛擬機(jī)的運(yùn)行效率。

即時(shí)編譯是建立經(jīng)典的二八定律上,即20%代碼占據(jù)了80%的計(jì)算資源。

執(zhí)行指令

 

  • Java程序被加載入內(nèi)存后,指令也在內(nèi)存中了。
  • 指令的指令寄存器IP,指向下一條待執(zhí)行指令的地址。
  • CPU的控制單元根據(jù)IP寄存器的指向,將主存中的指令裝載到指令寄存器,這些加載的指令就是一串二進(jìn)制碼,還需要譯碼器進(jìn)行解碼。
  • 解碼后,如果需要獲取操作數(shù),則從內(nèi)存中取數(shù)據(jù),調(diào)用運(yùn)算單元進(jìn)行計(jì)算。

多線(xiàn)程上下文切換

CPU一通上電,就會(huì)周而復(fù)始從內(nèi)存中獲取指令、譯碼、執(zhí)行。

 

  • 為了支持多任務(wù),CPU 將執(zhí)行時(shí)間這個(gè)資源劃分成時(shí)間片,每個(gè)程序執(zhí)行一段時(shí)間。
  • java虛擬機(jī)的多線(xiàn)程是通過(guò)線(xiàn)程輪流切換分配處理執(zhí)行時(shí)間的方式來(lái)實(shí)現(xiàn)的,在任何一個(gè)確定的時(shí)刻,一個(gè)處理器(對(duì)于多核處理器來(lái)說(shuō)是一個(gè)內(nèi)核)都只會(huì)執(zhí)行一條程序中的指令。
  • 假設(shè)當(dāng)前線(xiàn)程在運(yùn)行中,CPU分配的時(shí)間執(zhí)行完了,總得保存運(yùn)行過(guò)的結(jié)果信息吧,要不然白白浪費(fèi)之前的工作了,因此,程序計(jì)數(shù)器(PC寄存器)作用體現(xiàn)出來(lái)了,它是一塊較小的內(nèi)存空間,線(xiàn)程私有,可以看作當(dāng)前線(xiàn)程執(zhí)行的字節(jié)碼的行號(hào)指示器。當(dāng)CPU又給它分配時(shí)間跑的時(shí)候,可以把數(shù)據(jù)恢復(fù),接著上一次執(zhí)行到的位置繼續(xù)執(zhí)行就可以了。

 

責(zé)任編輯:華軒 來(lái)源: 撿田螺的小男孩
相關(guān)推薦

2020-05-06 15:59:07

JavaScript程序員技術(shù)

2020-01-12 19:10:30

Java程序員數(shù)據(jù)

2020-05-09 11:20:02

Java結(jié)構(gòu)圖虛擬機(jī)

2009-06-25 09:33:43

Java API程序員

2009-07-02 15:10:17

Java程序員面試

2020-07-20 07:46:01

程序員加簽驗(yàn)簽

2023-10-04 00:50:00

Java開(kāi)發(fā)

2022-10-24 09:00:47

畫(huà)圖工具程序員XMind

2025-06-05 04:11:00

IntelliJIDEA插件

2015-08-20 14:34:25

程序員java基礎(chǔ)網(wǎng)絡(luò)編程

2019-07-05 10:45:27

Java程序員編程語(yǔ)言

2013-06-08 14:12:13

程序員招聘

2021-02-20 11:04:40

C++VS代碼調(diào)試

2012-11-02 13:47:31

Java程序員編程

2020-04-20 19:00:30

程序員分布式事務(wù)架構(gòu)

2020-04-20 11:19:00

Java開(kāi)發(fā)序列化

2019-07-19 10:04:05

Java程序員Tomcat

2015-01-22 16:16:35

AdroidJava工具

2012-11-08 09:49:30

C++Java程序員

2014-08-15 14:25:48

Android程序員資源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久在线 | 国产成人99久久亚洲综合精品 | 国产一区二区在线免费观看 | 四虎成人免费视频 | 国产精品视频网站 | 中文字幕11页 | 久久久精品网 | 日日网| 在线一区观看 | 国产精品一区久久久久 | 青草久久免费视频 | 亚洲一区在线播放 | av一级久久 | 中文字幕日韩欧美一区二区三区 | 一区二区三区视频在线观看 | 国产福利91精品 | 精品国产久 | 成人午夜影院 | 国产剧情一区二区三区 | 亚洲一区久久久 | 女同久久| 国产成人精品久久二区二区91 | 国产欧美精品区一区二区三区 | 久久久精品一区 | 亚洲成人免费在线观看 | 亚洲视频一区在线观看 | 狠狠干天天干 | 香蕉久久a毛片 | 一级看片免费视频 | 操夜夜| www.成人免费视频 | 啪啪免费 | 成人在线视频一区 | 青春草国产| 亚洲精品成人 | 伊人网在线综合 | 盗摄精品av一区二区三区 | 亚洲精品久久久蜜桃 | 天天看片天天干 | 精品一区二区三区四区视频 | 久久久久久久久久久久久9999 |