什么是JIT
一些其他解釋的網站:http://www.sohu.com/a/169704040_464084
1、動態編譯(dynamic compilation)指的是“在運行時進行編譯”;與之相對的是事前編譯(ahead-of-time compilation,簡稱AOT),也叫靜態編譯(static compilation)。
2、JIT編譯(just-in-time compilation)狹義來說是當某段代碼即將第一次被執行時進行編譯,因而叫“即時編譯”。JIT編譯是動態編譯的一種特例。JIT編譯一詞后來被泛化,時常與動態編譯等價;但要注意廣義與狹義的JIT編譯所指的區別。
3、自適應動態編譯(adaptive dynamic compilation)也是一種動態編譯,但它通常執行的時機比JIT編譯遲,先讓程序“以某種式”先運行起來,收集一些信息之后再做動態編譯。這樣的編譯可以更加優化。
概述
JVM運行原理
在部分商用虛擬機中(如HotSpot),Java程序最初是通過解釋器(Interpreter)進行解釋執行的,當虛擬機發現某個方法或代碼塊的運行特別頻繁時,就會把這些代碼認定為“熱點代碼”。為了提高熱點代碼的執行效率,在運行時,虛擬機將會把這些代碼編譯成與本地平臺相關的機器碼,并進行各種層次的優化,完成這個任務的編譯器稱為即時編譯器(Just In Time Compiler,下文統稱JIT編譯器)。
即時編譯器并不是虛擬機必須的部分,Java虛擬機規范并沒有規定Java虛擬機內必須要有即時編譯器存在,更沒有限定或指導即時編譯器應該如何去實現。但是,即時編譯器編譯性能的好壞、代碼優化程度的高低卻是衡量一款商用虛擬機優秀與否的最關鍵的指標之一,它也是虛擬機中最核心且最能體現虛擬機技術水平的部分。
由于Java虛擬機規范并沒有具體的約束規則去限制即使編譯器應該如何實現,所以這部分功能完全是與虛擬機具體實現相關的內容,如無特殊說明,我們提到的編譯器、即時編譯器都是指Hotspot虛擬機內的即時編譯器,虛擬機也是特指HotSpot虛擬機。
為什么HotSpot虛擬機要使用解釋器與編譯器并存的架構?
盡管并不是所有的Java虛擬機都采用解釋器與編譯器并存的架構,但許多主流的商用虛擬機(如HotSpot),都同時包含解釋器和編譯器。解釋器與編譯器兩者各有優勢:當程序需要迅速啟動和執行的時候,解釋器可以首先發揮作用,省去編譯的時間,立即執行。在程序運行后,隨著時間的推移,編譯器逐漸發揮作用,把越來越多的代碼編譯成本地代碼之后,可以獲取更高的執行效率。當程序運行環境中內存資源限制較大(如部分嵌入式系統中),可以使用解釋器執行節約內存,反之可以使用編譯執行來提升效率。此外,如果編譯后出現“罕見陷阱”,可以通過逆優化退回到解釋執行。
編譯的時間開銷
解釋器的執行,抽象的看是這樣的:
輸入的代碼 -> [ 解釋器 解釋執行 ] -> 執行結果
而要JIT編譯然后再執行的話,抽象的看則是:
輸入的代碼 -> [ 編譯器 編譯 ] -> 編譯后的代碼 -> [ 執行 ] -> 執行結果
說JIT比解釋快,其實說的是“執行編譯后的代碼”比“解釋器解釋執行”要快,并不是說“編譯”這個動作比“解釋”這個動作快。
JIT編譯再怎么快,至少也比解釋執行一次略慢一些,而要得到最后的執行結果還得再經過一個“執行編譯后的代碼”的過程。
所以,對“只執行一次”的代碼而言,解釋執行其實總是比JIT編譯執行要快。
怎么算是“只執行一次的代碼”呢?粗略說,下面兩個條件同時滿足時就是嚴格的“只執行一次”
1、只被調用一次,例如類的構造器(class initializer,())
2、沒有循環
對只執行一次的代碼做JIT編譯再執行,可以說是得不償失。
對只執行少量次數的代碼,JIT編譯帶來的執行速度的提升也未必能抵消掉最初編譯帶來的開銷。
只有對頻繁執行的代碼,JIT編譯才能保證有正面的收益。
編譯的空間開銷
對一般的Java方法而言,編譯后代碼的大小相對于字節碼的大小,膨脹比達到10x是很正常的。同上面說的時間開銷一樣,這里的空間開銷也是,只有對執行頻繁的代碼才值得編譯,如果把所有代碼都編譯則會顯著增加代碼所占空間,導致“代碼爆炸”。
這也就解釋了為什么有些JVM會選擇不總是做JIT編譯,而是選擇用解釋器+JIT編譯器的混合執行引擎。
為何HotSpot虛擬機要實現兩個不同的即時編譯器?
HotSpot虛擬機中內置了兩個即時編譯器:Client Complier和Server Complier,簡稱為C1、C2編譯器,分別用在客戶端和服務端。目前主流的HotSpot虛擬機中默認是采用解釋器與其中一個編譯器直接配合的方式工作。程序使用哪個編譯器,取決于虛擬機運行的模式。HotSpot虛擬機會根據自身版本與宿主機器的硬件性能自動選擇運行模式,用戶也可以使用“-client”或“-server”參數去強制指定虛擬機運行在Client模式或Server模式。
用Client Complier獲取更高的編譯速度,用Server Complier 來獲取更好的編譯質量。為什么提供多個即時編譯器與為什么提供多個垃圾收集器類似,都是為了適應不同的應用場景。
哪些程序代碼會被編譯為本地代碼?如何編譯為本地代碼?
程序中的代碼只有是熱點代碼時,才會編譯為本地代碼,那么什么是熱點代碼呢?
運行過程中會被即時編譯器編譯的“熱點代碼”有兩類:
1、被多次調用的方法。
2、被多次執行的循環體。
兩種情況,編譯器都是以整個方法作為編譯對象。 這種編譯方法因為編譯發生在方法執行過程之中,因此形象的稱之為棧上替換(On Stack Replacement,OSR),即方法棧幀還在棧上,方法就被替換了。
如何判斷方法或一段代碼或是不是熱點代碼呢?
要知道方法或一段代碼是不是熱點代碼,是不是需要觸發即時編譯,需要進行Hot Spot Detection(熱點探測)。
目前主要的熱點探測方式有以下兩種:
(1)基于采樣的熱點探測
采用這種方法的虛擬機會周期性地檢查各個線程的棧頂,如果發現某些方法經常出現在棧頂,那這個方法就是“熱點方法”。這種探測方法的好處是實現簡單高效,還可以很容易地獲取方法調用關系(將調用堆棧展開即可),缺點是很難精確地確認一個方法的熱度,容易因為受到線程阻塞或別的外界因素的影響而擾亂熱點探測。
(2)基于計數器的熱點探測
采用這種方法的虛擬機會為每個方法(甚至是代碼塊)建立計數器,統計方法的執行次數,如果執行次數超過一定的閥值,就認為它是“熱點方法”。這種統計方法實現復雜一些,需要為每個方法建立并維護計數器,而且不能直接獲取到方法的調用關系,但是它的統計結果相對更加精確嚴謹。
HotSpot虛擬機中使用的是哪鐘熱點檢測方式呢?
在HotSpot虛擬機中使用的是第二種——基于計數器的熱點探測方法,因此它為每個方法準備了兩個計數器:方法調用計數器和回邊計數器。在確定虛擬機運行參數的前提下,這兩個計數器都有一個確定的閾值,當計數器超過閾值溢出了,就會觸發JIT編譯。
方法調用計數器
顧名思義,這個計數器用于統計方法被調用的次數。
當一個方法被調用時,會先檢查該方法是否存在被JIT編譯過的版本,如果存在,則優先使用編譯后的本地代碼來執行。如果不存在已被編譯過的版本,則將此方法的調用計數器值加1,然后判斷方法調用計數器與回邊計數器值之和是否超過方法調用計數器的閾值。如果超過閾值,那么將會向即時編譯器提交一個該方法的代碼編譯請求。
如果不做任何設置,執行引擎并不會同步等待編譯請求完成,而是繼續進行解釋器按照解釋方式執行字節碼,直到提交的請求被編譯器編譯完成。當編譯工作完成之后,這個方法的調用入口地址就會系統自動改寫成新的,下一次調用該方法時就會使用已編譯的版本。
回邊計數器
它的作用就是統計一個方法中循環體代碼執行的次數,在字節碼中遇到控制流向后跳轉的指令稱為“回邊”。
如何編譯為本地代碼?
Server Compiler和Client Compiler兩個編譯器的編譯過程是不一樣的。
對Client Compiler來說,它是一個簡單快速的編譯器,主要關注點在于局部優化,而放棄許多耗時較長的全局優化手段。
而Server Compiler則是專門面向服務器端的,并為服務端的性能配置特別調整過的編譯器,是一個充分優化過的高級編譯器。
參考
《深入理解Java虛擬機》
http://blog.csdn.net/u010412719/article/details/47008717
https://zhuanlan.zhihu.com/p/19977592
http://www.zhihu.com/question/37389356/answer/73820511
動靜強弱語言
U2FsdGVkX19DIYSKuRjb10dzlQ4sTEZlpXLuUIlL0amsxPS2dMjwMcrjPWRlkpVd
pOHzGO6jUx/MpVLUrhfuG78uz/r7GfzZtAZogWgCXhybMpqBzdawvMLouwgAJREa
7epPCq7Xo17u7MLMccUZal+qkZ8F554SRTZbSZ/szoNPt1fKiRhNUxzVNQTO36Fm
LH32nh/EzEgtHRchiM+y3tYxIc8zkQgVz5yA6HiFbj2zp2Bbu6kFPH7rs2b2cvj7
X8Pvrqqw86viNGeO8qHbO1X7UV0wSmewhLy9mv4lRo+cu1pwGEsgzeo1L1qabp4f
RpibGtSay6BxMark1XuxOwKqam6Kolf5l0CnO3TIxlKYTEC8ii4iFfY6tlYUZoIN
W/C5xSbEcprMyJ3ZtNxWJsTbpKz9XtTOsLaQLScpEjrltMs4e2aRA5p+ezNPAqdG
RtKVeqzxmKP5n2qXoAfI9PaG5RGbcBCo3S+j2AHDNq0PkXfd8scwEWbgtFF8giMV
+E1iy5nEmcSXZ+sHNtJbzGgDpt9iU40yTkVEJcM6T3irCgVlw3ETcEC2+Mr/1gsg
/jguC6mVUGJamQcx1uiIH9/lTbMLcuwkrV9ZJqxwLFM/Ih9lU664mJaNqtJzAjnZ
XkeadCfLFBqAucetUrDZe7+ma7XQl2j5F9lP1bQWGpBxNgQ5CheE2zL/+GSiHFsB
NATxzxz0gkB10xLiOPM/AlS5o739Uj1fp4cSSJDzGSXfcinLsCCyE0TpF/fbmKd/
/7v3BHY6Zx1/WcdQWKUGCL7WL86Hm0bj4zPLRK+2qNzT8JvlffvU8+Vg+duuetNj
Y5p0K7bSNw1b/nUmysqqmrazGqLTbU8y181jWjVF+bbtrFSX9Ha2RL3Zf5it6ZRq
8/k7/2hbvVsfg9yZcwjaCqnainYD0xL6LxmxIlUX5vrNpm7oAhYOnGIjSq3ZGbWK
ZgObOyUzr/M/xjprjucKBsBbSMtSMa2Z0WbUnQpV3fAU0gOOuKMyz9MP3/f/TRuk
61cDSto79ki4dKiF9fDxrACOzlfQzCzmMygq1o637mscg7NGYi1ykMmWGtS6FB/Z
KmB3WIuG+HgZ7rcq1BVijl1tE3/6/IwKzGi20TNTLiaPYH8Wi+PiVIFYUcg0b1nD
Avgq3D0himzerzFDlOfDKv2BetiDL8wq6Yj7/l1bmPV8FuHkGIaElZfIGTGJ3Sei
dJXqMt501wgfWjgExON1Dx7aGeYVRPdQDNMOtybEbdLPcvdg+lGxnaO2ISU5zUl2
hViaq5/d47d4xCqMPEavWVCVWNSW31b3vyWujwxZ3leIBMJvLLTf+APGlol3W/la
m8I6M4iWlnZEfEHpaStq8FYSVhYIIN8t55SwVZJRRd53nQhl/GJl2Jq3SAi5LwWB
WDhG5vUuhwt0Hlv3GzFjXOtdQXrw4bb+emglXjTe16BxdSzNXvESDHN2vBlby/Ln
h8rQjBtrG3OUK5fAIxQ7QpBzevOrP3FZPc1JxNVFluaTz0CMVA+k5rH7IwaReu9D
E0HhDM5IpBlIlm/m4v1OkEESJX0TnQQgnvHeJe6KGkRgX8kg0u1tW5wTivchdNPT
j7l+rZdmhYSjTSXZJju9gWko/6/JKUCrrIBZGJMqNnL0IOs9iakJeds9GAclllZb
HYgP7+PF5Lo9iZDJUE7NUlESlZ+7VuJgwz/gKl/4uUrouD+EHoIE2GyeT/1Zlx2w
gIndsn9O+ZMPbysqIZMfiz+CGRdoe/zjCuuTOlbj7P4ncu6RclUHNRFuhdjphvBN
JWQv+N59PC+sVC12MHWZxs3PQb3gk8E6omyuXkNt1UbEE3Rnx7hsAP59+iRsIpG7
YngkYqQfaysSllpZNNhet/r9O2w8YGf1T8/kH7i7Fe5wEUPbB9KcEAp3JBNcuMPk
ED9ajUkSASOrrgsNhg23H5MRT2DGmRFsVkNPRM29yg1s8DO/IriruXHKHXVriXU2
RFgFLuqc9VuSZtZfyGhCokvy4KkzdMezWyOn9jZ2zFLUpIDw9wrZYjR4eS47BznI
ymg8yIDCa2PUADZd4dw1IU5iKxPvk8f65LYElAzvgVNlJASpUJF75whiLyHXDOrB
NxFmRwG0hPfmy+WCGtVmOsdwx5MpvSNomXr6lL0r1MIVuQz1aRvN7eM2CMEARlQj
vdhmc1CjkhhhcpA81WuRHnHlx1EFjBQbjtleghM8gRtlmkB3RhEh5cTK4R9mhX5I
DLmU2WFOfbsirmVeCi3+i1Be/mVUiyUHFKtXnqdSOcko2Mllj6TKO161blLI8JPh
RFmvzdNjc7hIDAb+KtwF73ClY+vtESs0c0+scCrqaJdSe9cgqjXEzEcfdy1Ph3XH
Y8Ma7iwh3mat4jOGa0B/gDsYLtQJdiCMt5KewBpEG9ilubj32rCYCVvdcqIfJiit
RkMUCp8nf9KQa9RnS0+t1gQ7QupMwDB4RLsQUPuLBrPp4MNUprxqTJlJxqe1nv7s
xeQXFrWFx46aHvsfaiYC4X5Q4glSRAkLzDSld/oTC+hxJ/TOvnOUuaQWVMjJLVc6
ie2KG3XDgeCrGUqeRlV1jmeZfYDAPe1soQFR+tu6Z/f5EDhj4dgj3wZcjj+zwpXa
zLkk87zf5VG5E8v5bBoOZfmaOC4LwecyDXfbyWx/bDcT60SPx2vJjDbJtgEj+feI
FPic1aVSmBAjAcpYeF6O/R+LBnGbMnANKYYqb2QQLvHkl35pE2MU2K9z8vQhjiXm
O/lduPI8DOGNxb9il0TqceFVxqhpf7x/yZ3AbWdpwfAnSFX1fzv4PQs6Z5vA7H5/
XB01IhXhx46r4h4xa+8ToFpLDYb24Y2TWWseapXRaVXz/qZfiVtm8a1+iGrgy8T9
B6Q7DAo39kQqTowmGj9q2Oeg1JUH5K4orO7DYuHMo+taPx/2JkDCzmT+fft/T47z
jyd5ZQV3DuNsqWWut6JVgVOyUtNYNMybwITCdOVzT988lrrdEhawNK1NuKJwXgMT
2ZcXdJPNyC0OsjkefLQsGtDPatIGgvWyf0LBZ8S/pncCwvF++zf3vv4/Dzy00BsB
G3ttE+8e1xx39AJiuwFn94tVv6Pssu39rXP2HiWyilt+P9q8fRfDe32Xe+I0b0ea
z9mA/LIYYl5Tes5itQr3VDIK+3+evfXFGcInMHcjw1eWUk8PyVSKvdKV/cwktyu7
8yJ1rqJgr/JN3GMzK07Qlek3dlt3aB3TxUKJkaF6PxbzkpcKKAErqehYIk8E9M1W
xTJKZxfZ6W8OrCg1CwePap5lyUZ+9pJ0pMLbGvlP8++RVV2FZY9NwC0+mMY0PEOl
oWSF0gqoBuAXjQS+wp+8DHQRH+otAAw0XZ6p685E5lUekf2hArLecM2UI5DG89yj
jVsIxrpOWd1l0MvZ+QCxqklokWisjTpx8NmEJ3PeKh5o93LEKVTF72sfMpjUp+Zh
qRi6bM146cNvoR9GG9LuGDn6GgkmwI9Ib2yxyYPswOhzPniTW0KlV3mU+J+9hRoJ
NvcctyogzG13bmtAuwbWKSVvl/iYb3PNIu3ysYL91mxdBaaAZU9h88W61jk3qvrN
BwlJwtYxhGeXU7MmHrpuHHOcarbzmdduyRqK+syUXahqLsnlSSDADb3sgmw+cvnr
7Jdb0JonqBRexlfIEF21SNekD5Q8+5BtAHzP40/7EQVicfMlVvjrqzmZJiZLqe5L
FaVllbvoOVFXGD1jDrsGLXeJFlD1jrPHw5v0mgSVutj3zFqHZ4MCKzRp0PWUx7PT
is+n3SxUCHKYOuAkJzzf3fEgyRrjNjt4oXvzRqUh+Kfd368tPAD64i6TpY+1/eVL
6KE1as/B4pvYlVTuRUzoHQA210B1i+Ku/5vWyLbmhv0=
總結
- 上一篇: 20201130-C语言-重新认识ASC
- 下一篇: win10 悬浮日历_win10系统桌面