這篇文章主要介紹“JVM是什么”,在日常操作中,相信很多人在JVM是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JVM是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
奈曼ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
JVM(Java Virtual Machine):Java虛擬機(jī),所有的Java程序都在Java虛擬機(jī)中運行。
元數(shù)據(jù):在本文中指用于描述類和接口定義的數(shù)據(jù)。
在我做J2EE系統(tǒng)開發(fā)的工作生涯中,經(jīng)常遇到技術(shù)人員或客戶發(fā)出諸如此類的感慨:我的J2EE應(yīng)用系統(tǒng)處理的數(shù)據(jù)量不大,系統(tǒng)體積也不大,技術(shù)架構(gòu)也沒有問題,我的應(yīng)用服務(wù)器的內(nèi)存有4G或8G;系統(tǒng)運行起來很慢,還經(jīng)常出現(xiàn)內(nèi)存溢出錯誤。真是無奈!每次遇到這樣的情況,我心中都會忍不住竊笑之。
其實他們所遇到這種情況,不是技術(shù)架構(gòu)上的問題,不是系統(tǒng)本身的問題,也不是應(yīng)用服務(wù)器的問題,也可能不是服務(wù)器的內(nèi)存資源真的不足的問題。他們花了很多時間在J2EE應(yīng)用系統(tǒng)本身上找問題(當(dāng)然一般情況下,這種做法是對的;當(dāng)出現(xiàn)問題時,在自身上多找找有什么不足),結(jié)果還是解決不了問題。他們卻忽略了很重要的一點:J2EE應(yīng)用系統(tǒng)是運行在J2EE應(yīng)用服務(wù)器上的,而J2EE應(yīng)用服務(wù)器又是運行在JVM(Java Virtual Machine)上的。
其實在生產(chǎn)環(huán)境中JVM參數(shù)的優(yōu)化和設(shè)置對J2EE應(yīng)用系統(tǒng)性能有著決定性的作用。本篇我們就來分析JAVA的創(chuàng)建者SUN 公司的JVM的內(nèi)存管理機(jī)制(在現(xiàn)實中絕大多數(shù)的應(yīng)用服務(wù)器是運行在SUN公司的JVM上的,當(dāng)然除了SUN公司的JVM,還有IBM的JVM,Bea的JVM等);下篇咱們具體講解怎樣優(yōu)化JVM的參數(shù)以達(dá)到優(yōu)化J2EE應(yīng)用的目的。
咱們先來看JVM的內(nèi)存管理制吧,JVM的早期版本并沒有進(jìn)行分區(qū)管理;這樣的后果是JVM進(jìn)行垃圾回收時,不得不掃描JVM所管理的整片內(nèi)存,所以搜集垃圾是很耗費資源的事情,也是早期JAVA程序的性能低下的主要原因。隨著JVM的發(fā)展,JVM引進(jìn)了分區(qū)管理的機(jī)制。
采用分區(qū)管理機(jī)制的JVM將JVM所管理的所有內(nèi)存資源分為2個大的部分。***存儲區(qū)(Permanent Space)和堆空間(The Heap Space)。其中堆空間又分為新生區(qū)(Young (New) generation space)和養(yǎng)老區(qū)(Tenure (Old) generation space),新生區(qū)又分為伊甸園(Eden space),幸存者0區(qū)(Survivor 0 space)和幸存者1區(qū)(Survivor 1 space)。具體分區(qū)如下圖:
那JVM他的這些分區(qū)各有什么用途,請看下面的解說。
***存儲區(qū)(Permanent Space):***存儲區(qū)是JVM的駐留內(nèi)存,用于存放JDK自身所攜帶的Class,Interface的元數(shù)據(jù),應(yīng)用服務(wù)器允許必須的Class,Interface的元數(shù)據(jù)和Java程序運行時需要的Class和Interface的元數(shù)據(jù)。被裝載進(jìn)此區(qū)域的數(shù)據(jù)是不會被垃圾回收器回收掉的,關(guān)閉JVM時,釋放此區(qū)域所控制的內(nèi)存。
堆空間(The Heap Space):是JAVA對象生死存亡的地區(qū),JAVA對象的出生,成長,死亡都在這個區(qū)域完成。堆空間又分別按JAVA對象的創(chuàng)建和年齡特征分為養(yǎng)老區(qū)和新生區(qū)。
新生區(qū)(Young (New) generation space):新生區(qū)的作用包括JAVA對象的創(chuàng)建和從JAVA對象中篩選出能進(jìn)入養(yǎng)老區(qū)的JAVA對象。
伊甸園(Eden space):JAVA對空間中的所有對象在此出生,該區(qū)的名字因此而得名。也即是說當(dāng)你的JAVA程序運行時,需要創(chuàng)建新的對象,JVM將在該區(qū)為你創(chuàng)建一個指定的對象供程序使用。創(chuàng)建對象的依據(jù)即是***存儲區(qū)中的元數(shù)據(jù)。
幸存者0區(qū)(Survivor 0 space)和幸存者1區(qū)(Survivor1 space):當(dāng)伊甸園的控件用完時,程序又需要創(chuàng)建對象;此時JVM的垃圾回收器將對伊甸園區(qū)進(jìn)行垃圾回收,將伊甸園區(qū)中的不再被其他對象所引用的對象進(jìn)行銷毀工作。同時將伊甸園中的還有其他對象引用的對象移動到幸存者0區(qū)。幸存者0區(qū)就是用于存放伊甸園垃圾回收時所幸存下來的JAVA對象。
當(dāng)將伊甸園中的還有其他對象引用的對象移動到幸存者0區(qū)時,如果幸存者0區(qū)也沒有空間來存放這些對象時,JVM的垃圾回收器將對幸存者0區(qū)進(jìn)行垃圾回收處理,將幸存者0區(qū)中不在有其他對象引用的JAVA對象進(jìn)行銷毀,將幸存者0區(qū)中還有其他對象引用的對象移動到幸存者1區(qū)。幸存者1區(qū)的作用就是用于存放幸存者0區(qū)垃圾回收處理所幸存下來的JAVA對象。
養(yǎng)老區(qū)(Tenure (Old) generation space):用于保存從新生區(qū)篩選出來的JAVA對象。
上面我們看了JVM的內(nèi)存分區(qū)管理,現(xiàn)在我們來看JVM的垃圾回收工作是怎樣運作的。首先當(dāng)啟動J2EE應(yīng)用服務(wù)器時,JVM隨之啟動,并將JDK的類和接口,應(yīng)用服務(wù)器運行時需要的類和接口以及J2EE應(yīng)用的類和接口定義文件也及編譯后的Class文件或JAR包中的Class文件裝載到JVM的***存儲區(qū)。在伊甸園中創(chuàng)建JVM,應(yīng)用服務(wù)器運行時必須的JAVA對象,創(chuàng)建J2EE應(yīng)用啟動時必須創(chuàng)建的JAVA對象;J2EE應(yīng)用啟動完畢,可對外提供服務(wù)。
JVM在伊甸園區(qū)根據(jù)用戶的每次請求創(chuàng)建相應(yīng)的JAVA對象,當(dāng)伊甸園的空間不足以用來創(chuàng)建新JAVA對象的時候,JVM的垃圾回收器執(zhí)行對伊甸園區(qū)的垃圾回收工作,銷毀那些不再被其他對象引用的JAVA對象(如果該對象僅僅被一個沒有其他對象引用的對象引用的話,此對象也被歸為沒有存在的必要,依此類推),并將那些被其他對象所引用的JAVA對象移動到幸存者0區(qū)。
如果幸存者0區(qū)有足夠控件存放則直接放到幸存者0區(qū);如果幸存者0區(qū)沒有足夠空間存放,則JVM的垃圾回收器執(zhí)行對幸存者0區(qū)的垃圾回收工作,銷毀那些不再被其他對象引用的JAVA對象(如果該對象僅僅被一個沒有其他對象引用的對象引用的話,此對象也被歸為沒有存在的必要,依此類推),并將那些被其他對象所引用的JAVA對象移動到幸存者1區(qū)。
如果幸存者1區(qū)有足夠控件存放則直接放到幸存者1區(qū);如果幸存者0區(qū)沒有足夠空間存放,則JVM的垃圾回收器執(zhí)行對幸存者0區(qū)的垃圾回收工作,銷毀那些不再被其他對象引用的JAVA對象(如果該對象僅僅被一個沒有其他對象引用的對象引用的話,此對象也被歸為沒有存在的必要,依此類推),并將那些被其他對象所引用的JAVA對象移動到養(yǎng)老區(qū)。
如果養(yǎng)老區(qū)有足夠控件存放則直接放到養(yǎng)老區(qū);如果養(yǎng)老區(qū)沒有足夠空間存放,則JVM的垃圾回收器執(zhí)行對養(yǎng)老區(qū)區(qū)的垃圾回收工作,銷毀那些不再被其他對象引用的JAVA對象(如果該對象僅僅被一個沒有其他對象引用的對象引用的話,此對象也被歸為沒有存在的必要,依此類推),并保留那些被其他對象所引用的JAVA對象。
如果到***養(yǎng)老區(qū),幸存者1區(qū),幸存者0區(qū)和伊甸園區(qū)都沒有空間的話,則JVM會報告“JVM堆空間溢出(java.lang.OutOfMemoryError: Java heap space)”,也即是在堆空間沒有空間來創(chuàng)建對象。
這就是JVM的內(nèi)存分區(qū)管理,相比不分區(qū)來說;一般情況下,垃圾回收的速度要快很多;因為在沒有必要的時候不用掃描整片內(nèi)存而節(jié)省了大量時間。
到此,關(guān)于“JVM是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
文章標(biāo)題:JVM是什么
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/ihdiio.html