国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

54個JAVA官方文檔重要術語

longmon / 1737人閱讀

摘要:近期在閱讀最新幾版的官方文檔過程中發現不少術語不清之處特發此文總結以下的術語大量在官方文檔中直接出現且直接如基本詞語一樣使用不理解它們會嚴重影響閱讀自適應自旋鎖自適應自旋鎖是一個允許線程在特定點自旋等待特定事件發生而不是直接進行并等待該事件

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

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

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

2.偏向鎖(biased locking)

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

3.塊起始表(block start table)

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

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

它是負責加載啟動路徑(尤其核心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
(帶"*"表示為"可更新模塊".)

應用類加載器負責加載的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堆中的用來存放最近分配的對象的區域.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74684.html

相關文章

  • 關于偏向鎖,安全點,JIT的一些暗坑.

    摘要:前言本文是一篇簡短的雜糅本文源自于作者最近的一個疑問為什么在舊版的中偏向鎖的移除一定要在全局安全點進行同時在上個星期作者參與的一個項目發生了一件怪事一個服務莫名其妙地不接受任何請求了一切請求都是而查看日志發現出故障的服務本身去請求另一個服務 前言 本文是一篇簡短的雜糅. 本文源自于作者最近的一個疑問:為什么在舊版的jdk中偏向鎖的移除一定要在全局安全點進行?同時在上個星期,作者參與的一...

    JeOam 評論0 收藏0
  • JAVA運行時簡述(HotSpot)

    摘要:拆解虛擬機的基本步聚如下首先,要等待到自身成為唯一一個正在運行的非守護線程時,在整個等待過程中,虛擬機仍舊是可工作的。將相應的事件發送給,禁用,并終止信號線程。 本文簡單介紹HotSpot虛擬機運行時子系統,內容來自不同的版本,因此可能會與最新版本之間(當前為JDK12)存在一些誤差。 1.命令行參數處理HotSpot虛擬機中有大量的可影響性能的命令行屬性,可根據他們的消費者進行簡...

    hosition 評論0 收藏0
  • 面試中關于Redis的問題看這篇就夠了

    摘要:所以查閱官方文檔以及他人造好的輪子,總結了一些面試和學習中你必須掌握的問題。在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。 昨天寫了一篇自己搭建redis集群并在自己項目中使用的文章,今天早上看別人寫的面經發現redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結了一些redis面試和學習中你必須掌握的問題。...

    yanbingyun1990 評論0 收藏0

發表評論

0條評論

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