java性能優(yōu)化權(quán)威指南

image.png

常用的監(jiān)控指令
監(jiān)控線(xiàn)程上下文切換 pidstat -w -I -p 9391 5 解釋?zhuān)? pidstat -w每5秒監(jiān)控進(jìn)程id為9391的java應(yīng)用

下面估計(jì)上下文切換鎖浪費(fèi)的時(shí)鐘周期。處理器為3.0GHZ 雙核
pidstat -w 顯示系統(tǒng)每秒大約發(fā)生3500個(gè)上下文切換。每個(gè)虛擬處理器的上下文切換為3500/2-1750,耗費(fèi)的時(shí)鐘周期為1750*8000=140000000,3ghz cpu每秒的時(shí)鐘周期數(shù)為3000000000.因此上下文切換浪費(fèi)的時(shí)鐘周期為
14000000/3000000000=4.7%.再次應(yīng)用一般性準(zhǔn)則(即讓步時(shí)鐘周期占用3-5%或者更多的時(shí)鐘周期),說(shuō)明java引用正面鎖競(jìng)爭(zhēng)。P25

2.4.8監(jiān)控?fù)屨际缴舷挛那袚Q
主動(dòng)切換和 被動(dòng)切換

2.4.9 監(jiān)控線(xiàn)程遷移
待運(yùn)行線(xiàn)程在處理器之間的遷移也會(huì)導(dǎo)致性能下降。大多數(shù)操作系統(tǒng)的CPU調(diào)度程序會(huì)將代運(yùn)行線(xiàn)程分配給上次運(yùn)行它的虛擬處理器。遷移線(xiàn)程會(huì)造成性能影響是因?yàn)樾碌奶摂M處理器緩存中沒(méi)有代運(yùn)行線(xiàn)程所需的數(shù)據(jù)或狀態(tài)信息。減少遷移的策略是創(chuàng)建處理器組并將java應(yīng)用分配給這些處理器組。一般性的準(zhǔn)則是,如果橫跨多個(gè)核或虛擬處理器的java引用每秒遷移超過(guò)500次,將java應(yīng)用綁定在處理器組上就有好處。

2.5 網(wǎng)絡(luò)I/O使用率
2.5.2 Linux 監(jiān)控網(wǎng)絡(luò)I/O使用率

image.png

2.6磁盤(pán)I/O利用率
iostat -xm 5

第3章
JVM 概覽
hotspot VM運(yùn)行時(shí):命令行選項(xiàng)解析、VM生命周期的管理、類(lèi)加載、字節(jié)碼解釋、異常處理、同步、線(xiàn)程管理、java本地接口、VM知名錯(cuò)誤處理和c++堆管理
啟動(dòng)步驟:p43

3.2.8 同步
HotSpot VM用monitor對(duì)象來(lái)保障線(xiàn)程運(yùn)行代碼之間的互斥。java的monitor對(duì)象可以鎖定或者解鎖,但任何時(shí)刻只能有一個(gè)線(xiàn)程擁有該monitor對(duì)象,只有獲得Monitor對(duì)象的所有權(quán)后,線(xiàn)程才可以進(jìn)入它鎖保護(hù)的臨界區(qū),Java中臨界區(qū)由同步快(Synchronzed Block)表示

VM吸收了非競(jìng)爭(zhēng)和競(jìng)爭(zhēng)性同步操作的先進(jìn)技術(shù),jdk1.5引入偏向鎖(命令行-XX:+UseBiasedLocking)、最好情況下成本甚至為零。既然大多數(shù)對(duì)象在其生命期中最多只會(huì)被一個(gè)線(xiàn)程鎖住,那就可以開(kāi)啟-XX:+UseBiasedLocking允許線(xiàn)程自身使用偏向鎖。一旦開(kāi)啟偏向鎖,該線(xiàn)程不需要借助昂貴的原子指令就可以對(duì)該對(duì)象進(jìn)行鎖定和解鎖了。
大多數(shù)HotSpot VM 同步操作使用稱(chēng)為fast-path代碼,hotspot VM 有兩個(gè)JIT編譯器和一個(gè)解釋器,它們都可以稱(chēng)為fast-path代碼,C1-----clientJIT編譯器和C2-------- -ServerJIT編譯器。 C1和C2在同步點(diǎn)時(shí)都可以直接生成fast-path代碼,沒(méi)有競(jìng)爭(zhēng)時(shí),同步操作通常全部在fast-path代碼中完成。,然而需要阻塞或者喚醒線(xiàn)程(分別是monitor-enter 或者monitor-exit狀態(tài)),fast-path代碼將第阿勇slow-path代碼。slow-path代碼由c++實(shí)現(xiàn),而-fast-path代碼則是JIT編譯器產(chǎn)生機(jī)器代碼。

HotSpot vm內(nèi)部表示java對(duì)象的第一個(gè)字(word),包括了java對(duì)象的同步狀態(tài)編碼,通常稱(chēng)為標(biāo)記字(mark word)為了節(jié)約空間,標(biāo)記字會(huì)根據(jù)不同的狀態(tài),服用存儲(chǔ)空間,包含其他的同步元數(shù)據(jù)。

3.2.12 VM致命錯(cuò)誤處理

OutOfMemoryError

HotSpot VM 生成的錯(cuò)誤信息中包含了棧的最終信息,此外還引入了-XX:OnOutOfMemoryError=<cmd> 所以當(dāng)拋出第一個(gè)OutOfMemoryError時(shí),可以執(zhí)行一條命令,另一個(gè)值得提及的有用的特性是,當(dāng)OutOfMemoryError出現(xiàn)時(shí)候可以生成堆的轉(zhuǎn)存信息。指定-XX:HeapDumpOnOutMemory可以開(kāi)啟的這個(gè)特性。另外一個(gè)HotSpot VM 命令行選項(xiàng) -XX:HeapDump- Path=<pathname>可讓用戶(hù)指定堆轉(zhuǎn)儲(chǔ)的存放路徑。

退出發(fā)送 SIGOUIT信號(hào)給java進(jìn)程id也可以得到同樣的效果。基于線(xiàn)程的棧追蹤信息,可以分析死鎖根源,自帶的JConsole工具添加了一項(xiàng)功能,可以聯(lián)系到一個(gè)掛起的java進(jìn)程并分析死鎖的根源。多數(shù)情況下,死鎖是由于獲取鎖的順序錯(cuò)誤鎖導(dǎo)致的

minor GC

重要的HotSpot VM 選項(xiàng)

-client
-server
-d64 加載64位hotspot VM而不是默認(rèn)的32位hotspot VM
當(dāng)堆內(nèi)存需要32G以上的時(shí)候采用該選項(xiàng),-Xmx -Xms 小于32G時(shí),該選項(xiàng)要與-XX+UseCompressedOops聯(lián)合使用 jdk6 后默認(rèn)開(kāi)啟

java引用的長(zhǎng)度從32位增加到64位,這給64位JVM帶來(lái)了性能損失。長(zhǎng)度的增加使得緩存行中可容納的oops(普通對(duì)象指針)變少----因?yàn)?4地址長(zhǎng)度變大 直接導(dǎo)致實(shí)際數(shù)據(jù)存儲(chǔ)量的下降,CPU高速緩存的效率也降低。

-xms<n>[g|m|k] 默認(rèn)堆
-xmx<n>[g|m|k] 最大堆
-XX:NewSize=<n>[g|m|k]最小新生代
-XX:MaxNewSize=<n>[g|m|k]最大
-Xmn<n>[g|m|k]同時(shí)設(shè)置新生代的初始,最小和最大尺寸
-XX:NewRatio=<n>新生代和老年代的尺寸比例 n默認(rèn)為3 比例為1:3
-XX:PermSize=<n>[g|m|k]
-XX:MaxPermSize=<n>[g|m|k]
-XX:SurvivorRatio=n 單塊Survivor區(qū)和Eden區(qū)大小比例
。。。P416

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,024評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,285評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,548評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,328評(píng)論 6 404
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,878評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,098評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,616評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,554評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,725評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,971評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,361評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,613評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,339評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,695評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容