亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java 虛擬機(jī)總結(jié)給面試的你(下)

amc / 3513人閱讀

摘要:本篇博客主要針對虛擬機(jī)的晚期編譯優(yōu)化,內(nèi)存模型與線程,線程安全與鎖優(yōu)化進(jìn)行總結(jié),其余部分總結(jié)請點(diǎn)擊虛擬總結(jié)上篇,虛擬機(jī)總結(jié)中篇。

本篇博客主要針對Java虛擬機(jī)的晚期編譯優(yōu)化,Java內(nèi)存模型與線程,線程安全與鎖優(yōu)化進(jìn)行總結(jié),其余部分總結(jié)請點(diǎn)擊Java虛擬總結(jié)上篇 ,Java虛擬機(jī)總結(jié)中篇。

一.晚期運(yùn)行期優(yōu)化 即時編譯器JIT

即時編譯器JIT的作用就是熱點(diǎn)代碼轉(zhuǎn)換為平臺相關(guān)的機(jī)器碼,并進(jìn)行優(yōu)化,它并不是一個虛擬機(jī)所必須的部分,只能說有它是錦上添花。

熱點(diǎn)代碼 熱點(diǎn)代碼分類

被多次調(diào)用的方法

被多次調(diào)用的循環(huán)體

熱點(diǎn)探測判定方法

基于采樣的熱點(diǎn)探測,虛擬機(jī)周期性地檢查棧頂,發(fā)現(xiàn)某個方法經(jīng)常出現(xiàn)在棧頂,那么這個方法就是熱點(diǎn)方法,簡單高效但不精確

基于計數(shù)器熱點(diǎn)探測,為每個方法建立計數(shù)器來統(tǒng)計執(zhí)行次數(shù),超過閾值就是熱點(diǎn)方法,Hotpot就是采用這種方法。分為方法計數(shù)器(統(tǒng)計方法),回邊計數(shù)器(統(tǒng)計循環(huán))

編譯過程(Client Complier)

第一階段

將字節(jié)碼構(gòu)造成高級中間代碼表示(HIR)

第二階段

將HIR變?yōu)長IR

第三階段

使用線性掃描算法,在LIR上分配寄存器,產(chǎn)生機(jī)器代碼

優(yōu)化方法 公共子表達(dá)式優(yōu)化

當(dāng)一個表達(dá)式A的結(jié)果已經(jīng)計算過了,且A中的所有變量都沒有發(fā)生過變化,那么下一次要用到A時就不用計算了,而是直接取之前A的結(jié)果。

數(shù)組邊界檢查消除 方法內(nèi)聯(lián) 逃逸分析

逃逸的定義:一個在方法里定義的變量,作為參數(shù)傳遞給其他方法(方法逃逸),或者賦值給類變量(線程逃逸)。

優(yōu)化方法:

棧上分配:不會逃逸的對象就不在堆上分配了,就在棧上分配,那么對象所占的空間就可以隨棧幀的出棧而銷毀,減少垃圾收集系統(tǒng)的壓力。

同步消除:如果一個變量肯定不會逃逸出線程,那么關(guān)于這個變量的同步措施就可以去掉。

二.Java內(nèi)存模型與線程 內(nèi)存模型

說了這么多的內(nèi)存模型,到底什么是內(nèi)存模型呢?

特定的操作協(xié)議下,對特定的內(nèi)存或高速緩存進(jìn)行讀寫訪問的過程抽象。

它的作用是定義程序中各個共享的變量的訪問規(guī)則,即如何將變量寫入內(nèi)存和從內(nèi)存中取出變量。Java內(nèi)存模型有主內(nèi)存與工作內(nèi)存之分,所有變量存在主內(nèi)存中,線程則是擁有自己的工作內(nèi)存,它是主內(nèi)存的副本拷貝,線程只能讀寫工作內(nèi)存。

8種原子操作

lock(鎖定):作用于主內(nèi)存的變量,它把一個變量標(biāo)識為一條線程獨(dú)占的狀態(tài)。

unlock(解鎖):作用于主內(nèi)存的變量,它把一個處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定。

read(讀取):作用于主內(nèi)存的變量,它把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的 load 動作使用。

load(載入):作用于工作內(nèi)存的變量,它把 read 操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中。

use(使用):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個變量的值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個需要使用到變量的值的字節(jié)碼指令時將會執(zhí)行這個操作。

assign(賦值):作用于工作內(nèi)存的變量,它把一個從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。

store(存儲):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個變量的值傳送到主內(nèi)存中,以便隨后的 write 操作使用。

write(寫入):作用于主內(nèi)存的變量,它把 store 操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。

volatile變量的特殊規(guī)則

volatile的特性是保證此變量對所有線程的可見性,即當(dāng)變量的值修改后,其他線程可以立即知道發(fā)生的變化。普通變量則是修改完值后,需要寫回主內(nèi)存,然后其他線程再從主內(nèi)存讀取該數(shù)據(jù)。volatile還可以通過內(nèi)存屏障來禁止指令的重排序。綜合來講它的讀操作和普通變量差不多,寫操作慢一點(diǎn)。

long和double變量的特殊規(guī)則

8種操作一般都是原子性的,但是對于64位的數(shù)據(jù),內(nèi)存模型允許將沒有被volatile修飾的64位數(shù)據(jù)的讀寫操作劃分為兩次32位的操作進(jìn)行---->非原子協(xié)定但一般我們不需要將long和double聲明為volatile。

先行發(fā)生原則

程序次序規(guī)則

管程鎖定規(guī)則

volatile變量規(guī)則

線程啟動規(guī)則

線程終止規(guī)則

線程中斷規(guī)則

對象終結(jié)規(guī)則

傳遞性

Java與線程

Java的Thread類大多API都是Native方法,是與平臺相關(guān)的。

實現(xiàn)線程的三種方式

使用內(nèi)核線程實現(xiàn):內(nèi)核線程即直接由操作系統(tǒng)內(nèi)核支持的線程,由內(nèi)核來完成線程切換,程序使用輕量級進(jìn)程接口與內(nèi)核線程一對一的關(guān)系,內(nèi)核線程再經(jīng)由線程調(diào)度器分派給CPU。

使用用戶線程實現(xiàn):用戶線程的建立同步銷毀調(diào)度完全在用戶態(tài)中完成,不需切換到內(nèi)核態(tài),一對多的關(guān)系。

用戶線程+輕量級進(jìn)程:多對多的關(guān)系。

線程的調(diào)度

協(xié)同式調(diào)度

線程的執(zhí)行時間由線程自己控制,執(zhí)行完后再主動通知系統(tǒng)切換線程,可能會導(dǎo)致一個線程長時間地阻塞

搶占式調(diào)度

由系統(tǒng)分配時間,線程可以主動讓出時間但是不能主動獲得時間,通過設(shè)置優(yōu)先級確定順序

線程的狀態(tài)

新建:剛剛創(chuàng)建還未啟動

運(yùn)行:正在執(zhí)行或者等待分配時間

無限等待:不會被CPU分配時間,需要其他線程顯式喚醒

有限等待:在一段時間后由系統(tǒng)自動喚醒

阻塞:等待一個排他鎖

結(jié)束

三.線程安全與鎖優(yōu)化 線程安全的程度,依次減弱

不可變,將對象中帶狀態(tài)的變量都置為final

絕對線程安全,完全符合線程安全定義

相對線程安全,對這個對象的多帶帶的操作是線程安全的,如Vector,HashTable等

線程兼容,對象本身不是線程安全的,但是可以在調(diào)用端正確地使用同步手段才能保證在并發(fā)環(huán)境下正常使用。

線程對立,無論調(diào)用端如何努力,都不可能實現(xiàn)線程安全

線程安全的實現(xiàn)方法

互斥同步

synchronized關(guān)鍵字會在代碼塊的前后分別形成monitorenter和monitorexit指令,這兩個指令需要一個reference對象參數(shù),該鎖有一個計數(shù)器以實現(xiàn)同步,進(jìn)入時將計數(shù)器+1,退出時-1,本線程可重入,其他線程需阻塞等待。synchronized的缺點(diǎn)是由于Java線程是映射到操作系統(tǒng)的,所以喚醒阻塞一個線程都需要系統(tǒng)幫忙,需要從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài),耗費(fèi)很多處理器時間。

ReentrantLock對synchronized的優(yōu)勢:

等待可中斷

公平鎖:必須按照申請鎖的時間順序來一次獲得鎖

鎖綁定多個條件

非阻塞同步

為了解決線程阻塞和喚醒所帶來的性能問題,先對共享數(shù)據(jù)進(jìn)行操作,如果沒有競爭就成功了,否則就補(bǔ)償(不斷重試直到成功)

無同步方案

可重入代碼

線程本地存儲,把共享數(shù)據(jù)的范圍限制到線程內(nèi),ThreadLocalMap以ThreadLocalHashMap為鍵,以本地線程變量為值的K-V對

鎖優(yōu)化

鎖優(yōu)化的方案有以下幾種:

自旋鎖:為了減少線程阻塞與喚醒的消耗,線程在被阻塞時可以執(zhí)行一個忙循環(huán)(自旋)

鎖消除:對不存在共享數(shù)據(jù)競爭的鎖進(jìn)行消除

鎖粗化:在一個代碼塊內(nèi)對一個對象連續(xù)的地加鎖解鎖,就對整個代碼塊一次性加鎖減少性能損耗

輕量級鎖:無競爭地情況下使用CAS操作去消除同步使用地互斥量

偏向鎖:鎖會偏向于第一個獲得它地線程

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/68721.html

相關(guān)文章

  • Java 虛擬機(jī)總結(jié)面試的你(中)

    摘要:驗證過程驗證過程的目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全。二虛擬機(jī)字節(jié)碼執(zhí)行引擎虛擬機(jī)的執(zhí)行引擎自行實現(xiàn),可以自行制定指令集與執(zhí)行引擎的結(jié)構(gòu)體系。 本篇博客主要針對Java虛擬機(jī)的類加載機(jī)制,虛擬機(jī)字節(jié)碼執(zhí)行引擎,早期編譯優(yōu)化進(jìn)行總結(jié),其余部分總結(jié)請點(diǎn)擊Java虛擬總結(jié)上篇 。 一.虛擬機(jī)類加載機(jī)制 概述 虛擬機(jī)把描述類的數(shù)據(jù)從Clas...

    MRZYD 評論0 收藏0
  • Java 虛擬機(jī)總結(jié)面試的你(上)

    摘要:于是這篇博客就針對虛擬機(jī)的各個知識點(diǎn)進(jìn)行歸納。若虛擬機(jī)棧請求擴(kuò)展時無法申請到足夠的內(nèi)存,則拋出異常。類索引用于確定類的全限定名,父類索引用于確定父類的全限定名。字節(jié)碼指令操作碼長度為一個字節(jié),所以總數(shù)最多不超過條。 Java虛擬機(jī)一直是Java的重難點(diǎn),一方面由于系統(tǒng)封裝得太好,你平常寫程序的時候幾乎感覺不到它的存在,另一方面了解必要的Java虛擬機(jī)工作原理才能對真實工作環(huán)境下的bug...

    linkFly 評論0 收藏0
  • Java程序員:不識Jvm真面目,只緣身在增刪查改中

    摘要:編譯器只需面向,生成能理解的代碼或字節(jié)碼文件。源文件經(jīng)編譯器,編譯成字節(jié)碼程序,通過將每一條指令翻譯成不同平臺機(jī)器碼,通過特定平臺運(yùn)行。漲見識,字節(jié)碼執(zhí)行過程分析。解決辦法減少默認(rèn)棧的容量來換取更多的線程支持。 前言 JVM是java的核心和基礎(chǔ),在java編譯器和os平臺之間的虛擬處理器。它是一種基于下層的操作系統(tǒng)和硬件平臺并利用軟件方法來實現(xiàn)的抽象的計算機(jī),可以在上面執(zhí)行java的...

    or0fun 評論0 收藏0
  • Java程序員:不識Jvm真面目,只緣身在增刪查改中

    摘要:編譯器只需面向,生成能理解的代碼或字節(jié)碼文件。源文件經(jīng)編譯器,編譯成字節(jié)碼程序,通過將每一條指令翻譯成不同平臺機(jī)器碼,通過特定平臺運(yùn)行。漲見識,字節(jié)碼執(zhí)行過程分析。解決辦法減少默認(rèn)棧的容量來換取更多的線程支持。 前言 JVM是java的核心和基礎(chǔ),在java編譯器和os平臺之間的虛擬處理器。它是一種基于下層的操作系統(tǒng)和硬件平臺并利用軟件方法來實現(xiàn)的抽象的計算機(jī),可以在上面執(zhí)行java的...

    ivydom 評論0 收藏0
  • 最最最常見的Java面試總結(jié)——第二周

    摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點(diǎn)。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...

    yearsj 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<