本篇文章為大家展示了Java程序運行的機(jī)制是什么,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
曲靖ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
JVM(Java虛擬機(jī))一種用于計算設(shè)備的規(guī)范,可用不同的方式(軟件或硬件)加以實現(xiàn)。編譯虛擬機(jī)的指令集與編譯微處理器的指令集非常類似。Java虛擬機(jī)包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。
Java虛擬機(jī)(JVM)是可運行Java代碼的假想計算機(jī)。只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計算機(jī)上,就能保證經(jīng)過編譯的任何Java代碼能夠在該系統(tǒng)上運行。
1.為什么要使用Java虛擬機(jī)
Java語言的一個非常重要的特點就是與平臺的無關(guān)性。而使用Java虛擬機(jī)是實現(xiàn)這一特點的關(guān)鍵。一般的高級語言如果要在不同的平臺上運行,至少需要編 譯成不同的目標(biāo)代碼。而引入Java語言虛擬機(jī)后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用模式Java虛擬機(jī)屏蔽了與具體平臺 相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。Java虛擬機(jī)在執(zhí)行字 節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機(jī)器指令執(zhí)行。
Java運行機(jī)制
Java程序的運行必須經(jīng)過編寫 、編譯 、運行 三個步驟。
編寫是指在Java開發(fā)環(huán)境中進(jìn)行程序代碼的輸入,最終形成后綴名為.java的Java源文件。
編譯是指使用Java編譯器對源文件進(jìn)行錯誤排查的過程,編譯后將生成后綴名為.class的字節(jié)碼文件,這不像C語言那樣最終生成可執(zhí)行文件。
運行是指使用Java解釋器將字節(jié)碼文件翻譯成機(jī)器代碼,執(zhí)行并顯示結(jié)果
字節(jié)碼文件是一種和任何具體機(jī)器環(huán)境及操作系統(tǒng)環(huán)境無關(guān)的中間代碼,它是一種二進(jìn)制文件,是Java源文件由Java編譯器編譯后生成的目標(biāo)代碼文件。編程人員和計算機(jī)都無法直接讀懂字節(jié)碼文件,它必須由專用的Java解釋器來解釋執(zhí)行,因此Java是一種在編譯基礎(chǔ)上進(jìn)行解釋運行的語言。
Java解釋器負(fù)責(zé)將字節(jié)碼文件翻譯成具體硬件環(huán)境和操作系統(tǒng)平臺下的機(jī)器代碼,以便執(zhí)行。因此Java程序不能直接運行在現(xiàn)有的操作系統(tǒng)平臺上,它必須運行在被稱為Java虛擬機(jī)的軟件平臺之上。
Java虛擬機(jī)(JVM)是運行Java程序的軟件環(huán)境,Java解釋器就是Java虛擬機(jī)的一部分。在運行Java程序時,首先會啟動JVM,然 后由它來負(fù)責(zé)解釋執(zhí)行Java的字節(jié)碼,并且Java字節(jié)碼只能運行于JVM之上。這樣利用JVM就可以把Java字節(jié)碼程序和具體的硬件平臺以及操作系 統(tǒng)環(huán)境分隔開來,只要在不同的計算機(jī)上安裝了針對于特定具體平臺的JVM,Java程序就可以運行,而不用考慮當(dāng)前具體的硬件平臺及操作系統(tǒng)環(huán)境,也不用 考慮字節(jié)碼文件是在何種平臺上生成的。JVM把這種不同軟硬件平臺的具體差別隱藏起來,從而實現(xiàn)了真正的二進(jìn)制代碼級的跨平臺移植。JVM是Java平臺 無關(guān)的基礎(chǔ),Java的跨平臺特性正是通過在JVM中運行Java程序?qū)崿F(xiàn)的。
Java語言這種“一次編寫,到處運行(write once,run anywhere)”的方式,有效地解決了目前大多數(shù)高級程序設(shè)計語言需要針對不同系統(tǒng)來編譯產(chǎn)生不同機(jī)器代碼的問題,即硬件環(huán)境和操作平臺的異構(gòu)問題,大大降低了程序開發(fā)、維護(hù)和管理的開銷。
需要注意的是,Java程序通過JVM可以達(dá)到跨平臺特性,但JVM是不跨平臺的。也就是說,不同操作系統(tǒng)之上的JVM是不同的,Windows平臺之上的JVM不能用在Linux上面,反之亦然。
JAVA程序運行錯誤分析
一般來說,一個已經(jīng)投入運營的大型項目出現(xiàn)問題的可能最多如下幾種情況:
1.異常的CPU使用
1)查看CPU使用率,與目標(biāo)進(jìn)程的使用情況,再查看每個內(nèi)核的使用情況??梢暂o助定位是單個線程問題或線程池問題。
2)有時,程序在正常一段時間后,突然CPU垂直升高,那么可能與程序內(nèi)的鎖有關(guān)(如果鎖持有的時間很短,不如試試cas+yield來實現(xiàn)自旋鎖)
3)死鎖,直接導(dǎo)出調(diào)用棧,尋找問題解決。
2.異常的內(nèi)存
1)內(nèi)存泄漏,沒什么好說的,dump出堆棧查找問題
2)頻繁的GC也會導(dǎo)致性能不足,在程序經(jīng)常出現(xiàn)GC的情況下,就要注意了,調(diào)高新生代大小如果仍然不能解決則需要定位大量創(chuàng)建臨時對象的代碼(可以使用對象池技術(shù)來避免內(nèi)存重復(fù)申請的情況)
3.某個工作線程的意外終止
4.異常的IO
1)查看打開文件,IO操作占用,磁盤使用率。可以使用命令 df iostat 等
2)查看是否有程序占用監(jiān)聽,網(wǎng)絡(luò)使用率,可以使用命令 netstat 等
使用工具分析故障
1.jmap
jmap pid 默認(rèn)查看JAVA進(jìn)程中內(nèi)存使用相關(guān)信息
jmap -histo pid 查看內(nèi)存中活躍的實例數(shù)量
jmap -dump:format=b,file=(文件名) pid 完整導(dǎo)出java程序內(nèi)存。完整分析分三個流程,在程序初始化完畢后執(zhí)行一次 jmap -dump:format=b,file=a.bin 然后在內(nèi)存占用開始出現(xiàn)上漲的時候執(zhí)行一次,最后等達(dá)到上限后再執(zhí)行一次,用JHat或者第三方工具來打開dump文件。
3.jstack或者JCONSOLE
默認(rèn) 可以查看進(jìn)程調(diào)用棧信息,用來分析IO超時,死鎖,或者其他情況。程序出現(xiàn)異常必須要分析的信息,可以輔助問題的定位和排除。
jstat -gc pid gaptime 查看GC相關(guān)信息
jstat -compiler pid 查看實時編譯信息
4.kill -3
同上,適用于沒有安裝develop工具的服務(wù)器,可以輸出調(diào)用棧信息和部分GC信息
5.iftop 查看網(wǎng)口
查看網(wǎng)絡(luò)出入流量與目標(biāo)服務(wù)器之間的流量,可以輔助排查是否由攻擊引起的
pstack 虛擬機(jī)堆棧
需要安裝gdb,一般用于檢查c/c++程序,在某些虛擬機(jī)級錯誤的時候。
上述內(nèi)容就是Java程序運行的機(jī)制是什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。