小編給大家分享一下JVM內(nèi)存區(qū)域和垃圾回收的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了吳興免費(fèi)建站歡迎大家使用!
一、JVM簡(jiǎn)介
JVM,全稱Java Virtual Machine,即Java虛擬機(jī)。以Java作為編程語言所編寫的應(yīng)用程序都是運(yùn)行在JVM上的。JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。Java有個(gè)非常重要的特點(diǎn)就是與平臺(tái)的無關(guān)性,而JVM正是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。
JVM對(duì)程序的執(zhí)行主要分為兩個(gè)步驟,第一步是編譯,即將.java的源文件編譯成為.class的字節(jié)碼文件,第二步是解釋,JVM對(duì)字節(jié)碼文件進(jìn)行解釋執(zhí)行。兩個(gè)步驟流程圖分別如下兩圖所示:
二、JVM內(nèi)存區(qū)域
JVM整個(gè)大系統(tǒng)又分為兩個(gè)子系統(tǒng)。第一個(gè)是ClassLoader,即類加載器,功能是將編寫的類加載到JVM中。第二個(gè)是Execution Engine,即執(zhí)行引擎,負(fù)責(zé)對(duì)編譯后的字節(jié)碼文件進(jìn)行解釋執(zhí)行。上述中Execution Engine又分為兩部分,第一部分是Runtime data area,即運(yùn)行時(shí)數(shù)據(jù)區(qū)域,即相當(dāng)于JVM中的內(nèi)存,第二部分是Native interface,即本地化接口,主要用于執(zhí)行其他非Java編程語言編寫的程序。
重點(diǎn)就是前者Runtime data area,它分為五個(gè)部分,分別是Method area(方法區(qū)),Heap(堆),VM stack(虛擬機(jī)棧),Program counter register(程序計(jì)數(shù)器),Native method stack(本地方法棧)。前兩者線程共享,后三者線程隔離。如下圖所示:
概括地說,JVM初始運(yùn)行的時(shí)候都會(huì)分配好Method area(方法區(qū))和Heap(堆),而JVM 每遇到一個(gè)線程,就為其分配Program counter register(程序計(jì)數(shù)器)、VM stack(虛擬機(jī)棧)、Native method stack(本地方法棧), 當(dāng)線程終止時(shí),三者(虛擬機(jī)棧,本地方法棧和程序計(jì)數(shù)器)所占用的內(nèi)存空間也會(huì)被釋放掉。這也是為什么把數(shù)據(jù)區(qū)域分為線程共享和線程隔離的原因,線程隔離的那三個(gè)區(qū)域的生命周期與所屬線程相同,而線程共享的區(qū)域與Java程序運(yùn)行的生命周期相同,所以這也是系統(tǒng)垃圾回收?qǐng)鏊话l(fā)生在線程共享的區(qū)域(實(shí)際上對(duì)大部分虛擬機(jī)來說是發(fā)生在Heap上)的原因。關(guān)于內(nèi)存溢出異常如下圖所示:
1、Method area(方法區(qū))
方法區(qū)包括常量池與靜態(tài)域。存放了所加載類的信息(名稱、修飾符等)、類的靜態(tài)變量、類的常量、類的Field信息、類的方法信息。當(dāng)開發(fā)人員在程序中通過Class對(duì)象中的getName、isInterface等方法來獲取信息時(shí),這些數(shù)據(jù)都來源于方法區(qū)。
2、Heap(堆)
堆是JVM所管理的內(nèi)存中最大的一塊,幾乎所有的對(duì)象實(shí)例和數(shù)組都在此區(qū)域,可以認(rèn)為Java中所有通過new創(chuàng)建的對(duì)象的內(nèi)存都在此分配,堆中的對(duì)象的內(nèi)存需要等待GC進(jìn)行回收。
3、Program counter register(程序計(jì)數(shù)器)
程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,它是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,字節(jié)碼解釋器工作時(shí)通過改變?cè)撚?jì)數(shù)器的值來選擇下一條需要執(zhí)行的字節(jié)碼指令,分支、跳轉(zhuǎn)、循環(huán)等基礎(chǔ)功能都要依賴它來實(shí)現(xiàn)。
4、VM stack(虛擬機(jī)棧)
虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型,每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame),棧幀用于存儲(chǔ)局部變量表(基本數(shù)據(jù)類型、對(duì)象的引用等)、操作數(shù)棧、動(dòng)態(tài)鏈接、方法返回地址和一些額外的附加信息。
5、Native method stack(本地方法棧)
該區(qū)域與虛擬機(jī)棧所發(fā)揮的作用非常相似,只是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法服務(wù),而本地方法棧則為使用到的本地操作系統(tǒng)(Native)方法服務(wù)。
三、JVM垃圾回收
JVM的GenerationalCollecting(垃圾回收)原理是把對(duì)象分為年青代(Young)、年老代(Tenured)、持久代(Perm),對(duì)不同生命周期的對(duì)象使用不同的算法。
通常JVM內(nèi)存回收總是指Heap(堆)內(nèi)存回收,確實(shí)只有Heap(堆)中的內(nèi)容是動(dòng)態(tài)申請(qǐng)分配的,所以以上對(duì)象的年輕代和年老代都是指的JVM的Heap(堆)空間,而持久代則是之前提到的Method area(方法區(qū)),不屬于Heap(堆)。
1. 年輕代
Java應(yīng)用在分配Java對(duì)象時(shí),這些對(duì)象會(huì)被分配到年輕代堆空間中去
這個(gè)空間大多是小對(duì)象并且會(huì)被頻繁回收
由于年輕代堆空間的垃圾回收會(huì)很頻繁,因此其垃圾回收算法會(huì)更加重視回收效率
2. 年老代
年輕代堆空間的長(zhǎng)期存活對(duì)象會(huì)轉(zhuǎn)移到(也許是永久性轉(zhuǎn)移)年老代堆空間
這個(gè)堆空間通常比年輕代的堆空間大,并且其空間增長(zhǎng)速度較緩
由于大部分JVM堆空間都分配給了年老代,因此其垃圾回收算法需要更節(jié)省空間,此算法需要能夠處理低垃圾密度的堆空間
3. 持久代
存放VM和Java類的元數(shù)據(jù)(metadata),以及interned字符串和類的靜態(tài)變量
當(dāng)這三個(gè)分代的堆空間比較緊張或者沒有足夠的空間來為新到的請(qǐng)求分配的時(shí)候,垃圾回收機(jī)制就會(huì)起作用。有兩種類型的垃圾回收方式:次收集(Minor GC)和全收集(Full GC)。當(dāng)年輕代堆空間滿了的時(shí)候,會(huì)觸發(fā)次收集將還存活的對(duì)象移到年老代堆空間。當(dāng)年老代堆空間滿了的時(shí)候,會(huì)觸發(fā)一個(gè)覆蓋全范圍的對(duì)象堆的全收集。
以上是JVM內(nèi)存區(qū)域和垃圾回收的的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文名稱:JVM內(nèi)存區(qū)域和垃圾回收的
分享地址:http://jinyejixie.com/article0/ijcooo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、企業(yè)網(wǎng)站制作、定制網(wǎng)站、外貿(mào)建站、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)