方法區和常量池

方法區和常量池

2017年11月15日 21:20:11 閱讀數:7262更多

個人分類: Java虛擬機

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wangbiao007/article/details/78545189

        最近一直被方法區裏面存着什麼東西困擾着?

       1.方法區裏存class文件信息和class文件常量池是個什麼關係。

        2.class文件常量池和運行時常量池是什麼關係。

        

        方法區存着類的信息,常量和靜態變量,即類被編譯後的數據。這個說法其實是沒問題的,只是太籠統了。更加詳細一點的說法是方法區裏存放着類的版本,字段,方法,接口和常量池。常量池裏存儲着字面量和符號引用。

       符號引用包括:1.類的全限定名,2.字段名和屬性,3.方法名和屬性。

       下面一張圖是我畫的方法區,class文件信息,class文件常量池和運行時常量池的關係

       

       下面一張圖用來表示方法區class文件信息包括哪些內容:

       

         可以看到在方法區裏的class文件信息包括:魔數,版本號,常量池,類,父類和接口數組,字段,方法等信息,其實類裏面又包括字段和方法的信息。

         下面的圖表是class文件中存儲的數據類型             

 

類型 名稱 數量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count - 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attribute_count 1
attribute_info attributes attributes_count

 

       下面用一張圖來表示常量池裏存儲的內容:

        這裏寫圖片描述

 

用一個class文件實際反編譯一下

下面是原java代碼

 


 
  1. public class TestInt {

  2. private String str = "hello";

  3. void printInt(){

  4. System.out.println(65535);

  5. }

  6. }


經過反編譯後獲得class文件是下面這樣的

 

可以看出被反編譯的class文件中的內容和上面所說的是能對應上的。這就解答了class文件和靜態常量池(class文件常量池)的關係

靜態常量池和動態常量池的關係以及區別

靜態常量池存儲的是當class文件被java虛擬機加載進來後存放在方法區的一些字面量和符號引用,字面量包括字符串,基本類型的常量,符號引用其實引用的就是常量池裏面的字符串,但符號引用不是直接存儲字符串,而是存儲字符串在常量池裏的索引。

動態常量池是當class文件被加載完成後,java虛擬機會將靜態常量池裏的內容轉移到動態常量池裏,在靜態常量池的符號引用有一部分是會被轉變爲直接引用的,比如說類的靜態方法或私有方法,實例構造方法,父類方法,這是因爲這些方法不能被重寫其他版本,所以能在加載的時候就可以將符號引用轉變爲直接引用,而其他的一些方法是在這個方法被第一次調用的時候纔會將符號引用轉變爲直接引用的。

總結:

方法區裏存儲着class文件的信息和動態常量池,class文件的信息包括類信息和靜態常量池。可以將類的信息是對class文件內容的一個框架,裏面具體的內容通過常量池來存儲。

動態常量池裏的內容除了是靜態常量池裏的內容外,還將靜態常量池裏的符號引用轉變爲直接引用,而且動態常量池裏的內容是能動態添加的。例如調用String的intern方法就能將string的值添加到String常量池中,這裏String常量池是包含在動態常量池裏的,但在jdk1.8後,將String常量池放到了堆中。

下面有一篇文章寫的是比較好的

http://blog.csdn.net/vegetable_bird_001/article/details/51278339
 

https://www.cnblogs.com/holos/p/6603379.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章