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