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

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

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

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

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

LocalVariableTable,LocalVariableTypeTable

1.「LocalVariableTable」

?用于描述局部變量表中的變量與JAVA代碼中定義變量之間的關(guān)系,同樣也可以選擇不生成該屬性

?

?用處:當(dāng)編寫代碼引用到這個方法時,參數(shù)可以直接顯示變量名和類型,如果沒有該屬性,就用arg0,arg1代替;調(diào)試信息的時候可以根據(jù)參數(shù)變量名明確語義。

?

2.「LocalVariableTypeTable」

?引入泛型后加入的屬性,結(jié)構(gòu)和LocalVariableTable相似,將原先用于描述字段描述符的descriptor_index替換成了描述字段的特征簽名(Signature)。

?

?對于非泛型變量,特征簽名和描述符是一致的,但是對于泛型來說,由于泛型參數(shù)類型的擦除,描述符不能夠描述泛型類型,因此定義了該屬性來完成泛型的描述。

?

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


ConstantValue

「變量初始化,賦值時機:」 位于該屬性結(jié)構(gòu)中的常量將會在類加載的準(zhǔn)備階段就會初始化并且賦值;

其他的靜態(tài)變量在這個階段只是會被初始化然后賦默認(rèn)值,如果靜態(tài)變量設(shè)置了final關(guān)鍵字,那么就是第一種情況會對變量進行賦值;

對于實例變量(非靜態(tài)變量)的賦值是在實例構(gòu)造器《init》中。

「該結(jié)構(gòu)中存放的字段是:」

「《Java虛擬機規(guī)范》中規(guī)定該屬性結(jié)構(gòu)中存放的必須是靜態(tài)的字段,而對于javac編譯器來說還需要滿足final關(guān)鍵字的修飾,因此經(jīng)過javac編譯器編譯后的該屬性中存放的字段必須是static并且是final的。」

?通知虛擬機自動為靜態(tài)變量賦值(上面那句話)。該屬性中只能存放基本類型和String,因為該屬性的屬性值

?

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


Deprecated及Synthetic屬性

?這兩項屬性有點特殊,不攜帶任何屬性值,出現(xiàn)這兩個屬性的目的只是為了標(biāo)識,這兩個屬性只有存在或不存在。

?

  1. 「Deprecated屬性」 該屬性用于表示某個類,字段或方法已經(jīng)不再推薦使用,通過“@deprecated”注解設(shè)置這個屬性

2.「Synthetic屬性」

該屬性用于表示字段或者方法是編譯器自己添加的,不是代碼中的。也可以通過設(shè)置訪問標(biāo)志ACC_SYNTHETIC標(biāo)志位生成該項屬性。

結(jié)構(gòu):兩者都一樣,不攜帶任何屬性值。只是用于標(biāo)識圖片


StackMapTable

「該屬性位于Code屬性的屬性表中」

?用處:在類加載階段的驗證階段使用該屬性,代替以前耗性能的基于數(shù)據(jù)流分析的類型推導(dǎo)驗證器(有了該屬性之后就不用類型推導(dǎo)了,可以直接判斷類型是不是符合要求,之后單獨寫類加載階段進行分析)

?

?之前驗證階段是基于數(shù)據(jù)流來進行分析推導(dǎo)出操作數(shù)棧和本地變量表操作的類型是否一致等(比如istore需要將操作數(shù)棧的數(shù)據(jù)保存到本地變量表中,但是取出的數(shù)據(jù)類型不是int就會發(fā)生問題),現(xiàn)在基于該項屬性可以不用推導(dǎo)

?

結(jié)構(gòu):圖片「一個Code屬性最多只能有一個StackMapTable屬性」


MethodParameters

「用于記錄方法的各個形參名稱和信息」

方法參數(shù)屬性,位于class中的屬性表中。之前說過這部分是存儲在局部變量表中的,因為方法中有方法體code屬性,而code中需要有局部變量表屬性代表這個方法中的變量存儲。

但是為什么還要單獨抽出一個屬性放在class中呢?

大家想想沒有code就沒有局部變量表,沒有局部變量表是不是就不能存儲方法參數(shù)了;你看接口中他有方法吧但是呢他其實沒有方法提code所以它的方法參數(shù)往哪放呢?往他借口的屬性表集合中放,也就是與code同級。這樣的話我接口里可以直接獲得方法參數(shù)通過這個屬性;而對于正常的方法也就是有方法體的代碼可以從code中的局部變量表中拿。

數(shù)據(jù)結(jié)構(gòu):1.首先說明他是什么,我是一個方法參數(shù)類型 2.我說明我存儲的時候數(shù)據(jù)有多長(多少字節(jié)),為了切割按照這個就可以正確讀取對應(yīng)的數(shù)據(jù);但是如果這個屬性中還用到了其他的數(shù)據(jù)結(jié)構(gòu)(屬性),那么就是這個屬性的個數(shù)了

3.對于沒有再次用到其他屬性來描述的屬性直接使用定長數(shù)據(jù)即可;但是對于有用到其他屬性來描述這個屬性的話,則后面是對應(yīng)的屬性一個一個排開,然后每個屬性如果是定長的話則不需要通過長度來說明所占字節(jié),然后這個屬性中存儲的第一個永遠是他是什么也就是名字,然后再是對應(yīng)的值

不斷使用這種結(jié)構(gòu)來描述一個完整的class結(jié)構(gòu)

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

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

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104110
  • Class
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

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

    關(guān)注

    0

    文章

    155

    瀏覽量

    12168
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    JavaWeb入門響應(yīng)的結(jié)構(gòu)

    JavaWeb入門—響應(yīng)的結(jié)構(gòu)
    發(fā)表于 05-15 06:00

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

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

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

    的整體結(jié)構(gòu)大致如下:    1、類加載器  類加載器用來加載Java類到JVM虛擬機中,源代碼程序.java文件在經(jīng)過編譯器編譯之后就被轉(zhuǎn)換成字節(jié)代碼.class文件,類加載器負責(zé)讀取字節(jié)代碼,并轉(zhuǎn)
    發(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)屬性信息,對于電子商務(wù)實現(xiàn)商品的對比與推薦及用戶需求預(yù)測等功能具有重要意義.現(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實例運行的起點 b) 運行。main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護
    發(fā)表于 04-03 11:03 ?5次下載

    Java:JVM虛擬機的入門知識

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

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

    ?根據(jù)《JAVA虛擬機規(guī)范》的規(guī)定,Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲數(shù)據(jù),這種偽結(jié)構(gòu)中(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'>結(jié)構(gòu)</b>介紹1

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

    本篇文章圖中貼出的類型這一列也都是這兩個數(shù)據(jù)類型,如果類型是u開頭的表示為無符號數(shù)的數(shù)據(jù)類型,如果是_info結(jié)尾的表示是類型。
    的頭像 發(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'>結(jié)構(gòu)</b>介紹<b class='flag-5'>2</b>

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

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

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

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

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

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

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    初始分配的堆內(nèi)存大小。例如,-Xms512m表示將初始堆大小設(shè)置為512MB。 -Xmx:設(shè)置JVM最大可分配的堆內(nèi)存大小。例如,-Xmx2g表示將最大堆大小設(shè)置為2GB。 -Xmn:設(shè)置年輕代的大小
    的頭像 發(fā)表于 12-05 11:36 ?1048次閱讀

    jvm metaspacesize大小設(shè)置

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