亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java運行時的數據區有哪些

發布時間:2020-11-21 16:53:08 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Java運行時的數據區有哪些,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

JVM體系結構和運行時數據區概述

要理解JVM的運行時數據區, 必須先要理解JVM的體系結構, 因為虛擬機的體系結構基本上解釋了“為什么會有這些運行時數據區” 。 JVM的體系結構如下:

Java運行時的數據區有哪些

由此可見, 運行時數據區的劃分, 是和JVM的體系結構相關的。 本文主要介紹運行時數據區的劃分, 對體系結構不做深入的講解。 簡單概括一下, 類加載器子系統用于將class文件加載到虛擬機的運行時數據區中(準確的說應該是方法區) 。 可以認為執行引擎是字節碼的執行機制, 一個線程可以看做是一個執行引擎的實例。 下面介紹運行時數據區:

JVM運行時數據區

方法區

在字面意思上, “方法區”這個詞會讓人產生誤解。因為方法區存放的不只是方法, 它存放的是類型信息。我們在寫程序的時候, 幾乎總是在和類, 對象打交道, 我們知道根據一個類可以創建對象。 一般來說, 我們操縱的是對象, 訪問對象的屬性, 調用對象的方法等, 但是我們要思考這樣一個問題, 虛擬機根據什么信息知道如何創建對象的呢? 當然是根據這個對象的類型信息, 但是這個類型信息在哪里呢?現在我們知道是在方法區中。 那么類型信息是被誰加載到方法區中的呢?由上面的體系結構圖, 我們可以知道是類加載器子系統?那么所謂的類型信息, 都包含什么信息呢?這些信息又是如何存放的呢?這里的類型信息, 可以籠統的認為就是我們前面講解過的一個class文件,類加載器子系統將會提取class文件里面的類型信息,并將這些類型信息存放到方法區中。  至于方法區中如何存放一個類型數據, 是和JVM的具體實現相關的。 但是不管如何實現, 一個類的類型信息總是會包含如下信息:

類的全限定名

當前類的直接父類的全限定名

這個類是接口類型, 類類型, 還是枚舉類型

類的訪問修飾符信息

當前類型的超接口的全限定名

當前類型的常量池

字段信息

方法信息

如果對class文件格式比較熟悉的話, 可以看出, 這些信息都是在class文件中描述過的。 由于我們無法看到類型信息具體是如何存儲的, 但是大致可以將類型信息看做一個class文件, 這有助于我們的理解。下面再次列出class文件結構的表格,讀者可以對比class文件中的內容到類型數據上, 該表中的各種數據已經在前面的博客中詳細講解過:

Java運行時的數據區有哪些

 類型數據中,除了這些基本信息外, 類型信息還包括以下兩個方面:

一個到類的ClassLoader對象的引用

一個到表示該類的Class實例對象的引用

靜態變量存儲區

由于之前的博客中詳細介紹過class文件的格式, 對上面的一些基本信息我們可能比較熟悉, 但是對這兩種信息就比較陌生了。 其實說來也簡單,每個class都是被一個類加載器加載到方法區的, 類型信息中的到類的ClassLoader對象的引用, 表明了當前的類是被哪個類加載器加載的, 這個信息同時也標示了當前的類型的名稱空間。

每當一個class文件被成功的加載到方法區中, JVM總會創建一個Class對象, 來唯一標示這個類。 這個Class對象可以看做是類加載過程的產物, 由于它描述了整個類型信息, 而Java中的反射也是針對的類型信息, 所以這個Class對象是反射的基石, 大多數反射API都是根據Class對象來實現的。 

而靜態變量也是存在于類型信息中, 可以這么說, 類型信息中, 會有專門的區域存放類的靜態變量。 與存在于對象中的實例變量不同, 靜態變量存在于類型數據中, 每個類型只有一份,所以也叫類變量。

方法區是一個相對來說比較固定的內存區, 因為它存放的是類型信息, 而類型信息在被加載到方法區中之后, 除了必要的連接和初始化, 一般不會有較大改動,一般情況下, JVM也不會卸載類型信息, 所以方法區也可以稱為JVM的靜態區。 一個類型的生命周期一般就是整個程序的生命周期。 這也是為什么要慎用靜態變量的原因所在, 因為靜態變量隨類型信息存放在方法區中, 生命周期很長, 如果使用不當, 很容易造成內存泄露。 一個JVM實例中只存在一個方法區, 方法區中的所有類型數據被所有線程共享。

方法區是存放類型數據的, 而堆則是存放運行時產生的對象的。 和C++不同的是, Java只能在堆中存放對象, 而不能在棧上分配對象, 所有運行時產生的對象全部都存放于堆中, 包括數組。 我們知道, 在Java中, 數組也是對象。一個JVM實例中只有一個堆, 所有線程共享堆中的數據(對象) 。

Java虛擬機支持幾種不同的創建對象的指令, 如new , anewarray等。 這些指令執行的結果就是在堆中分配內存, 并創建對象。 但是Java虛擬機的指令集中并不包含任何釋放內存的指令, 因而我們也就不能手動釋放內存。 所有被創建的對象都會被一個叫做垃圾收集器(GC)的模塊自動回收, 垃圾收集器有不同的實現方式, 他們以 特定的方式判斷對象是否過期, 并以特定的方式對對象進行回收, 關于垃圾收集的話題不是本文的重點, 這里就不多說了。 我們只要知道:所有創建的對象都存在堆中, 而垃圾收集器會自動回收過期的對象, 所以,JVM的堆區是垃圾收集器的“重點管理區” 。

Java棧

Java棧是一個線程的執行區域, 它保存著一個線程中的方法的調用狀態, 也可以說, 一個Java線程的運行狀態, 都由一個Java棧來保存。 在這個棧中, 每一方法對應一個棧幀, 請注意區分棧幀和棧這兩個概念。 棧指的是整個線程的執行棧, 棧幀是棧中的一個單位, 每個方法對應一個棧幀。 JVM會對Java棧執行兩種操作: 壓棧和出棧。 這兩種操作在執行時都是以幀(棧幀)為單位的。 當調用了一個新的方法, 就會壓入一個棧幀, 當一個方法調用完成, 就會彈出這個方法的棧幀, 回到調用者的棧幀。

舉例來說, 如果方法a調用了方法b, 而方法b中調用了方法c。 這個過程中的方法調用和返回的裝狀態是這樣的(其中圖中兩條虛線之間表示Java棧,每個方塊表示一個特定方法的棧幀)

Java運行時的數據區有哪些

Java棧上的所有數據都是線程私有的, 也就是說, 每個線程都會有自己的Java棧, 不會相互訪問其他Java棧中的數據。

PC寄存器

pc寄存器用于存放一條指令的地址, 這條指令就是虛擬機要執行的下一條指令。pc寄存器和線程相關聯, 每一個線程都有一個PC寄存器。

本地方法棧

我們知道Java可以和C/C++互調。如果當前線程執行的代碼是C/C++寫的本地代碼, 那么這些方法就在本地方法棧中執行,而不會在Java棧中執行, Java棧中只執行Java方法。

以上就是Java運行時的數據區有哪些,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邯郸市| 阿鲁科尔沁旗| 德令哈市| 奉新县| 平陆县| 陇南市| 鹤壁市| 抚顺县| 萨嘎县| 阿巴嘎旗| 泾源县| 兴仁县| 襄樊市| 定西市| 白山市| 临邑县| 仁化县| 曲靖市| 宕昌县| 晋州市| 青冈县| 托克托县| 洛宁县| 平陆县| 天镇县| 余姚市| 三河市| 阿克| 巴楚县| 祁连县| 邻水| 卫辉市| 潜江市| 尚义县| 卓尼县| 新余市| 成安县| 铜鼓县| 田阳县| 榆社县| 邹城市|