成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

[[220438]]

一.晚期運(yùn)行期優(yōu)化

即時(shí)編譯器JIT

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

熱點(diǎn)代碼

熱點(diǎn)代碼分類(lèi)

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

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

  • 基于采樣的熱點(diǎn)探測(cè),虛擬機(jī)周期性地檢查棧頂,發(fā)現(xiàn)某個(gè)方法經(jīng)常出現(xiàn)在棧頂,那么這個(gè)方法就是熱點(diǎn)方法,簡(jiǎn)單高效但不精確
  • 基于計(jì)數(shù)器熱點(diǎn)探測(cè),為每個(gè)方法建立計(jì)數(shù)器來(lái)統(tǒng)計(jì)執(zhí)行次數(shù),超過(guò)閾值就是熱點(diǎn)方法,Hotpot就是采用這種方法。分為方法計(jì)數(shù)器(統(tǒng)計(jì)方法),回邊計(jì)數(shù)器(統(tǒng)計(jì)循環(huán))

編譯過(guò)程(Client Complier)

***階段

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

第二階段

  • 將HIR變?yōu)長(zhǎng)IR

第三階段

  • 使用線(xiàn)性?huà)呙杷惴ǎ贚IR上分配寄存器,產(chǎn)生機(jī)器代碼

優(yōu)化方法

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

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

數(shù)組邊界檢查消除

方法內(nèi)聯(lián)

逃逸分析

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

優(yōu)化方法:

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

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

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

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

內(nèi)存模型

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

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

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

8種原子操作

  • lock(鎖定):作用于主內(nèi)存的變量,它把一個(gè)變量標(biāo)識(shí)為一條線(xiàn)程獨(dú)占的狀態(tài)。
  • unlock(解鎖):作用于主內(nèi)存的變量,它把一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),釋放后的變量才可以被其他線(xiàn)程鎖定。
  • read(讀取):作用于主內(nèi)存的變量,它把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€(xiàn)程的工作內(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(寫(xiě)入):作用于主內(nèi)存的變量,它把 store 操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。

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

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

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

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

先行發(fā)生原則

  • 程序次序規(guī)則
  • 管程鎖定規(guī)則
  • volatile變量規(guī)則
  • 線(xiàn)程啟動(dòng)規(guī)則
  • 線(xiàn)程終止規(guī)則
  • 線(xiàn)程中斷規(guī)則
  • 對(duì)象終結(jié)規(guī)則
  • 傳遞性

Java與線(xiàn)程

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

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

  • 使用內(nèi)核線(xiàn)程實(shí)現(xiàn):內(nèi)核線(xiàn)程即直接由操作系統(tǒng)內(nèi)核支持的線(xiàn)程,由內(nèi)核來(lái)完成線(xiàn)程切換,程序使用輕量級(jí)進(jìn)程接口與內(nèi)核線(xiàn)程一對(duì)一的關(guān)系,內(nèi)核線(xiàn)程再經(jīng)由線(xiàn)程調(diào)度器分派給CPU。
  • 使用用戶(hù)線(xiàn)程實(shí)現(xiàn):用戶(hù)線(xiàn)程的建立同步銷(xiāo)毀調(diào)度完全在用戶(hù)態(tài)中完成,不需切換到內(nèi)核態(tài),一對(duì)多的關(guān)系。
  • 用戶(hù)線(xiàn)程+輕量級(jí)進(jìn)程:多對(duì)多的關(guān)系。

線(xiàn)程的調(diào)度

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

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

搶占式調(diào)度

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

線(xiàn)程的狀態(tài)

  • 新建:剛剛創(chuàng)建還未啟動(dòng)
  • 運(yùn)行:正在執(zhí)行或者等待分配時(shí)間
  • ***等待:不會(huì)被CPU分配時(shí)間,需要其他線(xiàn)程顯式喚醒
  • 有限等待:在一段時(shí)間后由系統(tǒng)自動(dòng)喚醒
  • 阻塞:等待一個(gè)排他鎖
  • 結(jié)束

三.線(xiàn)程安全與鎖優(yōu)化

線(xiàn)程安全的程度,依次減弱

  • 不可變,將對(duì)象中帶狀態(tài)的變量都置為final
  • 絕對(duì)線(xiàn)程安全,完全符合線(xiàn)程安全定義
  • 相對(duì)線(xiàn)程安全,對(duì)這個(gè)對(duì)象的單獨(dú)的操作是線(xiàn)程安全的,如Vector,HashTable等
  • 線(xiàn)程兼容,對(duì)象本身不是線(xiàn)程安全的,但是可以在調(diào)用端正確地使用同步手段才能保證在并發(fā)環(huán)境下正常使用。
  • 線(xiàn)程對(duì)立,無(wú)論調(diào)用端如何努力,都不可能實(shí)現(xiàn)線(xiàn)程安全

線(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,本線(xiàn)程可重入,其他線(xiàn)程需阻塞等待。synchronized的缺點(diǎn)是由于Java線(xiàn)程是映射到操作系統(tǒng)的,所以喚醒阻塞一個(gè)線(xiàn)程都需要系統(tǒng)幫忙,需要從用戶(hù)態(tài)轉(zhuǎn)到內(nèi)核態(tài),耗費(fèi)很多處理器時(shí)間。

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

  • 等待可中斷
  • 公平鎖:必須按照申請(qǐng)鎖的時(shí)間順序來(lái)一次獲得鎖
  • 鎖綁定多個(gè)條件

2、非阻塞同步

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

3、無(wú)同步方案

  • 可重入代碼
  • 線(xiàn)程本地存儲(chǔ),把共享數(shù)據(jù)的范圍限制到線(xiàn)程內(nèi),ThreadLocalMap以ThreadLocalHashMap為鍵,以本地線(xiàn)程變量為值的K-V對(duì)

鎖優(yōu)化

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

  • 自旋鎖:為了減少線(xiàn)程阻塞與喚醒的消耗,線(xiàn)程在被阻塞時(shí)可以執(zhí)行一個(gè)忙循環(huán)(自旋)
  • 鎖消除:對(duì)不存在共享數(shù)據(jù)競(jìng)爭(zhēng)的鎖進(jìn)行消除
  • 鎖粗化:在一個(gè)代碼塊內(nèi)對(duì)一個(gè)對(duì)象連續(xù)的地加鎖解鎖,就對(duì)整個(gè)代碼塊一次性加鎖減少性能損耗
  • 輕量級(jí)鎖:無(wú)競(jìng)爭(zhēng)地情況下使用CAS操作去消除同步使用地互斥量
  • 偏向鎖:鎖會(huì)偏向于***個(gè)獲得它地線(xiàn)程
責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2010-06-18 10:13:17

虛擬機(jī)消失

2011-09-21 11:20:46

Windows8虛擬機(jī)

2013-03-20 15:21:56

vSphere Rep

2018-07-25 14:41:29

Java虛擬機(jī)Android

2012-05-18 10:22:23

2018-02-06 22:18:47

Java虛擬機(jī)面試

2012-04-28 12:03:55

JavaJVMJava虛擬機(jī)

2012-05-18 10:11:10

虛擬機(jī)VM

2018-06-19 15:39:21

HeapJava虛擬機(jī)

2011-06-22 13:35:55

JVM

2020-01-17 10:52:37

無(wú)服務(wù)器容器技術(shù)

2013-07-17 09:32:58

2024-02-19 07:44:52

虛擬機(jī)Java平臺(tái)

2009-06-12 16:02:58

裝載Java虛擬機(jī)

2010-07-26 09:02:38

2020-06-03 19:07:49

Java虛擬機(jī)JVM

2010-09-17 15:12:57

JVMJava虛擬機(jī)

2010-09-25 15:13:40

JVMJava虛擬機(jī)

2019-03-05 14:59:42

Java虛擬機(jī)加載類(lèi)

2021-04-14 18:58:01

虛擬機(jī) Java內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人高清在线观看 | 久久久性 | 成人蜜桃av| 久久综合一区 | 作爱视频免费观看 | 国产精品欧美一区二区三区 | 国产美女黄色片 | 欧美在线亚洲 | 中文字幕啪啪 | 又爽又黄axxx片免费观看 | 久久精品国产一区 | 色视频www在线播放国产人成 | 男女羞羞视频免费 | 欧美成人在线免费 | 免费在线看黄视频 | 成人国产精品久久久 | 精品中文在线 | 久久成人免费视频 | 97狠狠干| 毛片免费看 | 亚洲精品中文字幕av | 色毛片 | 欧美一区二区免费 | 午夜av成人 | 成人性生交大片免费看中文带字幕 | 日韩中文字幕一区二区三区 | a中文在线视频 | 超碰精品在线 | 中文字幕 在线观看 | 久久av资源网 | 亚洲一区二区三区桃乃木香奈 | 密室大逃脱第六季大神版在线观看 | 精品国产一区二区三区日日嗨 | 西西裸体做爰视频 | 国产精品爱久久久久久久 | 美国一级黄色片 | 日韩伦理一区二区 | 精品免费视频一区二区 | 久久伊人精品一区二区三区 | 日韩亚洲视频 | 韩日精品一区 |