偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java 虛擬機總結給面試的你

云計算 虛擬化 新聞
本篇主要針對Java虛擬機的晚期編譯優(yōu)化,Java內存模型與線程,線程安全與鎖優(yōu)化進行總結,其余部分總結請點擊Java虛擬總結上篇 ,Java虛擬機總結篇。

 本篇主要針對Java虛擬機的晚期編譯優(yōu)化,Java內存模型與線程,線程安全與鎖優(yōu)化進行總結,其余部分總結請點擊Java虛擬總結上篇 ,Java虛擬機總結篇。

[[220438]]

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

即時編譯器JIT

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

熱點代碼

熱點代碼分類

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

熱點探測判定方法

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

編譯過程(Client Complier)

***階段

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

第二階段

  • 將HIR變?yōu)長IR

第三階段

  • 使用線性掃描算法,在LIR上分配寄存器,產生機器代碼

優(yōu)化方法

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

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

數組邊界檢查消除

方法內聯(lián)

逃逸分析

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

優(yōu)化方法:

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

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

Java 虛擬機總結給面試的你

二.Java內存模型與線程

內存模型

說了這么多的內存模型,到底什么是內存模型呢?

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

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

8種原子操作

  • lock(鎖定):作用于主內存的變量,它把一個變量標識為一條線程獨占的狀態(tài)。
  • unlock(解鎖):作用于主內存的變量,它把一個處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定。
  • read(讀?。鹤饔糜谥鲀却娴淖兞?,它把一個變量的值從主內存?zhèn)鬏數骄€程的工作內存中,以便隨后的 load 動作使用。
  • load(載入):作用于工作內存的變量,它把 read 操作從主內存中得到的變量值放入工作內存的變量副本中。
  • use(使用):作用于工作內存的變量,它把工作內存中一個變量的值傳遞給執(zhí)行引擎,每當虛擬機遇到一個需要使用到變量的值的字節(jié)碼指令時將會執(zhí)行這個操作。
  • assign(賦值):作用于工作內存的變量,它把一個從執(zhí)行引擎接收到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。
  • store(存儲):作用于工作內存的變量,它把工作內存中一個變量的值傳送到主內存中,以便隨后的 write 操作使用。
  • write(寫入):作用于主內存的變量,它把 store 操作從工作內存中得到的變量的值放入主內存的變量中。

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

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

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

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

先行發(fā)生原則

  • 程序次序規(guī)則
  • 管程鎖定規(guī)則
  • volatile變量規(guī)則
  • 線程啟動規(guī)則
  • 線程終止規(guī)則
  • 線程中斷規(guī)則
  • 對象終結規(guī)則
  • 傳遞性

Java與線程

Java的Thread類大多API都是Native方法,是與平臺相關的。

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

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

線程的調度

協(xié)同式調度

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

搶占式調度

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

線程的狀態(tài)

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

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

線程安全的程度,依次減弱

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

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

1、互斥同步

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

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

  • 等待可中斷
  • 公平鎖:必須按照申請鎖的時間順序來一次獲得鎖
  • 鎖綁定多個條件

2、非阻塞同步

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

3、無同步方案

  • 可重入代碼
  • 線程本地存儲,把共享數據的范圍限制到線程內,ThreadLocalMap以ThreadLocalHashMap為鍵,以本地線程變量為值的K-V對

鎖優(yōu)化

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

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

2010-06-18 10:13:17

虛擬機消失

2011-09-21 11:20:46

Windows8虛擬機

2018-07-25 14:41:29

Java虛擬機Android

2013-03-20 15:21:56

vSphere Rep

2018-02-06 22:18:47

Java虛擬機面試

2012-05-18 10:22:23

2012-04-28 12:03:55

JavaJVMJava虛擬機

2018-06-19 15:39:21

HeapJava虛擬機

2011-06-22 13:35:55

JVM

2012-05-18 10:11:10

虛擬機VM

2020-01-17 10:52:37

無服務器容器技術

2013-07-17 09:32:58

2009-06-12 16:02:58

裝載Java虛擬機

2010-07-26 09:02:38

2024-02-19 07:44:52

虛擬機Java平臺

2020-06-03 19:07:49

Java虛擬機JVM

2010-09-17 15:12:57

JVMJava虛擬機

2019-03-05 14:59:42

Java虛擬機加載類

2010-09-25 15:13:40

JVMJava虛擬機

2021-04-14 18:58:01

虛擬機 Java內存
點贊
收藏

51CTO技術棧公眾號