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