0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM入門之Class結(jié)構(gòu)屬性表1

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-10 11:02 ? 次閱讀

上篇文章提到過在Class結(jié)構(gòu)表中,屬性表存在于Class表,字段表和方法表中,是為了 「描述額外的信息 。

?屬性表在《JAVA虛擬機(jī)規(guī)范》中并沒有像其他數(shù)據(jù)一樣做嚴(yán)格的限制,我們甚至可以自己實(shí)現(xiàn)一個(gè)編譯器往Class結(jié)構(gòu)的屬性表中注入額外的屬性信息,虛擬機(jī)運(yùn)行時(shí)會(huì)忽略掉它識(shí)別不了的屬性。

?

屬性表屬性總覽

這張圖中按Class結(jié)構(gòu),字段表,方法表這三個(gè)維度進(jìn)行了區(qū)分標(biāo)注,將 「三者共有的屬性」 提取到最頂部的 「黃色橢圓」 中, 「藍(lán)色」 代表各自屬性表 「額外用到的屬性」 , 「紅色」 代表 「Code屬性中引用的其他屬性的集合」圖片

引自《深入理解JAVA虛擬機(jī)》,讀者也可以看這下面的兩張圖:圖片圖片

屬性結(jié)構(gòu)

圖片首先表結(jié)構(gòu)中的前兩個(gè)字節(jié)說明該屬性是叫什么名字,也就是什么類型的屬性,最終指向常量池中的CONSTANT_Utf8_info類型的常量。

?eg:Code,ConstantValue,SourceFile。。。等

?

接著用四個(gè)字節(jié)描述屬性值的長(zhǎng)度,也就是說明屬性值所占用的字節(jié)數(shù);

?除了第一個(gè)屬性名稱信息和該屬性描述的屬性長(zhǎng)度,其他的就是屬性值了,因此該值(屬性值長(zhǎng)度)固定為 整個(gè)屬性表長(zhǎng)度-6個(gè)字節(jié)

?

最后列出屬性信息,有多少屬性信息呢?前四個(gè)字節(jié)已經(jīng)列出了這個(gè)屬性包含多少個(gè)屬性,因此最后描述各個(gè)屬性的信息。

前兩個(gè)屬性是所有屬性都共有的,之后就不進(jìn)行講解了。

常見屬性

Code

?只有方法內(nèi)有方法體的方法表才會(huì)有這項(xiàng)屬性,像抽象方法,非defult接口方法是沒有這個(gè)屬性的(沒有方法體)

?


「該屬性用于存放 操作數(shù)棧最大深度, 本地變量表最大占用存儲(chǔ)空間, 方法中Catch塊定義的異常類型和數(shù)量, 編譯后方法體的字節(jié)碼指令和指令長(zhǎng)度, 還有其他屬性」


首先先看下Code屬性表的結(jié)構(gòu):圖片


1.「max_stack操作數(shù)棧最大深度」

先看下之前的這篇文章,Java程序運(yùn)行是基于棧的操作,就是說的該項(xiàng)屬性。

通過指令從本地變量表中拿數(shù)據(jù)放到棧頂;將數(shù)據(jù)從棧頂保存到本地變量中;對(duì)棧頂兩個(gè)值進(jìn)行運(yùn)算后將結(jié)果壓入棧頂;將棧頂?shù)闹底鳛榉祷亟Y(jié)果return.....等等這些都是通過操作數(shù)據(jù)結(jié)構(gòu)棧來完成的。

?這項(xiàng)屬性描述了方法中操作數(shù)棧的最大深度,虛擬機(jī)運(yùn)行時(shí)會(huì)根據(jù)這項(xiàng)屬性來分配棧幀中操作數(shù)棧的最大深度。

?


2.「max_locals局部變量表所需空間」

局部變量表最大占用的存儲(chǔ)空間,存儲(chǔ)的單位用的是Slot(變量槽),一個(gè) Slot占用空間大小為32位。

存儲(chǔ)范圍:比如方法的參數(shù),Catch塊中定義的異常類型,方法體中定義的局部變量。

?對(duì)于方法參數(shù)來說,根據(jù)實(shí)例方法(通過對(duì)象才能訪問)和靜態(tài)方法(通過類名就可以直接訪問)又有不同;實(shí)例方法的參數(shù)中第一個(gè)是this,該變量會(huì)在編譯時(shí)加入,而靜態(tài)方法則沒有這個(gè)變量。

?

存儲(chǔ)空間:對(duì)于小于32位的數(shù)據(jù)類型用一個(gè)變量槽,大于32位的用多個(gè)變量槽存儲(chǔ)(比如小于64位的數(shù)據(jù)類型double和long用兩個(gè)變量槽存儲(chǔ))。優(yōu)化:對(duì)變量限定作用域,如果變量超出了作用域范圍,那么存儲(chǔ)該變量的Slot進(jìn)行存儲(chǔ)其他的變量,也就是重用變量槽。

?根據(jù)同時(shí)生存的最大局部變量數(shù)量和類型計(jì)算出max_locals的大小。

?


3.「code_length,code屬性用于表述方法體編譯后的字節(jié)碼指令長(zhǎng)度和字節(jié)碼指令流」

?字節(jié)碼指令流,一個(gè)字節(jié)代表一條指令,即每條指令就是一個(gè)u1類型的單字節(jié);u1數(shù)據(jù)類型取值范圍是0X00~0XFF,對(duì)應(yīng)十進(jìn)制為0到255。即u1可以表達(dá)256條指令,目前使用的大約只有200條

?

?方法體中不允許超過65535條字節(jié)碼指令,如果超出了編譯器拒絕編譯;但是code_length用的是u4長(zhǎng)度值,可以達(dá)到2的32次冪,相當(dāng)于指令長(zhǎng)度只用了一半(u2長(zhǎng)度)。

?


4.「exception_table_length,exception_table用于描述方法塊中Catch塊定義的異常數(shù)量和類型」

?如果方法體內(nèi)部沒有catch塊則length為0,后面的字節(jié)不描述exception_table

?

圖片

在這里插入圖片描述

?Exception table:

from to target type

0 5 10 Class java/lang/Exception

0 5 21 any

10 16 21 any

?


Exceptions

該屬性和上面提到的exception_table描述的信息不一樣,exception_table是描述方法體中Catch塊中定義的異常數(shù)量和類型;而該項(xiàng)屬性是描述方法throws的異常數(shù)量和類型,通俗來說就是調(diào)用該方法需要catch的異常,也叫作受查異常。

?因此上面的excepitons_table描述方法體內(nèi)部Catch的異常,Exceptions描述方法拋出的異常

?

結(jié)構(gòu):圖片


LineNumberTable

?用于描述Java代碼行號(hào)和字節(jié)碼行號(hào)的對(duì)應(yīng)關(guān)系,該項(xiàng)屬性可選擇是否輸出

?

?用處:當(dāng)執(zhí)行某段字節(jié)碼指令拋出異常時(shí)可以根據(jù)這個(gè)對(duì)應(yīng)關(guān)系,提示開發(fā)者Java代碼對(duì)應(yīng)的行號(hào)。

?

結(jié)構(gòu)圖片


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2969

    瀏覽量

    104789
  • Class
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    19745
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12236
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    jvm的類加載器的整體結(jié)構(gòu)及過程解析

    前言 我們很多小伙伴平時(shí)都是做JAVA開發(fā)的,那么作為一名合格的工程師,你是否有仔細(xì)的思考過JVM的運(yùn)行原理呢。 如果懂得了JVM的運(yùn)行原理和內(nèi)存模型,像是一些JVM調(diào)優(yōu)、垃圾回收機(jī)制等等的問題我們
    的頭像 發(fā)表于 09-27 15:49 ?3406次閱讀
    <b class='flag-5'>jvm</b>的類加載器的整體<b class='flag-5'>結(jié)構(gòu)</b>及過程解析

    jQuery的基本選擇器和class屬性操作

    jQuery的基本選擇器和class操作和屬性操作
    發(fā)表于 05-19 13:04

    Jvm的整體結(jié)構(gòu)和特點(diǎn)

    的整體結(jié)構(gòu)大致如下:    1、類加載器  類加載器用來加載Java類到JVM虛擬機(jī)中,源代碼程序.java文件在經(jīng)過編譯器編譯之后就被轉(zhuǎn)換成字節(jié)代碼.class文件,類加載器負(fù)責(zé)讀取
    發(fā)表于 01-05 17:23

    Linux快速入門文件類型及文件屬性

    《嵌入式Linux應(yīng)用程序開發(fā)詳解》第一章 Linux 快速入門1.3.1 文件類型及文件屬性1.文件類型1)普通文件2)目錄文件 3)連接文件 4)設(shè)備文件2文件
    發(fā)表于 12-17 07:58

    中文商品屬性結(jié)構(gòu)化方法

    從非結(jié)構(gòu)化商品描述文本中抽取結(jié)構(gòu)屬性信息,對(duì)于電子商務(wù)實(shí)現(xiàn)商品的對(duì)比與推薦及用戶需求預(yù)測(cè)等功能具有重要意義.現(xiàn)有結(jié)構(gòu)化方法大多采用監(jiān)督或半監(jiān)督的分類方法抽取
    發(fā)表于 01-02 15:58 ?0次下載
    中文商品<b class='flag-5'>屬性</b><b class='flag-5'>結(jié)構(gòu)</b>化方法

    Jvm工作原理學(xué)習(xí)筆記

    [] args)函數(shù)的class都可以作為JVM實(shí)例運(yùn)行的起點(diǎn) b) 運(yùn)行。main()作為該程序初始線程的起點(diǎn),任何其他線程均由該線程啟動(dòng)。JVM內(nèi)部有兩種線程:守護(hù)線程和非守護(hù)線程,main()屬于非守護(hù)
    發(fā)表于 04-03 11:03 ?5次下載

    Java:JVM虛擬機(jī)的入門知識(shí)

    Java開發(fā)現(xiàn)在面試越來越難了,進(jìn)大廠必備的JVM、多線程高并發(fā)這都是最基礎(chǔ)的知識(shí)了,今天我們一起來學(xué)習(xí)Java虛擬機(jī)入門。
    的頭像 發(fā)表于 07-01 11:43 ?2316次閱讀
    Java:<b class='flag-5'>JVM</b>虛擬機(jī)的<b class='flag-5'>入門</b>知識(shí)

    UM1802_STM32CubeL1入門STM32L1系列

    UM1802_STM32CubeL1入門STM32L1系列
    發(fā)表于 11-22 08:22 ?1次下載
    UM1802_STM32CubeL<b class='flag-5'>1</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>STM32L<b class='flag-5'>1</b>系列

    JVM入門Class結(jié)構(gòu)介紹1

    ?根據(jù)《JAVA虛擬機(jī)規(guī)范》的規(guī)定,Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),這種偽結(jié)構(gòu)中(Class文件格式中)只有
    的頭像 發(fā)表于 02-09 16:57 ?619次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b>介紹<b class='flag-5'>1</b>

    JVM入門Class結(jié)構(gòu)介紹2

    本篇文章圖中貼出的類型這一列也都是這兩個(gè)數(shù)據(jù)類型,如果類型是u開頭的表示為無符號(hào)數(shù)的數(shù)據(jù)類型,如果是_info結(jié)尾的表示是類型。
    的頭像 發(fā)表于 02-09 16:57 ?466次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b>介紹2

    JVM入門Class結(jié)構(gòu)屬性2

    ?屬性在《JAVA虛擬機(jī)規(guī)范》中并沒有像其他數(shù)據(jù)一樣做嚴(yán)格的限制,我們甚至可以自己實(shí)現(xiàn)一個(gè)編譯器往Class結(jié)構(gòu)屬性
    的頭像 發(fā)表于 02-10 11:02 ?577次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>屬性</b><b class='flag-5'>表</b>2

    JVM入門認(rèn)識(shí)程序運(yùn)行本質(zhì)

    寫JAVA文件然后用javac命令編譯成class文件運(yùn)行即可。 > > ? 隨著學(xué)習(xí)的不斷拓展和工作中業(yè)務(wù)代碼的積累,對(duì)于“為什么會(huì)這樣”的困惑越來越多,于是寫了這篇博客
    的頭像 發(fā)表于 02-10 11:48 ?683次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>認(rèn)識(shí)程序運(yùn)行本質(zhì)

    jvm內(nèi)存溢出該如何定位解決

    超出限制和堆空間不足。 定位JVM內(nèi)存溢出問題是一個(gè)比較復(fù)雜的任務(wù),需要結(jié)合工具和技術(shù)來進(jìn)行分析和解決。本文將介紹一些常用的調(diào)試和解決內(nèi)存溢出問題的工具和技術(shù)。 一、理解JVM內(nèi)存結(jié)構(gòu) 在解決
    的頭像 發(fā)表于 12-05 11:05 ?1348次閱讀

    jvm內(nèi)存模型和內(nèi)存結(jié)構(gòu)

    JVM(Java虛擬機(jī))是Java程序的運(yùn)行平臺(tái),它負(fù)責(zé)將Java程序轉(zhuǎn)換成機(jī)器碼并在計(jì)算機(jī)上執(zhí)行。在JVM中,內(nèi)存模型和內(nèi)存結(jié)構(gòu)是兩個(gè)重要的概念,本文將詳細(xì)介紹它們。 一、JVM內(nèi)存
    的頭像 發(fā)表于 12-05 11:08 ?941次閱讀

    jvm metaspacesize大小設(shè)置

    JVM的Metaspace是用于存儲(chǔ)類元數(shù)據(jù)的區(qū)域。在JVM中,類的元數(shù)據(jù)包括類的結(jié)構(gòu)、方法、字段等信息。Metaspace的大小對(duì)于應(yīng)
    的頭像 發(fā)表于 12-05 14:22 ?9102次閱讀