国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
淺談JVM specification的實(shí)現(xiàn)及其原理

JVM主要包括兩個子系統(tǒng)和兩個組件。兩個子系統(tǒng)分別是Class loader子系統(tǒng)和Execution engine(執(zhí)行引擎)子系統(tǒng);兩個組件分別是Runtime data area (運(yùn)行時(shí)數(shù)據(jù)區(qū)域)組件和Native interface(本地接口)組件。

Class loader子系統(tǒng)的作用:根據(jù)給定的全限定名類名(如 java.lang.Object)來裝載class文件的內(nèi)容到Runtime data area中的method area(方法區(qū)域)。Java程序員可以extendsjava.lang.ClassLoader類來寫自己的Class loader。

Execution engine子系統(tǒng)的作用:執(zhí)行classes中的指令。任何JVMspecification實(shí)現(xiàn)(JDK)的核心都是Execution engine,不同的JDK(JVM specification)例如Sun的JDK 和IBM的JDK好壞主要就取決于他們各自實(shí)現(xiàn)的Execution  engine的好壞。

Native interface組件:與nativelibraries交互,是其它編程語言交互的接口。當(dāng)調(diào)用native方法的時(shí)候,就進(jìn)入了一個全新的并且不再受虛擬機(jī)限制的世界,所以也很容易出現(xiàn)JVM無法控制的native heap OutOfMemory。

Runtime Data Area組件:這就是我們常說的JVM的內(nèi)存了。它主要分為五個部分——

1、Heap (堆):一個Java虛擬實(shí)例中只存在一個堆空間

2、Method Area(方法區(qū)域):被裝載的class的信息存儲在Method area的內(nèi)存中。當(dāng)虛擬機(jī)裝載某個類型時(shí),它使用類裝載器定位相應(yīng)的class文件,然后讀入這個class文件內(nèi)容并把它傳輸?shù)教摂M機(jī)中。

3、Java Stack(java的棧):虛擬機(jī)只會直接對Java stack執(zhí)行兩種操作:以幀為單位的壓?;虺鰲?/p>

4、Program Counter(程序計(jì)數(shù)器):每一個線程都有它自己的PC寄存器,也是該線程啟動時(shí)創(chuàng)建的。PC寄存器的內(nèi)容總是指向下一條將被執(zhí)行指令的餓地址,這里的地址可以是一個本地指針,也可以是在方法區(qū)中相對應(yīng)于該方法起始指令的偏移量。

5、Native method stack(本地方法棧):保存native方法進(jìn)入?yún)^(qū)域的地址

以上五部分只有Heap 和Method Area是被所有線程的共享使用的;而Java stack, Program counter 和Native method stack是以線程為粒度的,每個線程獨(dú)自擁有自己的部分。

了解JVM的系統(tǒng)結(jié)構(gòu),再來看看JVM內(nèi)存回收問題了——

Sun的JVM Generational Collecting(垃圾回收)原理是這樣的:把對象分為年青代(Young)、年老代(Tenured)、持久代(Perm),對不同生命周期的對象使用不同的算法。(基于對對象生命周期分析)

Java堆中的各代分布。

1. Young(年輕代)

年輕代分三個區(qū)。一個Eden區(qū),兩個Survivor區(qū)。大部分對象在Eden區(qū)中生成。當(dāng)Eden區(qū)滿時(shí),還存活的對象將被復(fù)制到Survivor區(qū)(兩個中的一個),當(dāng)這個Survivor區(qū)滿時(shí),此區(qū)的存活對象將被復(fù)制到另外一個Survivor區(qū),當(dāng)這個Survivor去也滿了的時(shí)候,從第一個Survivor區(qū)復(fù)制過來的并且此時(shí)還存活的對象,將被復(fù)制年老區(qū)(Tenured。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關(guān)系,所以同一個區(qū)中可能同時(shí)存在從Eden復(fù)制過來對象,和從前一個Survivor復(fù)制過來的對象,而復(fù)制到年老區(qū)的只有從第一個Survivor去過來的對象。而且,Survivor區(qū)總有一個是空的。

2. Tenured(年老代)

年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。

3. Perm(持久代)

用于存放靜態(tài)文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應(yīng)用可能動態(tài)生成或者調(diào)用一些class,例如Hibernate等,在這種時(shí)候需要設(shè)置一個比較大的持久代空間來存放這些運(yùn)行過程中新增的類。持久代大小通過-XX:MaxPermSize=進(jìn)行設(shè)置。

舉個例子:當(dāng)在程序中生成對象時(shí),正常對象會在年輕代中分配空間,如果是過大的對象也可能會直接在年老代生成(據(jù)觀測在運(yùn)行某程序時(shí)候每次會生成一個十兆的空間用收發(fā)消息,這部分內(nèi)存就會直接在年老代分配)。年輕代在空間被分配完的時(shí)候就會發(fā)起內(nèi)存回收,大部分內(nèi)存會被回收,一部分幸存的內(nèi)存會被拷貝至Survivor的from區(qū),經(jīng)過多次回收以后如果from區(qū)內(nèi)存也分配完畢,就會也發(fā)生內(nèi)存回收然后將剩余的對象拷貝至to區(qū)。等到to區(qū)也滿的時(shí)候,就會再次發(fā)生內(nèi)存回收然后把幸存的對象拷貝至年老區(qū)。

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

了解完這些之后,以下的轉(zhuǎn)載一熱衷于鉆研技術(shù)的哥們Richen Wang關(guān)于內(nèi)存管理的一些建議——

1、手動將生成的無用對象,中間對象置為null,加快內(nèi)存回收。

2、對象池技術(shù) 如果生成的對象是可重用的對象,只是其中的屬性不同時(shí),可以考慮采用對象池來較少對象的生成。如果有空閑的對象就從對象池中取出使用,沒有再生成新的對象,大大提高了對象的復(fù)用率。

3、JVM調(diào)優(yōu) 通過配置JVM的參數(shù)來提高垃圾回收的速度,如果在沒有出現(xiàn)內(nèi)存泄露且上面兩種辦法都不能保證內(nèi)存的回收時(shí),可以考慮采用JVM調(diào)優(yōu)的方式來解決,不過一定要經(jīng)過實(shí)體機(jī)的長期測試,因?yàn)椴煌膮?shù)可能引起不同的效果。如-Xnoclassgc參數(shù)等。

推薦的兩款內(nèi)存檢測工具

1、jconsole  JDK自帶的內(nèi)存監(jiān)測工具,路徑j(luò)dkbin目錄下jconsole.exe,雙擊可運(yùn)行。連接方式有兩種,第一種是本地方式如調(diào)試時(shí)運(yùn)行的進(jìn)程可以直接連,第二種是遠(yuǎn)程方式,可以連接以服務(wù)形式啟動的進(jìn)程。遠(yuǎn)程連接方式是:在目標(biāo)進(jìn)程的jvm啟動參數(shù)中添加-Dcom.sun.management.jmxremote.port=1090-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false 1090是監(jiān)聽的端口號具體使用時(shí)要進(jìn)行修改,然后使用IP加端口號連接即可。通過該工具可以監(jiān)測到當(dāng)時(shí)內(nèi)存的大小,CPU的使用量以及類的加載,還提供了手動gc的功能。優(yōu)點(diǎn)是效率高,速度快,在不影響進(jìn)行運(yùn)行的情況下監(jiān)測產(chǎn)品的運(yùn)行。缺點(diǎn)是無法看到類或者對象之類的具體信息。使用方式很簡單點(diǎn)擊幾下就可以知道功能如何了,確實(shí)有不明白之處可以上網(wǎng)查詢文檔。

2、JProfiler收費(fèi)的工具,但是到處都有破解辦法。安裝好以后按照配置調(diào)試的方式配置好一個本地的session即可運(yùn)行??梢员O(jiān)測當(dāng)時(shí)的內(nèi)存、CPU、線程等,能具體的列出內(nèi)存的占用情況,還可以就某個類進(jìn)行分析。優(yōu)點(diǎn)很多,缺點(diǎn)太影響速度,而且有的類可能無法被織入方法,例如我使用jprofiler時(shí)一直沒有備份成功過,總會有一些類的錯誤。

JVM specification的實(shí)現(xiàn)及其原理就介紹到這里。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java核心知識點(diǎn)-JVM結(jié)構(gòu)和工作方式
hotspot JVM內(nèi)存模型與常用調(diào)優(yōu)參數(shù)
5K字帶你徹底了解JVM運(yùn)行時(shí)內(nèi)存
萬字精美圖文,帶你掌握 JVM 內(nèi)存布局及細(xì)節(jié)分析
JVM內(nèi)存模型及內(nèi)存分配過程
Java中的垃圾回收原理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服