溫馨提示×

溫馨提示×

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

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

JVM內(nèi)存區(qū)域和垃圾回收的

發(fā)布時間:2020-10-28 11:52:30 來源:億速云 閱讀:101 作者:小新 欄目:編程語言

小編給大家分享一下JVM內(nèi)存區(qū)域和垃圾回收的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、JVM簡介

JVM,全稱Java Virtual Machine,即Java虛擬機。以Java作為編程語言所編寫的應用程序都是運行在JVM上的。JVM是一種用于計算設備的規(guī)范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。Java有個非常重要的特點就是與平臺的無關性,而JVM正是實現(xiàn)這一特點的關鍵。

JVM對程序的執(zhí)行主要分為兩個步驟,第一步是編譯,即將.java的源文件編譯成為.class的字節(jié)碼文件,第二步是解釋,JVM對字節(jié)碼文件進行解釋執(zhí)行。兩個步驟流程圖分別如下兩圖所示:

JVM內(nèi)存區(qū)域和垃圾回收的

JVM內(nèi)存區(qū)域和垃圾回收的

二、JVM內(nèi)存區(qū)域

JVM整個大系統(tǒng)又分為兩個子系統(tǒng)。第一個是ClassLoader,即類加載器,功能是將編寫的類加載到JVM中。第二個是Execution Engine,即執(zhí)行引擎,負責對編譯后的字節(jié)碼文件進行解釋執(zhí)行。上述中Execution Engine又分為兩部分,第一部分是Runtime data area,即運行時數(shù)據(jù)區(qū)域,即相當于JVM中的內(nèi)存,第二部分是Native interface,即本地化接口,主要用于執(zhí)行其他非Java編程語言編寫的程序。

重點就是前者Runtime data area,它分為五個部分,分別是Method area(方法區(qū)),Heap(堆),VM stack(虛擬機棧),Program counter  register(程序計數(shù)器),Native method stack(本地方法棧)。前兩者線程共享,后三者線程隔離。如下圖所示:

JVM內(nèi)存區(qū)域和垃圾回收的

概括地說,JVM初始運行的時候都會分配好Method area(方法區(qū))和Heap(堆),而JVM 每遇到一個線程,就為其分配Program counter  register(程序計數(shù)器)、VM stack(虛擬機棧)、Native method stack(本地方法棧), 當線程終止時,三者(虛擬機棧,本地方法棧和程序計數(shù)器)所占用的內(nèi)存空間也會被釋放掉。這也是為什么把數(shù)據(jù)區(qū)域分為線程共享和線程隔離的原因,線程隔離的那三個區(qū)域的生命周期與所屬線程相同,而線程共享的區(qū)域與Java程序運行的生命周期相同,所以這也是系統(tǒng)垃圾回收場所只發(fā)生在線程共享的區(qū)域(實際上對大部分虛擬機來說是發(fā)生在Heap上)的原因。關于內(nèi)存溢出異常如下圖所示:

JVM內(nèi)存區(qū)域和垃圾回收的

1、Method area(方法區(qū))

方法區(qū)包括常量池與靜態(tài)域。存放了所加載類的信息(名稱、修飾符等)、類的靜態(tài)變量、類的常量、類的Field信息、類的方法信息。當開發(fā)人員在程序中通過Class對象中的getName、isInterface等方法來獲取信息時,這些數(shù)據(jù)都來源于方法區(qū)。

2、Heap(堆)

堆是JVM所管理的內(nèi)存中最大的一塊,幾乎所有的對象實例和數(shù)組都在此區(qū)域,可以認為Java中所有通過new創(chuàng)建的對象的內(nèi)存都在此分配,堆中的對象的內(nèi)存需要等待GC進行回收。

3、Program counter  register(程序計數(shù)器)

程序計數(shù)器是一塊較小的內(nèi)存空間,它是當前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解釋器工作時通過改變該計數(shù)器的值來選擇下一條需要執(zhí)行的字節(jié)碼指令,分支、跳轉、循環(huán)等基礎功能都要依賴它來實現(xiàn)。

4、VM stack(虛擬機棧)

虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型,每個方法在執(zhí)行時都會創(chuàng)建一個棧幀(Stack Frame),棧幀用于存儲局部變量表(基本數(shù)據(jù)類型、對象的引用等)、操作數(shù)棧、動態(tài)鏈接、方法返回地址和一些額外的附加信息。

5、Native method stack(本地方法棧)

該區(qū)域與虛擬機棧所發(fā)揮的作用非常相似,只是虛擬機棧為虛擬機執(zhí)行Java方法服務,而本地方法棧則為使用到的本地操作系統(tǒng)(Native)方法服務。

三、JVM垃圾回收

JVM的GenerationalCollecting(垃圾回收)原理是把對象分為年青代(Young)、年老代(Tenured)、持久代(Perm),對不同生命周期的對象使用不同的算法。

通常JVM內(nèi)存回收總是指Heap(堆)內(nèi)存回收,確實只有Heap(堆)中的內(nèi)容是動態(tài)申請分配的,所以以上對象的年輕代和年老代都是指的JVM的Heap(堆)空間,而持久代則是之前提到的Method area(方法區(qū)),不屬于Heap(堆)。

1. 年輕代

Java應用在分配Java對象時,這些對象會被分配到年輕代堆空間中去

這個空間大多是小對象并且會被頻繁回收

由于年輕代堆空間的垃圾回收會很頻繁,因此其垃圾回收算法會更加重視回收效率

2. 年老代

年輕代堆空間的長期存活對象會轉移到(也許是永久性轉移)年老代堆空間

這個堆空間通常比年輕代的堆空間大,并且其空間增長速度較緩

由于大部分JVM堆空間都分配給了年老代,因此其垃圾回收算法需要更節(jié)省空間,此算法需要能夠處理低垃圾密度的堆空間

3. 持久代

存放VM和Java類的元數(shù)據(jù)(metadata),以及interned字符串和類的靜態(tài)變量

當這三個分代的堆空間比較緊張或者沒有足夠的空間來為新到的請求分配的時候,垃圾回收機制就會起作用。有兩種類型的垃圾回收方式:次收集(Minor GC)和全收集(Full GC)。當年輕代堆空間滿了的時候,會觸發(fā)次收集將還存活的對象移到年老代堆空間。當年老代堆空間滿了的時候,會觸發(fā)一個覆蓋全范圍的對象堆的全收集。

以上是JVM內(nèi)存區(qū)域和垃圾回收的的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

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

jvm
AI