深刻理解JVM之基本構架

深刻理解JVM之基本構架


JVM詳解之 基本構架

須要小夥伴使用圖形化工具【jvisualvm】幫助咱們分析。java

  1. 首先來看圖,進行理解。
    統領全局
    類加載器將【class】文件加載到方法區,若是是java程序,jvm會把main所在的類實例化並在虛擬機棧下開闢棧空間。若是是javaweb tomcat等應用服務器,應用服務器會加載。
    在main以後,棧中就會添加棧幀,而後main可能會new 調用方法等等,new 就在heap中分配空間,在棧幀的局部變量表中添加引用地址;調用方法會新創一個棧幀。實際上,棧就是一個遞歸的過程,直到main執行完畢,最後程序結束。這個大體的過程請小夥伴們必定要理解。
  2. 具體分析————————————【①方法區】
    方法區
    在Class文件中除了類的字段、方法、接口等描述信息外例如:類的全限定名(類的全路徑名) 類的直接超類的全限定名(若是這個類是Object,則它沒有超類)這個類是類型(類)仍是接口,類的訪問修飾符,全部的直接接口全限定名的有序列表(假如它實現了多個接口) 包含但不限於這些內容。若是是作java開發瞭解到此,我認爲足矣。開發虛擬機就只是常識。
      在方法區中有一個很是重要的部分就是運行時常量池,它是每個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM後,對應的運行時常量池就被建立出來。固然並不是Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中。
      以上爲我的見解和觀點,若有不正之處但願諒解並歡迎指正。
  3. 具體分析————————————【②堆】
    堆
    堆中主要就要講解gc過程,在此只簡單提一下,由於gc過程牽扯到內存分配和垃圾回收,這個問題徹底須要另外詳細解析。
  4. 具體分析————————————【③虛擬機棧】
    棧
    每個JVM線程都有本身的java虛擬機棧,這個棧與線程同時建立,它的生命週期與線程相同。一個方法一個棧幀,形參和局部變量同等對待,也在棧中分配空間。當方法執行完畢後,對應的棧幀馬上消失(包含裏面的全部引用和局部變量)。而引用的實際變量(若是沒有引用指向他的時候)則在gc的時候消失。
  5. 具體分析————————————【其餘】
    本地方法棧【native】能夠類比虛擬機棧,只不過此棧中調用的方法都是本地方法。除此以外,其餘的和虛擬機棧都相似。
    而PC寄存器,也叫程序計數器【Program Counter Register】是一塊較小的內存空間,它的做用能夠看作是當前線程所執行的字節碼的信號指示器。
    每一條JVM線程都有本身的PC寄存器在任意時刻,一條JVM線程只會執行一個方法的代碼。該方法稱爲該線程的當前方法(Current Method)若是該方法是java方法,那PC寄存器保存JVM正在執行的字節碼指令的地址若是該方法是native,那PC寄存器的值是undefined。小夥伴們只要知道就能夠了。
  6. jvisualvm可視化工具和jconsole工具
    命令行窗口輸入命令:【jvisualvm】
    cmd
    就會出現可視化工具,我是分析eclipse的堆棧,如圖下:
    可視化工具查看以上space
    第一次打開可能沒有這麼多工具,能夠點擊【工具>插件>可用插件】,選中,並【安裝】。
    而後咱們就能夠看到上面分析的一系列space面板。
    命令行窗口輸入命令:【jconsole】
    jconsole 使用jconsole工具查看各個區域的運行環境。
相關文章
相關標籤/搜索