java類載入機制

來源:互聯網
上載者:User

標籤:類   虛擬機器   jvm   類載入機制   

最近在重新回顧java基礎,對java運行時整個記憶體啟動並執行機制很好奇,看了一點深入理解java虛擬機器 進階特性和最佳實務,覺得整個jvm運行機制還是比較複雜的。待日後有時間再好好深入瞭解,暫時先在站在理解程式的層級上簡述一下。


首先先是運行時的java的記憶體地區



簡單講一下各個地區

  程式計數器:當前線程所執行的位元組碼的行號指標,迴圈,線程恢複等基礎功能依賴這個計數器完成(線程私人,每一個線程都會有自己單獨的一個計數器)。

  本地方法棧:與java虛擬機器棧相似,不過執行的是native方法。

  方法區(包含運行時常量池):各個線程共用的地區,它用於已被虛擬機器載入的類資訊,常量,靜態變數,即時編譯器編譯後的代碼等資料。

  java虛擬機器棧:也是線程私人的,生命週期與線程相同  每個方法執行時都會建立一個棧幀(一會兒會詳細講到)結構是棧結構,先進後出。

  java堆:被線程共用 java虛擬機器管理的記憶體中最大的一塊,幾乎所有的對象執行個體都在這裡分配記憶體,也是java垃圾收集器主要管理的地區。

  運行時常量池:方法區的一部分 主要存放類的版本,欄位,方法,介面等描述資訊和常量池。常量池裡在類載入後進入運行時常量,裡面存放編譯期產生的各種字面量和符號引用等。


 

然後就是類的載入過程

  類載入時機通常在

  1.new建立執行個體時

  2.調用該類的靜態方法

  3.Class.forname("");

  .....(當類初始化時,會將他的父類一起初始化)

類的載入整個分為三個部分 1. 載入  

      類載入器將位元組碼檔案讀入記憶體,並建立一個java.lang.Class對象

 2. 串連      (1)驗證      (2)準備  

         為類的靜態Field分配記憶體,設定系統預設初始值

      (3)解析

         將常量池中的符號引用替換為直接引用

 3. 初始化(主要是對staticField進行初始化)

1 2

1圖的最後i值為3

2圖的最後i值為2

根據順序進行賦值,但1圖中static代碼塊可以操作i變數,2圖中不行,static代碼塊只對i進行賦值。






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.