這篇文章為大家分享JVM的介紹和性能優(yōu)化。文章涵蓋JVM內(nèi)存區(qū)域劃分的介紹和JVM執(zhí)行子系統(tǒng)的介紹以及JVM的性能優(yōu)化,希望大家通過這篇文章能有所收獲。
目前成都創(chuàng)新互聯(lián)公司已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、鄱陽(yáng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。一、JVM 內(nèi)存區(qū)域劃分
程序計(jì)數(shù)器(Program Counter Register),也有稱作為 PC 寄存器。保存的是程序當(dāng)前執(zhí)行的指令的地址(也可以說保存下一條指令的所在存儲(chǔ)單元的地址),當(dāng) CPU 需要執(zhí)行指令時(shí),需要從程序計(jì)數(shù)器中得到當(dāng)前需要執(zhí)行的指令所在存儲(chǔ)單元的地址,然后根據(jù)得到的地址獲取到指令,在得到指令之后,程序計(jì)數(shù)器便自動(dòng)加 1 或者根據(jù)轉(zhuǎn)移指針得到下一條指令的地址,如此循環(huán),直至執(zhí)行完所有的指令。也就是說是用來指示執(zhí)行哪條指令的。
由于在 JVM 中,多線程是通過線程輪流切換來獲得 CPU 執(zhí)行時(shí)間的,因此,在任一具體時(shí)刻,一個(gè) CPU 的內(nèi)核只會(huì)執(zhí)行一條線程中的指令,因此,為了能夠使得每個(gè)線程都在線程切換后能夠恢復(fù)在切換之前的程序執(zhí)行位置,每個(gè)線程都需要有自己獨(dú)立的程序計(jì)數(shù)器,并且不能互相被干擾,否則就會(huì)影響到程序的正常執(zhí)行次序。因此,可以這么說,程序計(jì)數(shù)器是每個(gè)線程所私有的。
在 JVM 規(guī)范中規(guī)定,如果線程執(zhí)行的是非 native 方法,則程序計(jì)數(shù)器中保存的是當(dāng)前需要執(zhí)行的指令的地址;如果線程執(zhí)行的是 native 方法,則程序計(jì)數(shù)器中的值是 undefined。
由于程序計(jì)數(shù)器中存儲(chǔ)的數(shù)據(jù)所占空間的大小不會(huì)隨程序的執(zhí)行而發(fā)生改變,因此,對(duì)于程序計(jì)數(shù)器是不會(huì)發(fā)生內(nèi)存溢出現(xiàn)象(OutOfMemory)的。
二、JVM 執(zhí)行子系統(tǒng)
1.1 Java 跨平臺(tái)的基礎(chǔ)
各種不同平臺(tái)的虛擬機(jī)與所有平臺(tái)都統(tǒng)一使用的程序存儲(chǔ)格式——字節(jié)碼(ByteCode)是構(gòu)成平臺(tái)無關(guān)性的基石,也是語(yǔ)言無關(guān)性的基礎(chǔ)。Java 虛擬機(jī)不和包括 Java 在內(nèi)的任何語(yǔ)言綁定,它只與“Class 文件”這種特定的二進(jìn)制文件格式所關(guān)聯(lián),Class 文件中包含了 Java虛擬機(jī)指令集和符號(hào)表以及若干其他輔助信息。
類的本質(zhì)
任何一個(gè) Class 文件都對(duì)應(yīng)著唯一一個(gè)類或接口的定義信息,但反過來說,Class 文件實(shí)際上它并不一定以磁盤文件的形式存在。Class 文件是一組以 8 位字節(jié)為基礎(chǔ)單位的二進(jìn)制流。
各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格按照順序緊湊地排列在 Class 文件之中,中間沒有添加任何分隔符,這使得整個(gè) Class 文件中存儲(chǔ)的內(nèi)容幾乎全部是程序運(yùn)行的必要數(shù)據(jù),沒有空隙存在。Class 文件格式采用一種類似于 C 語(yǔ)言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),這種偽結(jié)構(gòu)中只有兩種數(shù)據(jù)類型:無符號(hào)數(shù)和表。
無符號(hào)數(shù)屬于基本的數(shù)據(jù)類型,以 u1、u2、u4、u8 來分別代表 1 個(gè)字節(jié)、2 個(gè)字節(jié)、4 個(gè)字節(jié)和 8 個(gè)字節(jié)的無符號(hào)數(shù),無符號(hào)數(shù)可以用來描述數(shù)字、索引引用、數(shù)量值或者按照 UTF-8編碼構(gòu)成字符串值。
表是由多個(gè)無符號(hào)數(shù)或者其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的復(fù)合數(shù)據(jù)類型,所有表都習(xí)慣性地以“_info”結(jié)尾。表用于描述有層次關(guān)系的復(fù)合結(jié)構(gòu)的數(shù)據(jù),整個(gè) Class 文件本質(zhì)上就是一張表。
2.引用計(jì)數(shù)(Reference Counting):
比較古老的回收算法。原理是此對(duì)象有一個(gè)引用,即增加一個(gè)計(jì)數(shù),刪除一個(gè)引用則減少一個(gè)計(jì)數(shù)。垃圾回收時(shí),只用收集計(jì)數(shù)為 0 的對(duì)象。此算法最致命的是無法處理循環(huán)引用的問題。
3. 可達(dá)性分析清理
標(biāo)記-清除(Mark-Sweep):此算法執(zhí)行分兩階段。第一階段從引用根節(jié)點(diǎn)開始標(biāo)記所有被引用的對(duì)象,第二階段遍歷整個(gè)堆,把未標(biāo)記的對(duì)象清除。此算法需要暫停整個(gè)應(yīng)用,同時(shí),會(huì)產(chǎn)生內(nèi)存碎片。
復(fù)制(Copying): 此算法把內(nèi)存空間劃為兩個(gè)相等的區(qū)域,每次只使用其中一個(gè)區(qū)域。垃圾回收時(shí),遍歷當(dāng)前使用區(qū)域,把正在使用中的對(duì)象復(fù)制到另外一個(gè)區(qū)域中。次算法每次只處理正在使用中的對(duì)象,因此復(fù)制成本比較小,同時(shí)復(fù)制過去以后還能進(jìn)行相應(yīng)的內(nèi)存整理,不會(huì)出現(xiàn)“碎片”問題。當(dāng)然,此算法的缺點(diǎn)也是很明顯的,就是需要兩倍內(nèi)存空間。
標(biāo)記-整理(Mark-Compact):此算法結(jié)合了“標(biāo)記-清除”和“復(fù)制”兩個(gè)算法的優(yōu)點(diǎn)。也是分兩階段,第一階段從根節(jié)點(diǎn)開始標(biāo)記所有被引用對(duì)象,第二階段遍歷整個(gè)堆,清除標(biāo)記對(duì)象,并未標(biāo)記對(duì)象并且把存活對(duì)象“壓縮”到堆的其中一塊,按順序排放。此算法避免了“標(biāo)記-清除”的碎片問題,同時(shí)也避免了“復(fù)制”算法的空間問題。
三、性能優(yōu)化
一個(gè) web 應(yīng)用不是一個(gè)孤立的個(gè)體,它是一個(gè)系統(tǒng)的部分,系統(tǒng)中的每一部分都會(huì)影響整
個(gè)系統(tǒng)的性能
響應(yīng)時(shí)間
提交請(qǐng)求和返回該請(qǐng)求的響應(yīng)之間使用的時(shí)間,一般比較關(guān)注平均響應(yīng)時(shí)間。
常用操作的響應(yīng)時(shí)間列表:
并發(fā)數(shù)
同一時(shí)刻,對(duì)服務(wù)器有實(shí)際交互的請(qǐng)求數(shù)。
和網(wǎng)站在線用戶數(shù)的關(guān)聯(lián):1000 個(gè)同時(shí)在線用戶數(shù),可以估計(jì)并發(fā)數(shù)在 5%到 15%之間,也就是同時(shí)并發(fā)數(shù)在 50~150 之間。
吞吐量
對(duì)單位時(shí)間內(nèi)完成的工作量(請(qǐng)求)的量度
關(guān)系
系統(tǒng)吞吐量和系統(tǒng)并發(fā)數(shù)以及響應(yīng)時(shí)間的關(guān)系:
理解為高速公路的通行狀況:
吞吐量是每天通過收費(fèi)站的車輛數(shù)目(可以換算成收費(fèi)站收取的高速費(fèi)),并發(fā)數(shù)是高速公路上的正在行駛的車輛數(shù)目,響應(yīng)時(shí)間是車速。車輛很少時(shí),車速很快。但是收到的高速費(fèi)也相應(yīng)較少;
隨著高速公路上車輛數(shù)目的增多,車速略受影響,但是收到的高速費(fèi)增加很快;
隨著車輛的繼續(xù)增加,車速變得越來越慢,高速公路越來越堵,收費(fèi)不增反降;
如果車流量繼續(xù)增加,超過某個(gè)極限后,任務(wù)偶然因素都會(huì)導(dǎo)致高速全部癱瘓,車走不動(dòng),當(dāng)然后也收不著,而高速公路成了停車場(chǎng)(資源耗盡)。
看完上述內(nèi)容,你們對(duì)JVM有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。