偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一篇聊聊 JVM 系列之虛擬機(jī)棧

開(kāi)發(fā) 前端
虛擬機(jī)棧也稱為Java棧,Java每個(gè)main方法被執(zhí)行的時(shí)候,JVM都會(huì)同步創(chuàng)建一個(gè)棧幀(Stack Frame),通過(guò)存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息來(lái)支撐和完成方法的執(zhí)行。

?今天繼續(xù)給大家分享JVM系列的相關(guān)知識(shí),今天介紹一下虛擬機(jī)棧的介紹。

1、虛擬機(jī)棧的概念

虛擬機(jī)棧也稱為Java棧,Java每個(gè)main方法被執(zhí)行的時(shí)候,JVM都會(huì)同步創(chuàng)建一個(gè)棧幀(Stack Frame),通過(guò)存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息來(lái)支撐和完成方法的執(zhí)行。棧幀就是虛擬機(jī)棧中的子單位。棧其實(shí)只有入棧和出棧兩種操作。

棧的操作

入棧:每一次方法調(diào)用都會(huì)有一個(gè)對(duì)應(yīng)的棧幀被壓入棧中,也成為壓棧。出棧:方法調(diào)用結(jié)束后,彈出,也成為彈棧。

2、虛擬機(jī)棧的特點(diǎn)

  • 先進(jìn)后出的原則。
  • 線程私有的,它的生命周期和線程保持一致,隨線程而生,隨線程而滅。
  • 線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的最大深度,會(huì)拋出StackOverflowError棧溢出異常。
  • 虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展,如果擴(kuò)展的時(shí)候無(wú)法申請(qǐng)得到到足夠的內(nèi)存,就會(huì)拋出OutOfMemoryError異常。

運(yùn)行時(shí)常見(jiàn)的異常

  • NullPointerException - 空指針引用異常
  • ClassCastException - 類型強(qiáng)制轉(zhuǎn)換異常
  • IllegalArgumentException - 傳遞不合法參數(shù)異常
  • ArithmeticException - 算術(shù)計(jì)算異常
  • IndexOutOfBoundsException - 下標(biāo)越界異常
  • NumberFormatException - 數(shù)字格式異常
  • UnsupportedOperationException - 不支持的操作異常

3、棧幀

Java中每一個(gè)方法從調(diào)用開(kāi)始到執(zhí)行完成的過(guò)程,其實(shí)都對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)線程里面從入棧到出棧的過(guò)程。

4、棧幀的組成

棧幀由局部變量表、操作數(shù)棧(Operand Stack)、動(dòng)態(tài)鏈接(Dynamic Linking)、方法返回地址(Return Address)和一些附加信息(對(duì)程序調(diào)試提供支持的信息)組成。       

圖片

        說(shuō)明:

  • 在活動(dòng)線程中,只有位于棧頂?shù)臈凶霎?dāng)前棧幀,也是正在執(zhí)行的方法
  • Java執(zhí)行引擎運(yùn)行的所有字節(jié)碼指令其實(shí)都只針對(duì)當(dāng)前棧幀進(jìn)行操作

4.1 局部變量表 

主要存放了編譯期明確的各種基本數(shù)據(jù)類型(boolean、byte、char、short、int、float、long、double)、對(duì)象引用(reference 類型,它不是針對(duì)對(duì)象本身,可能是一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔?,也可能是指向一個(gè)代表對(duì)象的句柄或其他與此對(duì)象相關(guān)的位置)。

4.2 操作數(shù)棧 

操作數(shù)主要作為方法調(diào)用的中轉(zhuǎn)站使用,主要用來(lái)存放Java方法執(zhí)行過(guò)程中產(chǎn)生的中間計(jì)算結(jié)果和計(jì)算過(guò)程中產(chǎn)生的臨時(shí)變量。

4.3 動(dòng)態(tài)鏈接

動(dòng)態(tài)鏈接主要支撐一個(gè)Java方法需要調(diào)用其他方法的場(chǎng)景。當(dāng) Java 源文件被編譯成字節(jié)碼文件時(shí),所有的變量和方法引用都作為符號(hào)引用(Symbilic Reference)保存在Class 文件的常量池里面。當(dāng)一個(gè)Java方法要調(diào)用其他Java方法,需要將常量池中指向方法的符號(hào)引用轉(zhuǎn)換為其在內(nèi)存地址中的直接引用。動(dòng)態(tài)鏈接作用:其實(shí)就是將符號(hào)引用轉(zhuǎn)換為調(diào)用方法的直接引用。

4.4 方法返回地址

Java方法開(kāi)始執(zhí)行后,退出這個(gè)方法的方式:正常退出、異常退出。

  • 正常退出:執(zhí)行引擎遇到方法返回的字節(jié)碼指令,這時(shí)候可能會(huì)有返回值傳遞給上層的方法調(diào)用者。 正常退出時(shí)調(diào)用PC計(jì)數(shù)器的值可以作為返回地址。
  • 異常退出:在方法執(zhí)行過(guò)程中遇到異常,且異常沒(méi)有在方法體內(nèi)得到處理,返回地址要交給異常處理表來(lái)決定如何處理。

說(shuō)明:方法退出之后,都需要返回到方法被調(diào)用的原始位置,程序才能繼續(xù)執(zhí)行。

5、棧的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):棧幀內(nèi)數(shù)據(jù)共享:一個(gè)棧幀中內(nèi)存數(shù)據(jù)共享,不同棧幀之間數(shù)據(jù)不共享,這樣可以減少內(nèi)存消耗存儲(chǔ)速度:棧幀存取數(shù)據(jù)快,僅次于寄存器。

編譯的時(shí)候就分配好了內(nèi)存,運(yùn)行過(guò)程中不需要申請(qǐng)內(nèi)存大小,節(jié)約時(shí)間成本。

  • 棧是機(jī)器提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,效率高。
  • 相比較堆來(lái)說(shuō),訪問(wèn)效率高。
  • 缺點(diǎn)靈活性差:棧在運(yùn)行過(guò)程中,不能動(dòng)態(tài)的去申請(qǐng)內(nèi)存、程序可能會(huì)報(bào)錯(cuò)。

6、內(nèi)存中棧和堆的對(duì)比

棧屬于運(yùn)行時(shí)的單位主要解決程序如何執(zhí)行的問(wèn)題,堆屬于存儲(chǔ)的單位主要是用來(lái)解決數(shù)據(jù)的存儲(chǔ)問(wèn)題。

  • 堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)較大的一塊,所以Java的對(duì)象基本都放在堆空間。
  • 棧主要用來(lái)存放基本數(shù)據(jù)類型的局部變量、引用數(shù)據(jù)類型的對(duì)象的引用

責(zé)任編輯:武曉燕 來(lái)源: IT技術(shù)分享社區(qū)
相關(guān)推薦

2023-07-31 07:48:43

Java內(nèi)存虛擬機(jī)

2023-07-27 06:59:30

Native線程數(shù)據(jù)結(jié)構(gòu)

2022-06-06 08:00:59

Kvm虛擬機(jī)磁盤

2021-09-29 09:00:19

Linux虛擬機(jī)CentOS

2010-09-17 15:12:57

JVMJava虛擬機(jī)

2022-03-01 13:55:27

TektonKubernetes集群

2020-05-08 16:55:48

Java虛擬機(jī)JVM

2011-06-22 13:35:55

JVM

2023-09-21 08:05:49

Mybatis插件開(kāi)發(fā)

2021-05-17 07:11:50

虛擬機(jī)面試內(nèi)存

2010-09-25 16:12:45

JVM虛擬機(jī)

2010-09-25 15:13:40

JVMJava虛擬機(jī)

2011-11-30 14:12:05

JavaJVM虛擬機(jī)

2010-07-28 09:27:00

SCVMM虛擬機(jī)

2023-08-03 07:34:34

格式化字符串參數(shù)

2020-06-03 15:07:01

Java虛擬機(jī)棧JVM

2024-03-26 07:30:07

Java虛擬機(jī)源文件

2020-06-18 16:39:10

KVM虛擬化虛擬機(jī)

2012-05-18 10:22:23

2011-12-28 13:24:47

JavaJVM
點(diǎn)贊
收藏

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