java虛擬機結構

      java虛擬機在運行時的數據區域:

 

  1. 程序計數器:較小,起作用是當前線程所執行的字節碼的行號指示器,即指令的執行順序,如分支,循環,跳轉,異常處理,線程恢復等。這個是線程獨立的,每個線程都有自己的程序計數器,各線程之間互不影響,獨立存儲。
  2. java虛擬機棧:線程私有的,其生命週期與線程相同。虛擬機棧描述的是java方法執行的內存模型,每個方法都有一個棧幀,存儲局部變量表,操作數棧等。局部變量表存放各種基本數據類型(Boolean,int,string,char,long等),對象的引用等。
  3. 本地方法棧:與虛擬機棧類似,描述的是native方法,有的虛擬機把其和虛擬機棧合併。
  4. java堆:是虛擬機管理的內存中最大的一塊。java堆是所有線程共享的,在啓動時創建,這個內存區域的唯一目的就是存放對象實例。這部分也是垃圾回收器管理的重要區域,也被稱爲“GC堆”。
  5. 方法區:與java堆一樣,是線程共享的,用於存儲已被虛擬機加載的類信息,敞亮,靜態變量等。運行時常量池是方法區的一部分,用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後存放到方法區的運行時常量池中。
  6. 直接內存:這個不屬於java虛擬機運行時數據區的一部分,但是也會頻繁使用,也會導致outofmemoryerror。

對象訪問

Object obj = new Object();

這句代碼Object obj的語義將會反映到java棧的本地變量表中,作爲引用類型出現,而new Object()這部分將反映到java堆中,形成一塊存儲了Object類型所有實例數據值的結構化內存,主流實現方式兩種:句柄式訪問方式使用直接指針方式

  1. 句柄式訪問方式:好處是棧中存儲的是穩定的句柄地址,對象移動時(垃圾回收時移動很正常)只改變句柄池中的實例數據指針,棧中的不需要變。壞處是多了之後句柄池的開銷也大了。
  2. 使用直接指針方式:好處是速度快,開銷少,壞處就是移動棧中的引用頻繁。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章