1. 程式人生 > >JAVA虛擬機器方法區介紹

JAVA虛擬機器方法區介紹

 最近專案資料量猛增,需要監控JVM引數並調優,作為一個之前搞C++的新小二,趕緊惡補一下虛擬機器的知識,在網上搜集各種資料,總結一下方法區記憶體佈局,如有錯誤,歡迎指導。
1、JVM記憶體模型

    大多數JVM將記憶體分配為Method Area(方法區)、Heap(堆)、Program Counter Register(程式計數器)、JAVA Method Stack(JAVA方法棧)、Native Method Stack(本地方法棧)。

1.1 Method Area

    執行緒共享,儲存已經被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等等。(HotSpot虛擬機器上開發部署人員更願意成為“永久代”,Permanent Generation)。示意圖如下:
方法區記憶體佈局

1、型別資訊

  • 型別的全限定名
  • 超類的全限定名
  • 直接超介面的全限定名
  • 型別標誌(該類是類型別還是介面型別)
  • 類的訪問描述符(public、private、default、abstract、final、static)

2、型別的常量池

         存放該型別所用到的常量的有序集合,包括直接常量(如字串、整數、浮點數的常量)和對其他型別、欄位、方法的符號引用。常量池中每一個儲存的常量都有一個索引,就像陣列中的欄位一樣。因為常量池中儲存中所有型別使用到的型別、欄位、方法的字元引用,所以它也是動態連線的主要物件(在動態連結中起到核心作用)。

3、欄位資訊(該類宣告的所有欄位)

  • 欄位修飾符(public、protect、private、default)
  • 欄位的型別
  • 欄位名稱

4、方法資訊

         方法資訊中包含類的所有方法,每個方法包含以下資訊:

  • 方法修飾符
  • 方法返回型別
  • 方法名
  • 方法引數個數、型別、順序等
  • 方法位元組碼
  • 運算元棧和該方法在棧幀中的區域性變數區大小
  • 異常表

5、類變數(靜態變數)

         指該類所有物件共享的變數,即使沒有任何例項物件時,也可以訪問的類變數。它們與類進行繫結。

6、  指向類載入器的引用

         每一個被JVM載入的型別,都儲存這個類載入器的引用,類載入器動態連結時會用到。

7、指向Class例項的引用

        類載入的過程中,虛擬機器會建立該型別的Class例項,方法區中必須儲存對該物件的引用。通過Class.forName(String className)來查詢獲得該例項的引用,然後建立該類的物件。

8、方法表

         為了提高訪問效率,JVM可能會對每個裝載的非抽象類,都建立一個數組,陣列的每個元素是例項可能呼叫的方法的直接引用,包括父類中繼承過來的方法。這個表在抽象類或者介面中是沒有的,類似C++虛擬函式表vtbl。

9、執行時常量池(Runtime Constant Pool)

         Class檔案中除了有類的版本、欄位、方法、介面等描述資訊外,還有一項資訊是常量池,用於存放編譯器生成的各種字面常量和符號引用,這部分內容被類載入後進入方法區的執行時常量池中存放。

執行時常量池相對於Class檔案常量池的另外一個特徵具有動態性,可以在執行期間將新的常量放入池中(典型的如String類的intern()方法)。

(這個地方不太理解,網上找來的解釋不知道對否:執行時常量池是把Class檔案常量池載入進來,每個類有一個獨立的。剛開始時執行的時候常量池裡的連結都是符號連結(只用名字沒有實體),跟在Class檔案裡的一樣;邊執行邊把常量轉換成直接連結。例如說要Class A呼叫Foo.bar()方法,A.class檔案裡就會有對該方法的Method ref常量,是個符號連結(只有名字沒有實體),載入到執行時常量池也還是一樣是符號連結,等真的要呼叫該方法的時候該常量就會被resolve為一個直接連結(直接指向要呼叫的方法的實體))。

參考地址:http://blog.csdn.net/lipeijs3/article/details/5298998

相關推薦

JAVA虛擬機器方法介紹

 最近專案資料量猛增,需要監控JVM引數並調優,作為一個之前搞C++的新小二,趕緊惡補一下虛擬機器的知識,在網上搜集各種資料,總結一下方法區記憶體佈局,如有錯誤,歡迎指導。1、JVM記憶體模型     大多數JVM將記憶體分配為Method Area(方法區)、Heap(

Java虛擬機器記憶體結構介紹

文章目錄 一 前言 二 JVM記憶體結構 三 程式計數器 四 虛擬機器棧 五 本地方法棧 六 GC堆 七 方法區 八 執行時常量池 九 直接記憶體 十 總結 一

Java 虛擬機器基本結構介紹

java虛擬機器的基本結構如圖所示: 基本的結構有8個 類載入子系統: 主要負責負責載入Class資訊,載入的類資訊都存放在方法區的類存空間中。 當JVM使用類載入器裝載某個類時,它首

℃江的觀後感 -- Java 虛擬機器方法、直接記憶體和執行時常量池

方法區 我們知道方法區,當然是和方法有關,Java虛擬機器的作用就兩個,儲存、運算。其實我們叫其方法區,說明和儲存東西有關,但是存什麼呢?這塊儲存的是虛擬機器載入的類資訊,常亮,靜態變數和有個就是即使編譯後的程式碼等資料。方法區一般在hotspot被稱為永久代

java虛擬機器 jvm 方法實戰

和java堆一樣,方法區是一塊所有執行緒共享的記憶體區域,用於儲存系統的類資訊,類的資訊有哪些呢。欄位、方法、常量池。方法區也有一塊記憶體區域所以方法區的記憶體大小,決定了系統可以包含多少個類,如果系

(jvm-java虛擬機器)棧,堆,方法的關係

                 很多人雖然會些一些程式碼,但是並不知道這些資料,程式碼適怎樣執行實現的,那我們就要來看看jvm(也就是java虛擬機器)。                  java虛擬機器其實就是java程式執行的一個載體,java程式啟動時,java

方法(關於java虛擬機器記憶體的那些事)

《深入理解 java 虛擬機器》 讀書擴充套件 作者:淮左白衣 寫於 2018年4月13日21:26:05 目錄 方法區 儲存在著被載入過的每一個類的資訊;這些資訊由類載入器在載入類的時候,從類的原始檔中抽取出來;static變

JVM執行時資料區域 —— 程式計數器、Java虛擬機器棧、本地方法棧、Java堆、方法、執行時常量池

java虛擬機器執行時資料區域的概括圖如下所示: 下面將對執行時資料區進行講解 程式計數器 1、說明:程式計數器可以看做是當前執行緒所執行的位元組碼的行號指示器。其實通俗點講就是記錄class檔案執行到哪一行 2、注意的點: (1)因為CPU執

java虛擬機器1.執行時資料

Java技術體系模組圖 java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,以及各自的建立和銷燬時間,有的區域隨虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。 程式計數器 是一塊較小的記憶體空

Java虛擬機器(JVM原始碼):JDK10對Java虛擬機器執行時資料的劃分(詳細圖解)

Java虛擬機器執行時資料區 為什麼要研究這個,因為JDK都已經發布到10了,必須要更新自己對Java虛擬機器新的認識。 一、執行時資料區的劃分 1.1 官方劃分 關於JDK10對執行時資料區的劃分,在官方文件說的非常清楚。 學習技術,一定要學會看第一手資料。 Ja

JAVA虛擬機器結構之執行時資料

jvm的執行時資料區根據用途一共可以分為這幾類:pc寄存機,java虛擬機器棧,java堆,方法區,執行時常量池,本地方法棧。其中java堆,方法區,執行時常量是公有的資料區,隨著虛擬機器的啟動而建立,隨著虛擬的退出而銷燬。而pc暫存器,java虛擬機器棧,本地方法棧則是執行緒私有的

《深入理解java虛擬機器》讀書筆記(三)---- 垃圾回收演算法及垃圾收集器介紹

一、垃圾回收演算法 1、標記--清除演算法 標記--清除(Mark-Sweep)演算法,分為標記和清除兩個階段,首先標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件,這是最基礎的收集演算法,後續很多演算法都是基於這種思想進行設計的。 標記--清除演算法主要的不足有兩點:一個

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

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

Java虛擬機器棧和本地方法

java虛擬機器棧由棧幀組成,幀中儲存方法的執行狀態,包括區域性變量表和運算元棧等。在任一時刻,某一執行緒肯定是在執行某個方法。這個方法叫做該執行緒的當前方法;執行該方法的幀叫做執行緒的當前幀;宣告該方法的類叫做當前類。如果當前方法是java方法,則pc暫存器中存放當前正在執行的java虛擬機器指令

Java虛擬機器】棧幀和方法呼叫

棧幀和方法呼叫 執行時棧幀結構 區域性變量表 運算元棧 動態連線 返回地址 方法呼叫 解析 分派 靜態分派 動態分配 虛擬機器動態分配的實現

Java虛擬機器】finalize() 方法

finalize() 方法 物件的回收需要經歷兩次標記過程:如果物件在進行可達性分析後發現沒有與GC Roots相連線的引用鏈,那麼它將會被第一次標記並且進行一次篩選,篩選的條件就是此物件是否有必要執行finalize() 方法。當物件沒有覆蓋finalize() 方法,或者fina

java虛擬機器棧與本地方法

java虛擬機器棧:    虛擬機器棧描述的是java方法執行的記憶體模型,每個方法在執行的同事都會建立一個棧幀用於儲存區域性變量表、運算元棧、動態連結,方法出口燈資訊。每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。 在java虛擬機

《自己動手寫java虛擬機器》學習筆記(七)-----執行緒私有執行時資料(go)

     專案地址:https://github.com/gongxianshengjiadexiaohuihui      在執行java程式時,Java虛擬機器需要使用記憶體來存放各種各樣的資料,Java虛擬機器規範把這些記憶體的區

深入理解 Java 虛擬機器(九)方法呼叫

方法呼叫 方法呼叫不等同於方法執行,方法呼叫階段唯一任務就是確定被呼叫方法的版本(即呼叫哪一個方法),暫時還不涉及方法內部的具體執行過程。一切方法呼叫在 Class 檔案裡面儲存的都只是符號引用,需要在類載入期間,甚至到執行期間才能確定目標方法的直接引用。

java虛擬機器執行時資料

Java在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途、建立和銷燬的時間,有一些是隨虛擬機器的啟動而建立,隨虛擬機器的退出而銷燬,有些則是與執行緒一一對應,隨執行緒的開始和結束而建立和銷燬。 Java虛擬機器所管理的記憶