自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java編譯器優(yōu)化方法簡介

開發(fā) 后端
編譯器是一個(gè)可將源代碼轉(zhuǎn)化為計(jì)算機(jī)可執(zhí)行代碼的程序。Java編譯器是將Java源代碼轉(zhuǎn)化為Java字節(jié)碼的程序。本文主要介紹優(yōu)化Java編譯器的方法,和大家分享!

你對(duì)Java編譯器優(yōu)化的概念和方法是否熟悉,這里和大家分享一下,Java應(yīng)用程序的編譯過程與靜態(tài)編譯語言(例如C或C++)不同。靜態(tài)編譯器直接把源代碼轉(zhuǎn)換成可以直接在目標(biāo)平臺(tái)上執(zhí)行的機(jī)器代碼,不同的硬件平臺(tái)要求不同的編譯器。Java編譯器把Java源代碼轉(zhuǎn)換成可移植的JVM字節(jié)碼。

兩條編碼準(zhǔn)則與Java編譯器

我們?cè)趯懘a時(shí),常常會(huì)提到兩條原則:

1、方法要盡量短,大方法要分解成小方法;

2、不要重復(fù)發(fā)明輪子。

我們?cè)趶?qiáng)調(diào)這兩個(gè)原則的時(shí)候,往往只關(guān)注的是代碼簡潔、易維護(hù)等方便我們?nèi)说囊蛩?,其?shí)這樣做還可以大大方便Java編譯器優(yōu)化代碼。

Java編譯器優(yōu)化簡介:

Java應(yīng)用程序的編譯過程與靜態(tài)編譯語言(例如C或C++)不同。靜態(tài)編譯器直接把源代碼轉(zhuǎn)換成可以直接在目標(biāo)平臺(tái)上執(zhí)行的機(jī)器代碼,不同的硬件平臺(tái)要求不同的編譯器。Java編譯器把Java源代碼轉(zhuǎn)換成可移植的JVM字節(jié)碼。與靜態(tài)編譯器不同,Javac幾乎不做什么優(yōu)化,在靜態(tài)編譯語言中應(yīng)當(dāng)由編譯器進(jìn)行的優(yōu)化工作,在Java中是在程序執(zhí)行的時(shí)候,由運(yùn)行時(shí)執(zhí)行優(yōu)化。

即時(shí)編譯

對(duì)于證實(shí)概念的實(shí)現(xiàn)來說,解釋是合適的,但是早期的JVM由于太慢。下一代JVM使用即時(shí)(JIT)編譯器來提高執(zhí)行速度。按照嚴(yán)格的定義,基于JIT的虛擬機(jī)在執(zhí)行之前,把所有字節(jié)碼轉(zhuǎn)換成機(jī)器碼,但是以惰性方式來做這項(xiàng)工作:JIT只有在確定某個(gè)代碼路徑將要執(zhí)行的時(shí)候,才編譯這個(gè)代碼路徑(因此有了名稱“即時(shí)編譯”)。這個(gè)技術(shù)使程序能啟動(dòng)得更快,因?yàn)樵陂_始執(zhí)行之前,不需要冗長的編譯階段。

JIT技術(shù)看起來很有前途,但是它有一些不足。

JIT消除了解釋的負(fù)擔(dān)(以額外的啟動(dòng)成本為代價(jià)),但是由于若干原因,代碼的優(yōu)化等級(jí)仍然是一般般。為了避免Java應(yīng)用程序嚴(yán)重的啟動(dòng)延遲,JIT編譯器必須非常迅速,這意味著它無法把大量時(shí)間花在優(yōu)化上。所以,早期的JIT編譯器在進(jìn)行內(nèi)聯(lián)假設(shè)(inliningassumption)方面比較保守,因?yàn)樗鼈儾恢篮竺婵赡芤b入哪個(gè)類。

雖然從技術(shù)上講,基于JIT的虛擬機(jī)在執(zhí)行字節(jié)碼之前,要先編譯字節(jié)碼,但是JIT這個(gè)術(shù)語通常被用來表示任何把字節(jié)碼轉(zhuǎn)換成機(jī)器碼的動(dòng)態(tài)編譯過程——即使那些能夠解釋字節(jié)碼的過程也算。

HotSpot動(dòng)態(tài)編譯

HotSpot執(zhí)行過程組合了編譯、性能分析以及動(dòng)態(tài)編譯。它沒有把所有要執(zhí)行的字節(jié)碼轉(zhuǎn)換成機(jī)器碼,而是先以解釋器的方式運(yùn)行,只編譯“熱門”代碼——執(zhí)行得最頻繁的代碼。當(dāng)HotSpot執(zhí)行時(shí),會(huì)搜集性能分析數(shù)據(jù),用來決定哪個(gè)代碼段執(zhí)行得足夠頻繁,值得編譯。

只編譯執(zhí)行最頻繁的代碼有幾項(xiàng)性能優(yōu)勢:沒有把時(shí)間浪費(fèi)在編譯那些不經(jīng)常執(zhí)行的代碼上;這樣,編譯器就可以花更多時(shí)間來優(yōu)化熱門代碼路徑,因?yàn)樗涝谶@上面花的時(shí)間物有所值。而且,通過延遲編譯,編譯器可以訪問性能分析數(shù)據(jù),并用這些數(shù)據(jù)來改進(jìn)優(yōu)化決策,例如是否需要內(nèi)聯(lián)某個(gè)方法調(diào)用。

為了讓事情變得更復(fù)雜,HotSpot提供了兩個(gè)Java編譯器:客戶機(jī)編譯器和服務(wù)器編譯器。默認(rèn)采用客戶機(jī)編譯器;在啟動(dòng)JVM時(shí),您可以指定-server開關(guān),選擇服務(wù)器編譯器。服務(wù)器編譯器針對(duì)***峰值操作速度進(jìn)行了優(yōu)化,適用于需要長期運(yùn)行的服務(wù)器應(yīng)用程序??蛻魴C(jī)編譯器的優(yōu)化目標(biāo),是減少應(yīng)用程序的啟動(dòng)時(shí)間和內(nèi)存消耗,優(yōu)化的復(fù)雜程度遠(yuǎn)遠(yuǎn)低于服務(wù)器編譯器,因此需要的編譯時(shí)間也更少。

HotSpot服務(wù)器編譯器能夠執(zhí)行各種樣的類。它能夠執(zhí)行許多靜態(tài)編譯器中常見的標(biāo)準(zhǔn)優(yōu)化,例如代碼提升(hoisting)、公共的子表達(dá)式清除、循環(huán)展開(unrolling)、范圍檢測清除、死代碼清除、數(shù)據(jù)流分析,還有各種在靜態(tài)編譯語言中不實(shí)用的優(yōu)化技術(shù),例如虛方法調(diào)用的聚合內(nèi)聯(lián)。

持續(xù)重新編譯

HotSpot技術(shù)另一個(gè)有趣的方面是:編譯不是一個(gè)全有或者全無(all-or-nothing)的命題。在解釋代碼路徑一定次數(shù)之后,會(huì)把它重新編譯成機(jī)器碼。但是JVM會(huì)繼續(xù)進(jìn)行性能分析,而且如果認(rèn)為代碼路徑特別熱門,或者未來的性能分析數(shù)據(jù)認(rèn)為存在額外的優(yōu)化可能,那么還有可能用更高一級(jí)的優(yōu)化重新編譯代碼。JVM在一個(gè)應(yīng)用程序的執(zhí)行過程中,可能會(huì)把相同的字節(jié)碼重新編譯許多次。為了深入了解編譯器做了什么,可以-XX:+PrintCompilation標(biāo)志調(diào)用JVM,這個(gè)標(biāo)志會(huì)使編譯器(客戶機(jī)或服務(wù)器)每次運(yùn)行的時(shí)候打印一條短消息。

棧上(On-stack)替換

HotSpot開始的版本編譯的時(shí)候每次編譯一個(gè)方法。如果某個(gè)方法的累計(jì)執(zhí)行次數(shù)超過指定的循環(huán)迭代次數(shù)(在HotSpot的***版中,是10,000次),那么這個(gè)方法就被當(dāng)作熱門方法,計(jì)算的方式是:為每個(gè)方法關(guān)聯(lián)一個(gè)計(jì)數(shù)器,每次執(zhí)行一個(gè)后向分支時(shí),就會(huì)遞增計(jì)數(shù)器一次。但是,在方法編譯之后,方法調(diào)用并沒有切換到編譯的版本,需要退出并重新進(jìn)入方法,后續(xù)調(diào)用才會(huì)使用編譯的版本。

結(jié)果就是,在某些情況下,可能永遠(yuǎn)不會(huì)用到編譯的版本,例如對(duì)于計(jì)算密集型程序,在這類程序中所有的計(jì)算都是在方法的一次調(diào)用中完成的。重量級(jí)方法可能被編譯,但是編譯的代碼永遠(yuǎn)用不到。

HotSpot最近的版本采用了稱為棧上(on-stack)替換(OSR)的技術(shù),支持在循環(huán)過程中間,從解釋執(zhí)行切換到編譯的代碼(或者從編譯代碼的一個(gè)版本切換到另一個(gè)版本)。

從Java編譯、執(zhí)行優(yōu)化的原理可以看出,編譯器會(huì)將“熱門代碼塊”、“熱門方法”持續(xù)優(yōu)化,以提高性能,再回顧我們常常強(qiáng)調(diào)的兩個(gè)原則:

1、盡量寫小方法。小方法意味著功能單一、重用性高,自然會(huì)被很多地方用到,容易變成“熱門方法”。

2、不重復(fù)發(fā)明輪子,盡量用已存在的輪子。大家共用一個(gè)“輪子”,自然就是“熱門”輪子,Java編譯器會(huì)知道這個(gè)輪子要好好優(yōu)化,讓他賺的更快。

希望對(duì)你有幫助。

【編輯推薦】

  1. Java編譯器命令行功能
  2. 分享Java連接各種數(shù)據(jù)庫的實(shí)例
  3. 常見的十四種Java開發(fā)工具的特點(diǎn)
  4. JavaScript開發(fā)規(guī)范要求
  5. JavaBean中使用JDBC方式進(jìn)行事務(wù)處理
責(zé)任編輯:于鐵 來源: 比特網(wǎng)
相關(guān)推薦

2010-09-16 15:57:25

Java編譯器

2009-05-05 09:55:10

Javastring對(duì)象

2022-02-23 13:31:26

RVO編譯器優(yōu)化

2021-10-09 12:08:23

Facebook編譯器機(jī)器學(xué)習(xí)

2023-11-15 17:58:58

C++代碼

2010-01-13 17:12:26

C++編譯器

2010-02-23 15:44:24

Python編輯器

2023-04-14 10:40:45

工具編譯器優(yōu)化

2010-09-16 16:05:24

Java編譯器

2010-01-18 10:34:21

C++編譯器

2009-12-11 15:38:40

VS2008編譯器

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2010-01-21 09:11:38

C++編譯器

2023-03-26 20:39:01

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2022-08-02 08:11:41

監(jiān)控埋點(diǎn)埋點(diǎn)方式插樁

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發(fā)者
點(diǎn)贊
收藏

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