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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JVM入門之Class結構屬性表1

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

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

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

?

屬性表屬性總覽

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

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

屬性結構

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

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

?

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

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

?

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

前兩個屬性是所有屬性都共有的,之后就不進行講解了。

常見屬性

Code

?只有方法內有方法體的方法表才會有這項屬性,像抽象方法,非defult接口方法是沒有這個屬性的(沒有方法體)

?


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


首先先看下Code屬性表的結構:圖片


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

先看下之前的這篇文章,Java程序運行是基于棧的操作,就是說的該項屬性。

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

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

?


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

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

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

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

?

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

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

?


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

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

?

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

?


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

?如果方法體內部沒有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ù)量和類型;而該項屬性是描述方法throws的異常數(shù)量和類型,通俗來說就是調用該方法需要catch的異常,也叫作受查異常。

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

?

結構:圖片


LineNumberTable

?用于描述Java代碼行號和字節(jié)碼行號的對應關系,該項屬性可選擇是否輸出

?

?用處:當執(zhí)行某段字節(jié)碼指令拋出異常時可以根據(jù)這個對應關系,提示開發(fā)者Java代碼對應的行號。

?

結構圖片


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

    關注

    19

    文章

    2943

    瀏覽量

    104110
  • Class
    +關注

    關注

    0

    文章

    52

    瀏覽量

    19676
  • JVM
    JVM
    +關注

    關注

    0

    文章

    155

    瀏覽量

    12168
收藏 人收藏

    評論

    相關推薦

    jvm的類加載器的整體結構及過程解析

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

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

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

    Jvm的整體結構和特點

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

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

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

    中文商品屬性結構化方法

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

    Jvm工作原理學習筆記

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

    Java:JVM虛擬機的入門知識

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

    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結構介紹1

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

    JVM入門Class結構介紹2

    本篇文章圖中貼出的類型這一列也都是這兩個數(shù)據(jù)類型,如果類型是u開頭的表示為無符號數(shù)的數(shù)據(jù)類型,如果是_info結尾的表示是類型。
    的頭像 發(fā)表于 02-09 16:57 ?408次閱讀
    <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'>結構</b>介紹2

    JVM入門Class結構屬性2

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

    JVM入門認識程序運行本質

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

    jvm內存溢出該如何定位解決

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

    jvm內存模型和內存結構

    JVM(Java虛擬機)是Java程序的運行平臺,它負責將Java程序轉換成機器碼并在計算機上執(zhí)行。在JVM中,內存模型和內存結構是兩個重要的概念,本文將詳細介紹它們。 一、JVM內存
    的頭像 發(fā)表于 12-05 11:08 ?736次閱讀

    jvm metaspacesize大小設置

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