JVM內存區域及作用

jVM內存模型:



(1)程序計數器     
記錄當前正在執行的虛擬機指令的地址

(2)本地方法棧  
 則是虛擬機用到的native方法服務,在java源碼中會看到 native方法都沒有實現,大多數都是通過c,c++實現的。

(3)堆     
 堆的唯一目的就是存放對象實例,幾乎所有對象實例都在這裏分配內存,所有的對象實例以及數組都要在堆上分配內存

(4)虛擬機棧
   虛擬機棧則是我們要熟知的重點,是線程私有的。我們要明白虛擬機棧的應用場景:它是應用在java方法執行的時候,java方法的代碼是怎樣執行的,這就需要虛擬機棧了。虛擬機棧會爲每個執行的方法創建一個棧幀,用於存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。那麼神馬是局部變量表,什麼又是操作數棧呢?下面請聽我細細道來。





 我們通過代碼說明,我們看上面這個main方法,它的局部變量表如下圖:
  
可以看到局部變量表存儲的就是該方法中的形參和局部變量,那麼怎樣將值賦值給我這些局部變量表呢?這就用到我們的操作數棧了,同時還要用到 jvm指令集,通過指令去調用 操作方法區的常量池,局部變量表以及其他的信息,在操作數棧中進行進棧和出棧操作,賦值給局部變量表,這些東西在後面的博客中都會拿實例詳細介紹.有同學可能就會問了,學了這個東西有什麼用呢?對寫代碼有用嗎? 我只能回覆你的是,學了這個可以讓你更加的理解java代碼,能夠看到java代碼底層執行的東西,我打個比方:
     
      String a="abc";  
    String b="a"+"bc"  ;
    String c="a"+new String("bc");
      System.out.print(a==b);
      System.out.print(a==c);

 程序運行的結果是:第一個是true,第二個是false ;a==b 爲啥是true呢?a又爲啥不等於c呢?通過看指令都能看到它內部運行了,自然就知道爲啥不相等了。當然大家不要以後這些很難,其實學過彙編語言的同學就知道,這些指令都類似,瞭解基本的,然後用到時能夠對照着去解釋程序就差不多了,這能幫你更瞭解代碼的運行機制。還有,我們都知道 jdk1.5後新增了 基本類型和包裝類型的自動裝箱和拆箱操作,那你知道它的內部是怎樣運行的嗎?學了虛擬機指令,通過配置 javap(這個命令可以查看任意代碼的 指令集,後面會介紹),就都能看到了,哈哈,有沒有被 這麼強大的裝逼技術吸引呢?嘿嘿,這學會了,裝逼技術妥妥的!
  
 (5)方法區
   方法區是存儲已經被虛擬機加載的類信息、常量、靜態變量、即使編譯器編譯後的代碼等數據。也是我們應該重點了解的地方,因爲它涉及到存儲常量信息,比如說 上面main方法中 String c="xiaotang";  這個"xiaotang"字符串就是存儲在方法區中的常量池中。
    運行時常量池是方法區的一部分,Class文件中除了 有類的版本、字段、方法、接口等描述信息,還有一項是常量池,用於存放編譯時期生成的各種字面量和符號引用,這部分內容在類加載後進入方法區的運行時常量池存放.


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