1. 程式人生 > >[java虛擬機器]--(2)位元組碼檔案--(3)常量池

[java虛擬機器]--(2)位元組碼檔案--(3)常量池

宣告:
    Author:趙志乾
    Date:2018-6-18
    Declaration:All Right Reserved!!!

背景知識:

常量池這一概念在虛擬機器記憶體章節中也提到過(《虛擬機器記憶體》)。虛擬機器記憶體中的常量池位於方法區內,其全稱為執行時常量池。之所以稱為執行時常量池,是因為其伴隨虛擬機器的執行而存在,具有動態性,即隨時間的推移,會有新的內容加入,也有新的內容被gc執行緒回收。而位元組碼檔案中的常量池則是一個靜態概念,其內容不會隨時間發生變動。

位元組碼檔案中的常量池

1、靜態常量池緊隨檔案版本號,是位元組碼檔案中的第一個表型別資料。其作為檔案中的資源倉庫,為其他內容提供了各種索引資訊。

靜態常量池的大小隨檔案而不同,故在其入口處放置一容器計數器,以表徵當前檔案中靜態常量池的大小。而池記憶體放的內容大體上可分為兩大類:字面常量和符號引用。

靜態常量池本身是一個表型別資料,並且其存放的每一個數據項也是一個表型別資料。最無語的是這些資料項共有14種類型,且結構各不相同。不過每一資料項的起始都會有一個標誌位tag,來表徵其屬於哪一種常量型別。

補充內容:(2018-10-9)

1、常量池中存放常量,但並不是所有的常量都存放於常量池。

這一點需要從常量池的作用談起。在資訊包含層面上,可以將常量池看作是資源登錄檔,如各種型別、標識等;在功能層面上,可以將常量池看作是引用的轉換媒介,如在語句中使用的各種標識、型別等,只需要使用其在常量池中的索引便可引用,從而為各種常量提供統一的訪問方式。

其次要從常量的種類談起。常量有很多種類,光常量池中可存放的就有14種。除此之外,還有數值型字面常量,布林值字面常量等,也就是說數值型字面常量和布林值字面常量是不放在常量池中的。

2、數值型字面常量和布林值字面常量為什麼不放到常量池中?

布林值字面常量在底層實際上會轉化為數值型字面常量,即所謂的true和false是編譯器為開發人員提供的語法糖。因此,我們只討論數值型字面常量即可。

數值型字面常量相對於其他種類的常量,有其自身的特殊性:短小。如果將數值型字面常量佈局到常量池,從空間角度來看:語句中還需要存放所需常量在常量池中的索引,以便完成引用的轉換,而索引本身佔用的大小和數值型字面常量相比又相差無幾,勢必會帶來空間消耗的倍增;從時間角度來看:語句在執行過程中,需要通過所需常量在常量池中的索引完成到常量具體內容的轉化,而這一過程是需要消耗額外的CPU時鐘週期的。所以,基於時空雙重角度的考慮,將數值型字面常量直接放置在指令語句中,作為立即數來使用,而不是將其放到常量池中。

郵箱:[email protected]

參考資料:《深入理解Java虛擬機器》--周志明

相關推薦

[java虛擬機器]--(2)位元組檔案--(3)常量

宣告: Author:趙志乾 Date:2018-6-18 Declaration:All Right Reserved!!! 背景知識: 常量池這一概念在虛擬機器記憶體章節中也提到過(《虛擬機器記憶體》)。虛擬機器記憶體中的常量池位於方法區內,其

java虛擬機器5 位元組

  java位元組碼本質是java程式的格式化表示,便於機器處理。所以他是java程式的另一種表示,java程式包含的資訊他都包含並且更加結構化。   java虛擬機器位元組碼格式:  magic   魔數,標識該檔案是一個位元組碼檔案。 minor_version major_ver

深入理解Java虛擬機器(七)位元組執行引擎(棧幀、動態連線、方法呼叫)

執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執

[三] java虛擬機器 JVM位元組 指令集 bytecode 操作 指令分類用法 助記符

上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot  其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資

Java虛擬機器位元組執行引擎

1 概述 虛擬機器執行引擎是Java虛擬機器最核心的部分之一,其目的是實現:輸入位元組碼檔案,將位元組碼解析或等效處理後,執行並輸出結果。 其中兩種執行方式:解釋執行和編譯執行。 2 執行時棧幀結構 棧幀(Stack Frame)是用於支援虛擬機器進

深入理解Java虛擬機器位元組執行引擎)

本文首發於微信公眾號:BaronTalk 執行引擎是 Java 虛擬機器最核心的組成部分之一。「虛擬機器」是相對於「物理機」的概念,這兩種機器都有程式碼執行的能力,區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器執行引擎是由自己實現的,因此可以自行制定指令集與執行

Java虛擬機器原理圖解》1.3、class檔案中的訪問標誌、類索引、父類索引、介面索引集合

講完了class檔案中的常量池,我們就相當於克服了class檔案中最麻煩的模組了。現在,我們來看一下class檔案中緊接著常量池後面的幾個東西:訪問標誌、類索引、父類索引、介面索引集合 訪問標誌、類索引、父類索引、介面索引集合 在class檔案中的位置

深入理解Java虛擬機器筆記---class類檔案魔數,版本,常量

魔數    每個class檔案的頭4個位元組稱為魔數(Magic Number),其值為:0xCAFEBABE,它的唯一作用是用於確定這個檔案是否為一個能被虛擬機器接受的class檔案。使用魔數而不是副檔名來進行識別主要是基於安全的考慮,因為檔案的副檔名可以隨意地被改動。 版本號

深入理解JAVA虛擬機器2:JVM記憶體結構

記憶體結構一覽 在上一篇文章中,我們最後給出了一幅圖 這幅圖中,就包含了JVM的記憶體結構的所有組成元素,他們分別是:java堆記憶體、java棧、方法區、本地方法區以及pc暫存器,接下來我們就對這些區域逐一介紹。 java堆       Java堆是Java虛擬

讀書筆記-深入理解Java虛擬機器#2

一、物件已死 引用計數演算法,引用加1,失效減1;為0時被回收。 可達分析演算法,從GC Root開始搜尋,當一個物件在GC ROOT沒有任何引用鏈則物件不可用。 GC ROOT 物件包括下面幾種: 1.虛擬機器棧中引用的物件; 2.方法區中類靜態屬

【深入理解 Java 虛擬機器筆記】類檔案結構

5.類檔案結構 由於最近十年內虛擬機器以及大量建立在虛擬機器之上的程式語言如雨後春筍般出現並蓬勃發展,將我們編寫的程式編譯成二進位制本地機器碼(Native Code)已不再是唯一的選擇,越來越多的程式語言選擇了作業系統和機器指令集無關的、平臺中立的格式作為程式

Java虛擬機器之搜尋class檔案

Java命令 Java虛擬機器的工作是執行Java應用程式。和其他型別的應用程式一樣,Java應用程式也需要一個入口點,這個入口點就是我們熟知的main()方法。如果一個類包含main()方法,這個類就可以用來啟動Java應用程式,我們把這個類叫作主類。最簡單的Java程式是隻有一個main()方法的類,如

深入理解java編譯後的位元組檔案

也許你寫了無數行的程式碼,也許你能非常溜的使用高階語言,但是你未必瞭解那些高階語言的執行過程。例如大行其道的Java。Java號稱是一門“一次編譯到處執行”的語言,但是我們對這句話的理解深度又有多少呢?從我們寫的java檔案到通過編譯器編譯成java位元組碼檔案(也就是.cl

深入理解Java虛擬機器(類檔案結構+類載入機制+位元組執行引擎)

周志明的《深入理解Java虛擬機器》很好很強大,閱讀起來頗有點費勁,尤其是當你跟隨作者的思路一直探究下去,開始會讓你弄不清方向,難免有些你說的啥子的感覺。但知識不得不學,於是天天看,反覆看,就慢慢的理解了。我其實不想說這種硬磨的方法有多好,我甚至不推薦,我建議大家閱讀這本書時,由淺入深,有舍有得,先從巨集觀去

Java虛擬機器(四):Class檔案結構及位元組指令

    接下來的兩個位元組為this_class項,它是一個對常量池的索引。在this_class位置的常量池入口必須為CONSTANT_Class_info表。該表由兩個部分組成——標籤和name_index。標籤部分是一個具有CONSTANT_Class值的常量,在name_index位置的常量池入口為一

深入理解java虛擬機器(六)位元組指令簡介

Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第7篇:虛擬機器位元組執行引擎

上一篇:虛擬機器類載入機制:https://blog.csdn.net/pcwl1206/article/details/84260914 第7篇:虛擬機器位元組碼執行引擎 執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力

【深入理解 Java 虛擬機器筆記】虛擬機器位元組執行引擎

7.虛擬機器位元組碼執行引擎 執行引擎是 Java 虛擬機器最核心的組成部分之一。在 Java 虛擬機器規範中制定了虛擬機器位元組碼執行引擎的概念模型,這個概念模型成為各種虛擬機器執行引擎的統一外觀(Facade)。不同的虛擬機器實現,執行引擎可能會有解釋執行和編譯執行兩種,有可能兩

自己動手寫Java虛擬機器(第2章 搜尋class檔案

學習Java虛擬機器以及go語法,記錄下自己的學習過程 2.1 類路徑 2.2 準備工作 2.3 實現類路徑 2.3.1 Entry介面 2.3.2 DirEntry 2.3.3 ZipEntry 2.3.4 CompositeEntry 2.3.5 Wil

jdk原始碼解析(八)——Java虛擬機器位元組執行引擎

在前面我們瞭解了jvm執行時資料區,那個jvm圖中有執行引擎,那麼今天就解釋一下Java虛擬機器位元組碼執行引擎。 1 定義 Java虛擬機器位元組碼執行引擎是jvm最核心的組成部分之一,“虛擬機器” 是一個相對於 “物理機” 的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行