首頁  >  文章  >  Java  >  Java中程式運行機制以及錯誤的分析

Java中程式運行機制以及錯誤的分析

黄舟
黄舟原創
2017-09-26 10:05:011347瀏覽

這篇文章主要主要介紹了Java虛擬機器(JVM)的內容以及Java程式的運作機制和錯誤分析,需要的朋友可以了解下。

JVM(Java虛擬機器)一種用於計算設備的規範,可用不同的方式(軟體或硬體)加以實現。編譯虛擬機器的指令集與編譯微處理器的指令集非常類似。 Java虛擬機器包括一套字節碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個儲存方法域。

       Java虛擬機(JVM)是可運作Java程式碼的假想電腦。只要根據JVM規格描述將解釋器移植到特定的電腦上,就能保證經過編譯的任何Java程式碼能夠在該系統上運作。

1.為什麼要使用Java虛擬機器

      Java語言的一個很重要的特點是與平台的無關。而使用Java虛擬機器是實現此特性的關鍵。一般的高級語言如果要在不同的平台上運行,至少需要編 譯成不同的目標代碼。而引入Java語言虛擬機器後,Java語言在不同平台上執行時不需要重新編譯。 Java語言使用模式Java虛擬機屏蔽了與具體平台相關的資訊,使得Java語言編譯程式只需產生在Java虛擬機上運行的目標碼(字節碼),就可以在多種平台上不加修改地運行。 Java虛擬機在執行字 節碼時,把字節碼解釋成具體平台上的機器指令執行。

Java執行機制

Java程式的運作必須經過編寫 、編譯 、執行 三個步驟。

寫是指在Java開發環境中進行程式碼的輸入,最後形成後綴名為.java的Java原始檔。

編譯是指使用Java編譯器對原始檔案進行錯誤排查的過程,編譯後將產生後綴名為.class的字節碼文件,這不像C語言那樣最終產生可執行文件。

運行是指使用Java解釋器將字節碼檔案翻譯成機器碼,執行並顯示結果

字節碼檔案是一種和任何特定機器環境及作業系統環境無關的中間程式碼,它是一種二進位文件,是Java原始檔由Java編譯器編譯後產生的目標程式碼檔案。程式設計人員和電腦都無法直接讀懂字節碼文件,它必須由專用的Java解釋器來解釋執行,因此Java是一種在編譯基礎上進行解釋運行的語言。

Java解釋器負責將字節碼檔案翻譯成特定硬體環境和作業系統平台下的機器碼,以便執行。因此Java程式不能直接運行在現有的作業系統平台上,它必須運行在被稱為Java虛擬機器的軟體平台之上。

Java虛擬機器(JVM)是​​執行Java程式的軟體環境,Java解譯器就是Java虛擬機器的一部分。 在執行Java程式時,首先會啟動JVM,然 後由它來負責解釋執行Java的字節碼,並且Java字節碼只能運行於JVM之上。這樣利用JVM就可以把Java字節碼程式和具體的硬體平台以及作業系統環境分隔開來,只要在不同的電腦上安裝了針對於特定特定平台的JVM,Java程式就可以運行,而不用考慮目前具體的硬體平台及作業系統環境,也不用考慮字節碼檔案是在何種平台上產生的。 JVM把這種不同軟硬體平台的具體差異隱藏起來,從而實現了真正的二進位代碼級的跨平台移植。 JVM是Java平台 無關的基礎,Java的跨平台特性正是透過在JVM中執行Java程式所實現的。

Java語言這種「一次編寫,到處運行(write once,run anywhere)」的方式,有效地解決了目前大多數高階程式設計語言需要針對不同系統來編譯產生不同機器碼的問題,即硬體環境和操作平台的異質問題,大大降低了程式開發、維護和管理的開銷。

要注意的是,Java程式透過JVM可以達到跨平台特性,但JVM是不跨平台的。也就是說,不同作業系統之上的JVM是不同的,Windows平台之上的JVM不能用在Linux上面,反之亦然。

JAVA程式執行錯誤分析

一般來說,一個已經投入營運的大型專案出現問題的可能最多如下幾種情況:

#1.異常的CPU使用

1)查看CPU使用率,與目標行程的使用情況,再查看每個核心的使用情況。可以輔助定位是單一線程問題或線程池問題。

2)有時,程式在正常一段時間後,突然CPU垂直升高,那麼可能與程式內的鎖有關(如果鎖持有的時間很短,不如試試cas+yield來實現自旋鎖)

3)死鎖,直接導出呼叫棧,尋找問題解決。

2.異常的記憶體

1)記憶體洩漏,沒什麼好說的,dump出堆疊查找問題

2)頻繁的GC也會導致性能不足,在程式經常出現GC的情況下,就要注意了,調高新生代大小如果仍然不能解決則需要定位大量創建臨時對象的代碼(可以使用對象池技術來避免記憶體重複申請的情況)

3.某個工作執行緒的意外終止

##4.異常的IO

1)查看開啟文件,IO操作佔用,磁碟使用率。可以使用指令df iostat 等


2)查看是否有程式佔用監聽,網路使用率,可以使用指令netstat 等


##使用工具分析故障


1.jmap


jmap pid 預設查看JAVA進程中記憶體使用相關資訊


jmap -histo pid 查看記憶體中活躍的實例數量


jmap -dump:format=b,file=(檔案名稱) pid 完整導出java程式記憶體。完整分析分三個流程,在程式初始化完畢後執行一次jmap -dump:format=b,file=a.bin 然後在記憶體佔用開始出現上漲的時候執行一次,最後等達到上限後再執行一次,用JHat或第三方工具來開啟dump檔案。


3.jstack或JCONSOLE


預設 可以檢視進程呼叫堆疊訊息,用來分析IO逾時,死鎖,或是其他情況。程序出現異常必須要分析的訊息,可以輔助問題的定位和排除。


jstat -gc pid gaptime 查看GC相關資訊


jstat -compiler pid 查看即時編譯資訊


4.kill -3


同上,適用於沒有安裝develop工具的伺服器,可以輸出呼叫堆疊資訊與部分GC資訊


5.iftop 檢視網口

檢視網路出入流量與目標伺服器之間的流量,可以輔助排查是否由攻擊引起的



 pstack 虛擬機器堆疊


需要安裝gdb,一般用於檢查c/c++程序,在某些虛擬機級錯誤的時候。

總結#

以上是Java中程式運行機制以及錯誤的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn