54個JAVA官方文檔重要術語

近期在閱讀JAVA最新幾版的官方文檔過程當中發現很多術語不清之處,特發此文總結.
如下的術語大量在官方文檔中直接出現,且直接如基本詞語同樣使用,不理解它們會嚴重影響閱讀.java

1.自適應自旋鎖(adaptive spinning)node

自適應自旋鎖是一個容許線程在特定點自旋等待特定事件發生而不是直接進行block並等待該事件發生或條件變化的通知的優化機制."自適應"是指決定在block以前自旋的時間.c++

2.偏向鎖(biased locking)算法

偏向鎖也是一種優化機制,它使得一個線程在釋放鎖以後,vm仍舊在邏輯上讓該線程"持有"一個對象的鎖,它的優化前提點是該線程會在稍後從新獲取該鎖(這是一個常見的事件),若是此時有其餘線程爭搶該鎖,則必須撤消偏向鎖持有者的偏向鎖.sql

3.塊起始表(block start table)shell

它表示一段堆內存區域,對象在該內存區域的起始地址從較低的地址開始,它的一個樣例是remembered set中的card table變體.編程

4.啓動類加載器(bootstrap classloader)bootstrap

它是負責加載啓動路徑(尤爲核心java平臺類)下的類或資源的加載器,通常由虛擬機實現,在JAVA api層面,用classloader獲取該實例會返回null.
順便提一下JAVA9以後的類加載機制變化,在JAVA9以前,類的加載是簡單的"雙親委託"模式,應用類加載器委託給擴展類加載器,再向上委託到啓動類加載器,父加載器不能加載時再自行加載,但在JAVA9以後開啓了模塊化系統,出現了"模塊路徑"的概念,並移除了"簽名重寫"和"擴展"機制,相應的移除了擴展類加載器,取而代之的是平臺類加載器,相應的變化詳述以下:
應用類加載器再也不URLClassLoader的實現類,而成爲它的一個內部類,它是非JAVA SE或JDK模塊以外的具名模塊的默認加載器.
擴展類加載器也再也不是URLClassLoader的實例,而成爲它的一個內部類,在JEP220以後,它再也不經過擴展機制來加載類.它能夠用來定義JAVA SE 和JDK中的可選模塊,它如今被稱爲平臺類加載器,使用ClassLoader::getPlatformClassLoader能夠獲取該加載器的實例.
在JAVA9以後,啓動類加載器由虛擬機和核心庫共同實現,出於兼容性,使用ClassLoader api獲取該類加載器仍舊會返回null,它定義了核心java se和jdk的模塊.
加載按以下順序進行:
應用類加載器首先搜索它的內建加載器定義的全部"具名模塊",若是對這些加載器找到了合適的模塊定義,將會使用該加載器加載class.若是class並無在這些加載器定義的具名模塊中找到,那麼應用類加載器將會委託給雙親.若是雙親也沒有找到,則應用類加載器搜索類路徑,在類路徑下找到的類將成爲這些加載器的無名模塊.
原擴展類加載器由平臺類加載器替代,平臺類加載器會搜索全部內建加載器的具名模塊定義,若是找到合適的模塊,那麼加載器會加載該類.(平臺加載器如今能夠委託給應用類加載器,它在一個模塊位於更新模塊路徑且依賴了應用模塊路徑下的模塊時會頗有用)若是一個類沒有在平臺類加載器的的有加載器下定義的具名模塊中找到,委託給父加載器加載.
啓動類加載器會檢索本身定義的具名模塊,若是一個類未能在啓動加載器定義的具名模塊中找到,則查找添加到啓動類路徑下的文件和目錄(可經過-Xbootclasspath/選項指定).在該路徑下找到的類將成爲這些加載器的無名模塊.
三種加載器分別負責jdk中的不一樣模塊,以下:
平臺類加載器負責的jdk模塊:
java.activation* jdk.accessibility
java.compiler* jdk.charsets
java.corba* jdk.crypto.cryptoki
java.scripting jdk.crypto.ec
java.se jdk.dynalink
java.se.ee jdk.incubator.httpclient
java.security.jgss jdk.internal.vm.compiler*
java.smartcardio jdk.jsobject
java.sql jdk.localedata
java.sql.rowset jdk.naming.dns
java.transaction* jdk.scripting.nashorn
java.xml.bind* jdk.security.auth
java.xml.crypto jdk.security.jgss
java.xml.ws* jdk.xml.dom
java.xml.ws.annotation* jdk.zipfs
(帶'*'表示爲"可更新模塊".)api

應用類加載器負責加載的jdk模塊:數組

jdk.aot jdk.jdeps
jdk.attach jdk.jdi
jdk.compiler jdk.jdwp.agent
jdk.editpad jdk.jlink
jdk.hotspot.agent jdk.jshell
jdk.internal.ed jdk.jstatd
jdk.internal.jvmstat jdk.pack
jdk.internal.le jdk.policytool
jdk.internal.opt jdk.rmic
jdk.jartool jdk.scripting.nashorn.shell
jdk.javadoc jdk.xml.bind*
jdk.jcmd jdk.xml.ws*
jdk.jconsole
其餘JAVA SE和jdk模塊由啓動類加載器負責:

java.base java.security.sasl
java.datatransfer java.xml
java.desktop jdk.httpserver
java.instrument jdk.internal.vm.ci
java.logging jdk.management
java.management jdk.management.agent
java.management.rmi jdk.naming.rmi
java.naming jdk.net
java.prefs jdk.sctp
java.rmi jdk.unsupported

5.字節碼校驗(bytecode verification)

類的連接過程當中的一個步驟,在這個步驟中分析方法字節碼保證類型安全.

6.C1編譯器(C1 compiler)
C1編譯器是一個快速輕量級的優化字節碼編譯器.它會執行一些值的編號,內聯,類分析.它使用簡單的面向cfg的SSA高級信息檢索、面向機器的低級信息檢索,一個線性掃描寄存器分配以及一個模板樣式的代碼生成器。

7.C2編譯器(C2 compiler)

它是高度的優化字節碼編譯器,也被稱之爲'opto',它使用"節點海洋" SSA "理想化" 信息檢索,它會下沉到同一種機器規格的信息檢索.它有一個圖着色的寄存器,可給全部機器狀態進行着色(包含本地的,全局的,參數寄存器和棧).C2編譯器能作出的優化包含全局變量值編號,狀態常量類型傳遞,常量摺疊,全局代碼移動,代數身份,方法內聯(聚合的優化的和/或多態),內部替換,循環轉換(去switch去輪循等),數組邊界檢查的消除等.

8.卡表表(card table)

它是一種記錄了一個代中oops改變的記錄的remembered set.

9.類數據共享(class data sharing)

類數據共享是一個啓動優化,它記錄了一些類的內存結構,使虛擬機在後續的運行中不用再從class文件中去載入相應的類,而是直接映射到內存結構中的數據.

10.類層級分析(class hierachy analysis)

也被稱之爲'CHA',編譯器會分析類樹,以找出虛擬調用點的接收者是否有一個單一的實現者,若是存在,能夠內聯被調用者,編譯器也可以使用一些其餘的靜態調用機制.

11.代碼緩存(code cache)

它是一個特殊的持有編譯後代碼的堆.這些對象不會被gc搬移,但它們可能會包含服務於gc roots 的oops.

12.整理(compaction)

整理是一個gc中常見的技術,它會將存活的對象密集地放置在一個虛擬地址空間,同時使得其餘地址空間成爲連續可用的空閒空間.

13.併發(concurrency)

併發或者說併發編程,是邏輯上多個指令流的同時執行,若是有可用的多處理器,那麼邏輯上的同時執行能夠物理上同是地執行,也就是咱們所知的'並行'.

14.併發gc(concurrent garbage collection)

它是在java應用線程保持運行態的同時進行大部分工做的gc算法.

15.拷貝gc(copying garbage collection)

一種垃圾收集期間移動對象的gc算法.

16.反優化(deoptimization)

反優化是一個將編譯的(或者更優化的)棧楨轉化爲解釋的(或者弱優化的)棧楨的過程.它也被解釋爲放棄依賴條件被打破(或者假定被打破)的nmethod的過程.反優化nmethod通常會被從新編譯以便適配應用行爲的變化.舉個例子,編譯器初始假定一個引用的值從不爲null,而且使用"捕獲內存訪問"的方法進行測試.後續程序運行過程當中,程序使用了null值,那麼方法必須進行反優化和重編譯,使用顯示的test-and-branch方式發現此類null值.

17.依賴(dependency)

它是nmethod關聯的一個優化假定條件,它容許編譯器在nmethod中值入優化代碼.舉例:一個類無子類,那麼它能夠簡化方法轉發和類型測試.載入一個新的類型(或者替換老類型)可能致使這個依賴條件爲爲false,這就須要捨棄掉並反優化這些依賴nmethod.

18.伊甸園(eden)

堆內存的一部分,特色是對象能夠在其中高效地建立.
注:是分代垃圾收集器全部的特性,在一些新的垃圾收集器中出現弱化(G1中爲邏輯上不相連的區域,zgc和Shenandoah可算爲'無代'的垃圾收集器,也就不存在eden的概念).

19.空閒列表(free list)

空閒列表是一種內存管理技術,它使無用的部分java對象堆彼此鏈接,而不是將這些無用堆部分放置在同一個block中.

20.垃圾收集(garbage collection)

即常說的內存的自動管理.

21.垃圾收集根(garbage collection root)

它是一個從外部指向java對象堆的指針.舉例:從類的靜態字段或活化棧楨的本地對堆中對象的引用.

22.GC圖(GC map)

gc映射是一個由JIT(C1或C2)在編譯的棧楨內的寄存器或在棧內的對象指針的位置上插入的描述.每個可能執行安全點操做的位置都有關聯的gc映射圖.gc知道如何去在一個棧中解析一個楨,怎麼去從一個楨的nmethod請求一個gc映射,以及如何去取出棧楨內的gc映射和管理對象指針.

23.分代垃圾收集(generational garbage collection)

分代垃圾收集是一種對於不一樣堆區按存活時間長度不一樣分離對象的存儲管理技術,它能夠令這些不一樣的區域使用不一樣的算法進行收集.

24.句柄(handle)

句柄是一個包含對象指針的內存原語(word),它對gc徹底可知,gc視之爲根引用.c/c++代碼經過句柄間接地引用對象指針,爲了讓gc更容易地找到和管理根集合.任什麼時候刻,c/c++代碼塊進入安全點時,gc可能改變句柄中存放的對象指針.句柄只能是'局部的'(屬於一個線程,受線程堆棧規則制約,但在線程線上並不是必須的)或'全局的'(長期存活且顯式取消分配),虛擬機實現了大量的句柄實現,它們所有對gc可識別.

25.熱鎖(hot lock)

高度競態的鎖.

26.解釋器(interpreter)

解釋器是由單個執行字節碼實現方法調用的虛擬機模塊.解釋器具備一個高度特化棧楨部局和寄存器使用圖的有限集,使用它們做用於全部的方法活化.Hotspot虛擬器會在啓動時生成本身的解釋器.

27.JIT編譯器(JIT compilers)

JIT編譯器是一個應用運行時爲應用(或類庫)自生成代碼的在線編譯器.JIT即just in time.JIT編譯器能夠在java方法執行前很是快速地建立機器碼.Hotspot編譯器容許解釋器執行java方法數千次以採樣運行數據並熱身,由於它能夠在類加載初始化後觀測到完整的類層級,熱身週期使編譯器有充足的依據作出優化決策.編譯器也能夠檢視解釋器收集的分支和類型的剖析信息.

28.jni接口(JNI)

java本地方法接口.它定義了一組api,用於java代碼調用native c代碼,以及它怎麼調用java虛擬機代碼.

29.jvm工具接口(JVM TI)

用於開發和監測jvm的工具.

30.類指針(klass pointer)

Java中對象頭有兩個word(在JAVA12推出的體驗版Shenandoah垃圾收集器模型中新增了一個'間接指針',故有三個word).第二個word指向一個描述了原生對象的部局和行爲的(一個元數據對象),對於java對象來主產,"klass"包含c++風格的"vtable".

31.標記語(mark word)

每一個對象頭的第一個word,它是一組按位劃分的字段,包含同步狀態和hash碼,也可能有一個與同步有關信息關聯的指針(低位編碼),在gc過程當中,也可能包含gc狀態位.

32.nmethod

nmethod是一個實現了一些java字節碼的可執行代碼塊.它多是一個完整的java方法,或者一個'osr'(當前棧替換)方法,它一般包含編譯器內聯的附加方法的對象代碼.

33.對象頭(object header)

對象頭是每一個gc管理的堆對象的通用開始結構.(每一個對象指針指向一個對象的頭部)包含關於堆對象部局,類型,gc狀態,同步狀態,身份標識哈希碼等屬性.對象頭包含兩個word(前述Shenandoah包含三個word),在數組中它後面緊隨一個長度字段.注意java對象和vm內部對象具有一樣的對象頭格式.

34.對象晉升(object promotion)

把對象從一個代拷貝到另外一個代的過程.
35.老年代(old generation)

一個存放存活較持久對象的堆區.

36.當前棧替換(on-stack replacement)

即前面說過的'OSR',它是一個把解釋棧楨(弱優化)轉換爲一個編譯的棧楨(強優化)的過程.這發生在編譯器發現一個方法處於循環中的情景時,這會請求編譯器在循環中的一個特殊入口點(特殊狀況在後向分支)上生成一個特殊的nmethod,並轉化控制到該nmethod,它的反過程即前述'反優化'.

37.對象指針(oop)

即object pointer,通常來講是一個指向gc管理堆的指針(這是一個傳統的協議,o表明ordinary).它的實現是一個本地機器地址而不是一個句柄.對象指針能夠由編譯器或解釋器java代碼直接組裝,由於gc知道這些代碼中的對象指針的存活狀況和位置.(參見gc映射)對象指針能夠直接用c/c++代碼來組裝,但在跨越安全點時相應的代碼必定要把它保持在每一個句柄以內.

38.並行類加載(parallel classloading)

同一類加載器同一時刻加載多個class/type.

39.並行gc(parallel garbage collection)

並行gc是一個能夠在多處理器場景下使用多線程保證更高的效率的gc算法.

40.永久代(permanent generation)

永久代是由gc管理的虛擬機自身分配對象的一個地址空間,它實際上是被"誤解稱"爲永久代的,幾乎其中的全部對象都不會被回收,由於它們會存活很長一段時間,因此極少的回收(但不是不回收).

41.remembered set

在代之間記錄指針的一種數據結構.

42.安全點(safepoint)

在安全點,全部的GC roots已知且全部堆對象內容是一致的.從全局安全點的角度看,全部線程必定要在gc能夠運行前在安全點阻塞.(特殊狀況,運行JNI代碼的線程能夠繼續運行,由於它們只用句柄,在安全點期間他們不能載入句柄的內容,只能阻塞)從局部角度看,安全點便是一個線程可能由於GC而阻塞執行過程的代碼中的一個點.大多數的調用點能夠做爲安全點,有一些強不變量會在任何一個安全點保持true,但在非空全點期間會被無視.編譯的java代碼和c/c++代碼都針對安全點間進行了優化,但對於跨安全點作的優化不多.JIT編譯器會在每一個安全點安插一個GC映射.在虛擬機中的c/c++代碼會使用程式化的基於宏的規約(如TRAPS)來標記潛在安全點.
目前做者從散碎的若干文檔中能夠肯定安全點的影響點有:
最多見的基於安全點的操做是gc,或者更精確地說爲gc的"stop the world"階段,可是在虛擬機中仍舊有不少依賴於安全點的操做.
偏向鎖的移除.
線程掛起或中止(Thread.stop())
JVMTI請求的內檢操做.
代碼反優化.
刷新代碼緩存.
類重定義(如執交換或在線監測instrumentation)
偏向鎖移除
各類debug操做(棧dump,死鎖檢測等)
從JAVA10開始,官方對於安全點作出了至少一個優化:即線程本地握手/或線程局部握手.
該功能的核心思想在於在每個java線程的安全點執行相應的回調操做(java線程或vm線程).
虛擬機線程將會協調握手操做,它會在握手期間阻止全局安全點的發生,經過這樣至少實現瞭如下幾點優化目標:
提高偏向鎖的撤消操做,再也不須要停掉全部的線程,只須要中止單個線程並執行偏向鎖操做撤消便可.
減小一些如獲取棧跡等操做對虛擬機全局延遲影響.在執行安全的棧跡採樣時可減小對信號量的依賴.
使用異步的Dekker同步技術實現一些內在屏障操做,這能夠經過使用java線程執行握手操做的方式實現.如G1和CMS須要使用的狀態卡標記代碼將再也不須要內存屏障,結果就是G1的後處理寫屏障能夠被優化,有關避免內存屏障的代碼分支也可移除.

43.節點海洋(sea-of-nodes)

它是C2編譯器中的一個高等的中間表現形式,以SSA格式表現,數據流和控制流表現均以節點間的直線表示.與傳統編譯器的格式不一樣,傳統編譯器的控制流圖不以代碼塊爲邊限.IR(猜想是intermediate representation的意思)容許節點在海洋中流動(受到節點之間的邊線約束),直到它們在稍後的編譯過程當中被預約.

44.可維護的代理(Serviceability Agent (SA))

可維護的代理一一組sun公司的內部用來debug Hotspot虛擬機問題的代碼.它也被用在一些JDK的工具包中,如jstack,jmap,jinfo,jdb等.

45.棧圖(stackmap)

它是棧映射表(StackMapTable)屬性的引用或者表中的一個特殊棧映射楨(StackMapFrame)的引用.

46.棧映射表(StackMapTable)

是在一個包含驗證階段由驗證器使用的類型信息的類文件的一個代碼屬性.它包含一個StackMapFrames數組,它在JDK6中由javac命令自動生成.

47.倖存者空間(survivor space)

它是java對象堆中存儲對象的一個區域,一般有一對倖存者區,回收一個區時,將一個倖存者區的被引用的(存活)對象拷貝到另外一個存活着區.

48.同步(synchronization)

它能夠用來協調併發職能,保證這些工做的安全性和活躍性.舉例:經過鎖保護全部訪問主某共享數據的訪問路徑.

49.線程本地分配緩存(TLAB)

線程本地分配緩存(Thread-local allocation buffer),用來快速無同步地分配堆空間.編譯後的代碼對一些嘗試用在當前線程本地分配緩存的方式達到"高位標記"的幾個指令有一個"快速執行路徑",當嘗試分配對象時,若是這個標記位於線程本地分配緩存指定的限定地址以前,則表明分配空間成功.

50.不常見的陷阱(uncommon trap)

當C2生成的代碼回滾到解釋器以備後續執行時.C2通常按照常見案例進行編譯,這容許它專一於最頻繁常見執行路徑的優化.舉個例子,當一個類在編譯時處於未初始化態而須要運行時初始值時,C2編譯器在生成的代碼中插入一個"不常見的陷阱".

51.驗證器(verifier)

虛擬機中執行字節碼校驗的軟件代碼.

52.虛擬機操做(VM Operations)

虛擬機中能夠被java線程請求的,可是必定要由虛擬機線程以串行方式執行的操做,這些操做一般是同步的,所以請求者將會block直到虛擬機線程完成舊有操做.不少這些操做一般須要虛擬機到達安全點.gc是一個簡單的例子.

53.寫屏障(write barrier)

寫屏障是在每一個對象指針存儲時執行的代碼,舉個例子,如維護一個remembered set.
54.年輕代(young generation)

java堆中的用來存放最近分配的對象的區域.

相關文章
相關標籤/搜索