摘要:本篇博客主要針對虛擬機的晚期編譯優化,內存模型與線程,線程安全與鎖優化進行總結,其余部分總結請點擊虛擬總結上篇,虛擬機總結中篇。
本篇博客主要針對Java虛擬機的晚期編譯優化,Java內存模型與線程,線程安全與鎖優化進行總結,其余部分總結請點擊Java虛擬總結上篇 ,Java虛擬機總結中篇。
一.晚期運行期優化 即時編譯器JIT即時編譯器JIT的作用就是熱點代碼轉換為平臺相關的機器碼,并進行優化,它并不是一個虛擬機所必須的部分,只能說有它是錦上添花。
熱點代碼 熱點代碼分類被多次調用的方法
被多次調用的循環體
熱點探測判定方法基于采樣的熱點探測,虛擬機周期性地檢查棧頂,發現某個方法經常出現在棧頂,那么這個方法就是熱點方法,簡單高效但不精確
基于計數器熱點探測,為每個方法建立計數器來統計執行次數,超過閾值就是熱點方法,Hotpot就是采用這種方法。分為方法計數器(統計方法),回邊計數器(統計循環)
編譯過程(Client Complier)
第一階段
將字節碼構造成高級中間代碼表示(HIR)
第二階段
將HIR變為LIR
第三階段
使用線性掃描算法,在LIR上分配寄存器,產生機器代碼
優化方法 公共子表達式優化當一個表達式A的結果已經計算過了,且A中的所有變量都沒有發生過變化,那么下一次要用到A時就不用計算了,而是直接取之前A的結果。
數組邊界檢查消除 方法內聯 逃逸分析逃逸的定義:一個在方法里定義的變量,作為參數傳遞給其他方法(方法逃逸),或者賦值給類變量(線程逃逸)。
優化方法:
棧上分配:不會逃逸的對象就不在堆上分配了,就在棧上分配,那么對象所占的空間就可以隨棧幀的出棧而銷毀,減少垃圾收集系統的壓力。
同步消除:如果一個變量肯定不會逃逸出線程,那么關于這個變量的同步措施就可以去掉。
二.Java內存模型與線程 內存模型說了這么多的內存模型,到底什么是內存模型呢?
特定的操作協議下,對特定的內存或高速緩存進行讀寫訪問的過程抽象。
它的作用是定義程序中各個共享的變量的訪問規則,即如何將變量寫入內存和從內存中取出變量。Java內存模型有主內存與工作內存之分,所有變量存在主內存中,線程則是擁有自己的工作內存,它是主內存的副本拷貝,線程只能讀寫工作內存。
8種原子操作lock(鎖定):作用于主內存的變量,它把一個變量標識為一條線程獨占的狀態。
unlock(解鎖):作用于主內存的變量,它把一個處于鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定。
read(讀?。鹤饔糜谥鲀却娴淖兞?,它把一個變量的值從主內存傳輸到線程的工作內存中,以便隨后的 load 動作使用。
load(載入):作用于工作內存的變量,它把 read 操作從主內存中得到的變量值放入工作內存的變量副本中。
use(使用):作用于工作內存的變量,它把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用到變量的值的字節碼指令時將會執行這個操作。
assign(賦值):作用于工作內存的變量,它把一個從執行引擎接收到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。
store(存儲):作用于工作內存的變量,它把工作內存中一個變量的值傳送到主內存中,以便隨后的 write 操作使用。
write(寫入):作用于主內存的變量,它把 store 操作從工作內存中得到的變量的值放入主內存的變量中。
volatile變量的特殊規則volatile的特性是保證此變量對所有線程的可見性,即當變量的值修改后,其他線程可以立即知道發生的變化。普通變量則是修改完值后,需要寫回主內存,然后其他線程再從主內存讀取該數據。volatile還可以通過內存屏障來禁止指令的重排序。綜合來講它的讀操作和普通變量差不多,寫操作慢一點。
long和double變量的特殊規則8種操作一般都是原子性的,但是對于64位的數據,內存模型允許將沒有被volatile修飾的64位數據的讀寫操作劃分為兩次32位的操作進行---->非原子協定但一般我們不需要將long和double聲明為volatile。
先行發生原則程序次序規則
管程鎖定規則
volatile變量規則
線程啟動規則
線程終止規則
線程中斷規則
對象終結規則
傳遞性
Java與線程Java的Thread類大多API都是Native方法,是與平臺相關的。
實現線程的三種方式使用內核線程實現:內核線程即直接由操作系統內核支持的線程,由內核來完成線程切換,程序使用輕量級進程接口與內核線程一對一的關系,內核線程再經由線程調度器分派給CPU。
使用用戶線程實現:用戶線程的建立同步銷毀調度完全在用戶態中完成,不需切換到內核態,一對多的關系。
用戶線程+輕量級進程:多對多的關系。
線程的調度
協同式調度
線程的執行時間由線程自己控制,執行完后再主動通知系統切換線程,可能會導致一個線程長時間地阻塞
搶占式調度
由系統分配時間,線程可以主動讓出時間但是不能主動獲得時間,通過設置優先級確定順序
線程的狀態新建:剛剛創建還未啟動
運行:正在執行或者等待分配時間
無限等待:不會被CPU分配時間,需要其他線程顯式喚醒
有限等待:在一段時間后由系統自動喚醒
阻塞:等待一個排他鎖
結束
三.線程安全與鎖優化 線程安全的程度,依次減弱不可變,將對象中帶狀態的變量都置為final
絕對線程安全,完全符合線程安全定義
相對線程安全,對這個對象的多帶帶的操作是線程安全的,如Vector,HashTable等
線程兼容,對象本身不是線程安全的,但是可以在調用端正確地使用同步手段才能保證在并發環境下正常使用。
線程對立,無論調用端如何努力,都不可能實現線程安全
線程安全的實現方法
互斥同步
synchronized關鍵字會在代碼塊的前后分別形成monitorenter和monitorexit指令,這兩個指令需要一個reference對象參數,該鎖有一個計數器以實現同步,進入時將計數器+1,退出時-1,本線程可重入,其他線程需阻塞等待。synchronized的缺點是由于Java線程是映射到操作系統的,所以喚醒阻塞一個線程都需要系統幫忙,需要從用戶態轉到內核態,耗費很多處理器時間。
ReentrantLock對synchronized的優勢:
等待可中斷
公平鎖:必須按照申請鎖的時間順序來一次獲得鎖
鎖綁定多個條件
非阻塞同步
為了解決線程阻塞和喚醒所帶來的性能問題,先對共享數據進行操作,如果沒有競爭就成功了,否則就補償(不斷重試直到成功)
無同步方案
可重入代碼
線程本地存儲,把共享數據的范圍限制到線程內,ThreadLocalMap以ThreadLocalHashMap為鍵,以本地線程變量為值的K-V對
鎖優化鎖優化的方案有以下幾種:
自旋鎖:為了減少線程阻塞與喚醒的消耗,線程在被阻塞時可以執行一個忙循環(自旋)
鎖消除:對不存在共享數據競爭的鎖進行消除
鎖粗化:在一個代碼塊內對一個對象連續的地加鎖解鎖,就對整個代碼塊一次性加鎖減少性能損耗
輕量級鎖:無競爭地情況下使用CAS操作去消除同步使用地互斥量
偏向鎖:鎖會偏向于第一個獲得它地線程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68721.html
摘要:驗證過程驗證過程的目的是為了確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。二虛擬機字節碼執行引擎虛擬機的執行引擎自行實現,可以自行制定指令集與執行引擎的結構體系。 本篇博客主要針對Java虛擬機的類加載機制,虛擬機字節碼執行引擎,早期編譯優化進行總結,其余部分總結請點擊Java虛擬總結上篇 。 一.虛擬機類加載機制 概述 虛擬機把描述類的數據從Clas...
摘要:于是這篇博客就針對虛擬機的各個知識點進行歸納。若虛擬機棧請求擴展時無法申請到足夠的內存,則拋出異常。類索引用于確定類的全限定名,父類索引用于確定父類的全限定名。字節碼指令操作碼長度為一個字節,所以總數最多不超過條。 Java虛擬機一直是Java的重難點,一方面由于系統封裝得太好,你平常寫程序的時候幾乎感覺不到它的存在,另一方面了解必要的Java虛擬機工作原理才能對真實工作環境下的bug...
摘要:編譯器只需面向,生成能理解的代碼或字節碼文件。源文件經編譯器,編譯成字節碼程序,通過將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。漲見識,字節碼執行過程分析。解決辦法減少默認棧的容量來換取更多的線程支持。 前言 JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基于下層的操作系統和硬件平臺并利用軟件方法來實現的抽象的計算機,可以在上面執行java的...
摘要:編譯器只需面向,生成能理解的代碼或字節碼文件。源文件經編譯器,編譯成字節碼程序,通過將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。漲見識,字節碼執行過程分析。解決辦法減少默認棧的容量來換取更多的線程支持。 前言 JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基于下層的操作系統和硬件平臺并利用軟件方法來實現的抽象的計算機,可以在上面執行java的...
摘要:與都繼承自類,在中也是使用字符數組保存字符串,,這兩種對象都是可變的。采用字節碼的好處語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區別 可變性...
閱讀 2287·2021-11-10 11:35
閱讀 899·2021-09-26 09:55
閱讀 2388·2021-09-22 15:22
閱讀 2318·2021-09-22 15:17
閱讀 3683·2021-09-09 09:33
閱讀 1821·2019-08-30 11:22
閱讀 970·2019-08-30 10:57
閱讀 641·2019-08-29 16:10