欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
淺談JVM specification的實(shí)現及其原理

JVM主要包括兩個(gè)子系統和兩個(gè)組件。兩個(gè)子系統分別是Class loader子系統和Execution engine(執行引擎)子系統;兩個(gè)組件分別是Runtime data area (運行時(shí)數據區域)組件和Native interface(本地接口)組件。

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

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

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

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

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

2、Method Area(方法區域):被裝載的class的信息存儲在Method area的內存中。當虛擬機裝載某個(gè)類(lèi)型時(shí),它使用類(lèi)裝載器定位相應的class文件,然后讀入這個(gè)class文件內容并把它傳輸到虛擬機中。

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

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

5、Native method stack(本地方法棧):保存native方法進(jìn)入區域的地址

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

了解JVM的系統結構,再來(lái)看看JVM內存回收問(wèn)題了——

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

Java堆中的各代分布。

1. Young(年輕代)

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

2. Tenured(年老代)

年老代存放從年輕代存活的對象。一般來(lái)說(shuō)年老代存放的都是生命期較長(cháng)的對象。

3. Perm(持久代)

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

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

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

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

1、手動(dòng)將生成的無(wú)用對象,中間對象置為null,加快內存回收。

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

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

推薦的兩款內存檢測工具

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

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

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

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

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久