• <samp id="mz5ne"><acronym id="mz5ne"></acronym></samp>
      <ol id="mz5ne"></ol>
    1. <samp id="mz5ne"></samp>
      <mark id="mz5ne"></mark>

        <fieldset id="mz5ne"></fieldset>

        免费看又黄又无码的网站_久久久高清国产免费观看_亚洲一区二区三区在线免费观看_免费欧洲美女a视频一级毛片_日本最新免费二区三区

        ×

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

        • 作者:新網(wǎng)
        • 來源:新網(wǎng)
        • 瀏覽:100
        • 2018-04-23 14:12:49

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

           t01026b36625ba8aec4.jpg

        <div>  本篇主要針對(duì)Java虛擬機(jī)的晚期編譯優(yōu)化,Java內(nèi)存模型與線程,線程安全與鎖優(yōu)化進(jìn)行總結(jié),其余部分總結(jié)請(qǐng)點(diǎn)擊Java虛擬總結(jié)上篇 ,Java虛擬機(jī)總結(jié)篇。
          一.晚期運(yùn)行期優(yōu)化
          即時(shí)編譯器JIT
          即時(shí)編譯器JIT的作用就是熱點(diǎn)代碼轉(zhuǎn)換為平臺(tái)相關(guān)的機(jī)器碼,并進(jìn)行優(yōu)化,它并不是一個(gè)虛擬機(jī)所必須的部分,只能說有它是錦上添花。
          熱點(diǎn)代碼
          熱點(diǎn)代碼分類
          · 被多次調(diào)用的方法
          · 被多次調(diào)用的循環(huán)體
          熱點(diǎn)探測(cè)判定方法
          · 基于采樣的熱點(diǎn)探測(cè),虛擬機(jī)周期性地檢查棧頂,發(fā)現(xiàn)某個(gè)方法經(jīng)常出現(xiàn)在棧頂,那么這個(gè)方法就是熱點(diǎn)方法,簡單高效但不精確
          · 基于計(jì)數(shù)器熱點(diǎn)探測(cè),為每個(gè)方法建立計(jì)數(shù)器來統(tǒng)計(jì)執(zhí)行次數(shù),超過閾值就是熱點(diǎn)方法,Hotpot就是采用這種方法。分為方法計(jì)數(shù)器(統(tǒng)計(jì)方法),回邊計(jì)數(shù)器(統(tǒng)計(jì)循環(huán))
          編譯過程(Client Complier)
          第一階段
          · 將字節(jié)碼構(gòu)造成高級(jí)中間代碼表示(HIR)
          第二階段
          · 將HIR變?yōu)長IR
          第三階段
          · 使用線性掃描算法,在LIR上分配寄存器,產(chǎn)生機(jī)器代碼
          優(yōu)化方法
          公共子表達(dá)式優(yōu)化
          當(dāng)一個(gè)表達(dá)式A的結(jié)果已經(jīng)計(jì)算過了,且A中的所有變量都沒有發(fā)生過變化,那么下一次要用到A時(shí)就不用計(jì)算了,而是直接取之前A的結(jié)果。
          數(shù)組邊界檢查消除
          方法內(nèi)聯(lián)
          逃逸分析
          逃逸的定義:一個(gè)在方法里定義的變量,作為參數(shù)傳遞給其他方法(方法逃逸),或者賦值給類變量(線程逃逸)。
          優(yōu)化方法:
          棧上分配:不會(huì)逃逸的對(duì)象就不在堆上分配了,就在棧上分配,那么對(duì)象所占的空間就可以隨棧幀的出棧而銷毀,減少垃圾收集系統(tǒng)的壓力。
          同步消除:如果一個(gè)變量肯定不會(huì)逃逸出線程,那么關(guān)于這個(gè)變量的同步措施就可以去掉。
          二.Java內(nèi)存模型與線程
          內(nèi)存模型
          說了這么多的內(nèi)存模型,到底什么是內(nèi)存模型呢?
          特定的操作協(xié)議下,對(duì)特定的內(nèi)存或高速緩存進(jìn)行讀寫訪問的過程抽象。
          它的作用是定義程序中各個(gè)共享的變量的訪問規(guī)則,即如何將變量寫入內(nèi)存和從內(nèi)存中取出變量。Java內(nèi)存模型有主內(nèi)存與工作內(nèi)存之分,所有變量存在主內(nèi)存中,線程則是擁有自己的工作內(nèi)存,它是主內(nèi)存的副本拷貝,線程只能讀寫工作內(nèi)存。
          8種原子操作
          · lock(鎖定):作用于主內(nèi)存的變量,它把一個(gè)變量標(biāo)識(shí)為一條線程獨(dú)占的狀態(tài)。
          · unlock(解鎖):作用于主內(nèi)存的變量,它把一個(gè)處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定。
          · read(讀取):作用于主內(nèi)存的變量,它把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的 load 動(dòng)作使用。
          · load(載入):作用于工作內(nèi)存的變量,它把 read 操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中。
          · use(使用):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個(gè)需要使用到變量的值的字節(jié)碼指令時(shí)將會(huì)執(zhí)行這個(gè)操作。
          · assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個(gè)給變量賦值的字節(jié)碼指令時(shí)執(zhí)行這個(gè)操作。
          · store(存儲(chǔ)):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的 write 操作使用。
          · write(寫入):作用于主內(nèi)存的變量,它把 store 操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。
          volatile變量的特殊規(guī)則
          volatile的特性是保證此變量對(duì)所有線程的可見性,即當(dāng)變量的值修改后,其他線程可以立即知道發(fā)生的變化。普通變量則是修改完值后,需要寫回主內(nèi)存,然后其他線程再從主內(nèi)存讀取該數(shù)據(jù)。volatile還可以通過內(nèi)存屏障來禁止指令的重排序。綜合來講它的讀操作和普通變量差不多,寫操作慢一點(diǎn)。
          long和double變量的特殊規(guī)則
          8種操作一般都是原子性的,但是對(duì)于64位的數(shù)據(jù),內(nèi)存模型允許將沒有被volatile修飾的64位數(shù)據(jù)的讀寫操作劃分為兩次32位的操作進(jìn)行---->非原子協(xié)定但一般我們不需要將long和double聲明為volatile。
          先行發(fā)生原則
          · 程序次序規(guī)則
          · 管程鎖定規(guī)則
          · volatile變量規(guī)則
          · 線程啟動(dòng)規(guī)則
          · 線程終止規(guī)則
          · 線程中斷規(guī)則
          · 對(duì)象終結(jié)規(guī)則
          · 傳遞性
          Java與線程
          Java的Thread類大多API都是Native方法,是與平臺(tái)相關(guān)的。
          實(shí)現(xiàn)線程的三種方式
          · 使用內(nèi)核線程實(shí)現(xiàn):內(nèi)核線程即直接由操作系統(tǒng)內(nèi)核支持的線程,由內(nèi)核來完成線程切換,程序使用輕量級(jí)進(jìn)程接口與內(nèi)核線程一對(duì)一的關(guān)系,內(nèi)核線程再經(jīng)由線程調(diào)度器分派給CPU。
          · 使用用戶線程實(shí)現(xiàn):用戶線程的建立同步銷毀調(diào)度完全在用戶態(tài)中完成,不需切換到內(nèi)核態(tài),一對(duì)多的關(guān)系。
          · 用戶線程+輕量級(jí)進(jìn)程:多對(duì)多的關(guān)系。
          線程的調(diào)度
          協(xié)同式調(diào)度
          線程的執(zhí)行時(shí)間由線程自己控制,執(zhí)行完后再主動(dòng)通知系統(tǒng)切換線程,可能會(huì)導(dǎo)致一個(gè)線程長時(shí)間地阻塞
          搶占式調(diào)度
          由系統(tǒng)分配時(shí)間,線程可以主動(dòng)讓出時(shí)間但是不能主動(dòng)獲得時(shí)間,通過設(shè)置優(yōu)先級(jí)確定順序
          線程的狀態(tài)
          · 新建:剛剛創(chuàng)建還未啟動(dòng)
          · 運(yùn)行:正在執(zhí)行或者等待分配時(shí)間
          · 無限等待:不會(huì)被CPU分配時(shí)間,需要其他線程顯式喚醒
          · 有限等待:在一段時(shí)間后由系統(tǒng)自動(dòng)喚醒
          · 阻塞:等待一個(gè)排他鎖
          · 結(jié)束
          三.線程安全與鎖優(yōu)化
          線程安全的程度,依次減弱
          · 不可變,將對(duì)象中帶狀態(tài)的變量都置為final
          · 絕對(duì)線程安全,完全符合線程安全定義
          · 相對(duì)線程安全,對(duì)這個(gè)對(duì)象的單獨(dú)的操作是線程安全的,如Vector,HashTable等
          · 線程兼容,對(duì)象本身不是線程安全的,但是可以在調(diào)用端正確地使用同步手段才能保證在并發(fā)環(huán)境下正常使用。
          · 線程對(duì)立,無論調(diào)用端如何努力,都不可能實(shí)現(xiàn)線程安全
          線程安全的實(shí)現(xiàn)方法
          1、互斥同步
          synchronized關(guān)鍵字會(huì)在代碼塊的前后分別形成monitorenter和monitorexit指令,這兩個(gè)指令需要一個(gè)reference對(duì)象參數(shù),該鎖有一個(gè)計(jì)數(shù)器以實(shí)現(xiàn)同步,進(jìn)入時(shí)將計(jì)數(shù)器+1,退出時(shí)-1,本線程可重入,其他線程需阻塞等待。synchronized的缺點(diǎn)是由于Java線程是映射到操作系統(tǒng)的,所以喚醒阻塞一個(gè)線程都需要系統(tǒng)幫忙,需要從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài),耗費(fèi)很多處理器時(shí)間。
          ReentrantLock對(duì)synchronized的優(yōu)勢(shì):
          · 等待可中斷
          · 公平鎖:必須按照申請(qǐng)鎖的時(shí)間順序來一次獲得鎖
          · 鎖綁定多個(gè)條件
          2、非阻塞同步
          為了解決線程阻塞和喚醒所帶來的性能問題,先對(duì)共享數(shù)據(jù)進(jìn)行操作,如果沒有競(jìng)爭就成功了,否則就補(bǔ)償(不斷重試直到成功)
          3、無同步方案
          · 可重入代碼
          · 線程本地存儲(chǔ),把共享數(shù)據(jù)的范圍限制到線程內(nèi),ThreadLocalMap以ThreadLocalHashMap為鍵,以本地線程變量為值的K-V對(duì)
          鎖優(yōu)化
          鎖優(yōu)化的方案有以下幾種:
          · 自旋鎖:為了減少線程阻塞與喚醒的消耗,線程在被阻塞時(shí)可以執(zhí)行一個(gè)忙循環(huán)(自旋)
          · 鎖消除:對(duì)不存在共享數(shù)據(jù)競(jìng)爭的鎖進(jìn)行消除
          · 鎖粗化:在一個(gè)代碼塊內(nèi)對(duì)一個(gè)對(duì)象連續(xù)的地加鎖解鎖,就對(duì)整個(gè)代碼塊一次性加鎖減少性能損耗
          · 輕量級(jí)鎖:無競(jìng)爭地情況下使用CAS操作去消除同步使用地互斥量
          · 偏向鎖:鎖會(huì)偏向于第一個(gè)獲得它地線程
         

        免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

        免費(fèi)咨詢獲取折扣

        Loading
        国产精品视频白浆免费视频_久久久高清国产免费观看_亚洲一区二区三区在线免费观看_免费欧洲美女a视频一级毛片
      1. <samp id="mz5ne"><acronym id="mz5ne"></acronym></samp>
          <ol id="mz5ne"></ol>
        1. <samp id="mz5ne"></samp>
          <mark id="mz5ne"></mark>

            <fieldset id="mz5ne"></fieldset>
            都匀市| 建始县| 缙云县| 马关县| 荆州市| 宁明县| 洪泽县| 嘉祥县| 如东县| 保靖县| 建阳市| 象山县| 丰城市| 临沧市| 西乌| 昔阳县| 建昌县| 七台河市| 大冶市| 楚雄市| 崇州市| 滨海县| 文昌市| 通榆县| 陵川县| 林芝县| 墨竹工卡县| 社会| 龙海市| 湄潭县| 景谷| 永昌县| 北票市| 军事| 云龙县| 云和县| 乐昌市| 于田县| 南江县| 常山县| 萝北县|