中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎樣了解JVM內存模型

發布時間:2021-10-23 16:03:08 來源:億速云 閱讀:145 作者:柒染 欄目:大數據

本篇文章為大家展示了怎樣了解JVM內存模型,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

如果想了解JVM內存模型,首先我們要知道JVM是什么?JVM全稱 Java Virtual Machine ,即Java虛擬機,是用于運行Java程序編譯后的字節碼文件。

JVM最常見的三種類型有:
1.Sun公司的 HotSpot,是目前使用最廣泛的Java虛擬機。
2.BEA公司的 JRockit,后來被 Oracle收購。
3.IBM公司的 J9VM。

我們知道,Java的口號是:“Write once, run anywhere”,即一次編寫,到處運行。為什么可以做到這樣呢,其實就是依賴于JVM。在不同的操作系統上,只要安裝了對應的虛擬機,那么同樣的一份代碼,就可以隨意移植。

當編寫完Java代碼時,即產生 .Java文件,會通過Java編譯器編譯為.class 文件,然后通過Class Loader把類信息加載到JVM中,最后JVM再去調用操作系統。這樣,只要JVM正確執行.class文件,就可以實現跨平臺了。

以下即為JVM的內存模型圖:

怎樣了解JVM內存模型  
file

程序計數器:

程序計數器是一塊較小的內存,可以看做是當前線程所執行的字節碼的行號指示器,即記錄當前線程所執行到的字節碼的行號。當字節碼解釋器工作時,就是通過改變計數器的值來選取下一條需要執行的字節碼指令。由此來完成分支、循環、跳轉、線程恢復、異常處理等功能。

程序計數器是線程私有的(即每個線程擁有一個程序計數器),各個線程之間的程序計數器互不干擾。程序計數器的生命周期跟隨線程的生命周期,若線程消亡,則程序計數器也會消亡。

如果一個線程正在執行的是Java方法,則程序計數器記錄的是正在執行的字節碼指令的地址;如果正在執行的是 native 本地方法,則程序計數器記錄的是 Undefined .

指的是Java虛擬機棧,它也是線程私有的,因此生命周期和線程相同。每當線程創建的時候,都會創建一個私有的Java虛擬機棧。Java棧中保存了局部變量和方法參數等,同時和Java方法的調用、返回密切相關。

每個方法在執行的同時都會創建一個棧幀,用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用到執行完成的過程,就對應一個棧幀在虛擬機棧中從入棧到出棧的過程。

本地方法棧

本地方法棧和Java虛擬機棧非常類似,它們最大的不同在于,Java虛擬機棧用于Java方法的調用,而本地方法棧用于Native本地方法的調用。

Java堆是所有線程共享的一塊內存區域,在虛擬機啟動時創建。對于絕大多數應用來說,Java堆是JVM所管理的內存中最大的一塊,幾乎所有的對象實例和數組都存放在這里。

Java堆也是垃圾收集器管理的主要區域。堆中分為新生代、老年代和永久代,新生代還可細分為Eden區、From、To 區。當堆中沒有內存可分配時,就會拋出OOM異常。

方法區

方法區同Java堆一樣,也是所有線程共享的內存區域。用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。在JDK8以前,HotSpot是用“永久代”來實現方法區的,其他虛擬機(如JRockit、J9VM)不存在永久代這個概念。這樣的話,方法區可以和Java堆一樣被 HotSpot的垃圾收集器所管理,不需要單獨處理。

由于我們可以通過 -XX:MaxPermSize 來設置永久代大小,因此若使用永久代來實現方法區,則會有內存溢出的風險。因此,在JDk8中,取消了永久代,用元空間代替之。也就是說,用元空間來實現方法區。

元空間的本質和永久代類似,都是對JVM規范中方法區的實現。元空間與永久代之間最大的區別在于:永久代是堆的一部分,和新生代,老年代地址是連續的。元空間并不在虛擬機中,而屬于 Native Memeory(本地內存)。因此,默認情況下,元空間的大小僅受本地內存限制。

運行時常量池

首先需要知道常量池和運行時常量池的區別。

常量池,即指class文件常量池,是class文件的一部分。java文件被編譯成class文件之后,除了包含了類的版本、字段、方法、接口等描述信息,還有一項信息叫做class文件常量池。其用于存放編譯期生成的各種字面量和符號引用。

怎樣了解JVM內存模型  
file

運行時常量池是方法區的一部分。當類加載到內存中,JVM就會將class文件常量池中的內容(字面量和符號引用)存放到運行時常量池中。

Java并不要求常量一定只有在編譯期才可以產生,在運行期間也可以產生新的常量并放入池中。

直接內存

Java的NIO庫允許Java程序使用直接內存。直接內存是Java堆外的,直接向系統申請的一塊內存空間(直接內存不屬于虛擬機運行時數據區)。因此,直接內存的大小不受虛擬機的限制,只受本機內存的限制。通常訪問直接內存的速度會快于訪問堆的速度。

上述內容就是怎樣了解JVM內存模型,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

jvm
AI

隆子县| 松阳县| 巩义市| 大竹县| 信宜市| 黑山县| 定边县| 萍乡市| 保亭| 宜阳县| 娱乐| 繁昌县| 临湘市| 西丰县| 巫山县| 乌鲁木齐市| 东光县| 宜君县| 大化| 客服| 乌拉特前旗| 江永县| 陆川县| 洛隆县| 华亭县| 托里县| 金堂县| 南乐县| 灵石县| 昌平区| 宜州市| 牡丹江市| 抚远县| 塔城市| 武宣县| 泰顺县| 安西县| 普兰店市| 固原市| 长岭县| 崇左市|