一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 淺談Java程序運(yùn)行機(jī)制及錯(cuò)誤分析

淺談Java程序運(yùn)行機(jī)制及錯(cuò)誤分析

2021-01-10 11:26Iceflame Java教程

這篇文章主要主要介紹了Java虛擬機(jī)(JVM)的有關(guān)內(nèi)容以及Java程序的運(yùn)行機(jī)制和錯(cuò)誤分析,需要的朋友可以了解下。

JVM(Java虛擬機(jī))一種用于計(jì)算設(shè)備的規(guī)范,可用不同的方式(軟件或硬件)加以實(shí)現(xiàn)。編譯虛擬機(jī)的指令集與編譯微處理器的指令集非常類似。Java虛擬機(jī)包括一套字節(jié)碼指令集、一組寄存器、一個(gè)棧、一個(gè)垃圾回收堆和一個(gè)存儲(chǔ)方法域。

       Java虛擬機(jī)(JVM)是可運(yùn)行Java代碼的假想計(jì)算機(jī)。只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計(jì)算機(jī)上,就能保證經(jīng)過(guò)編譯的任何Java代碼能夠在該系統(tǒng)上運(yùn)行。

1.為什么要使用Java虛擬機(jī)

      Java語(yǔ)言的一個(gè)非常重要的特點(diǎn)就是與平臺(tái)的無(wú)關(guān)性。而使用Java虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。一般的高級(jí)語(yǔ)言如果要在不同的平臺(tái)上運(yùn)行,至少需要編 譯成不同的目標(biāo)代碼。而引入Java語(yǔ)言虛擬機(jī)后,Java語(yǔ)言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語(yǔ)言使用模式Java虛擬機(jī)屏蔽了與具體平臺(tái) 相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。Java虛擬機(jī)在執(zhí)行字 節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。

Java運(yùn)行機(jī)制

Java程序的運(yùn)行必須經(jīng)過(guò)編寫 、編譯 、運(yùn)行 三個(gè)步驟。

編寫是指在Java開(kāi)發(fā)環(huán)境中進(jìn)行程序代碼的輸入,最終形成后綴名為.java的Java源文件。

編譯是指使用Java編譯器對(duì)源文件進(jìn)行錯(cuò)誤排查的過(guò)程,編譯后將生成后綴名為.class的字節(jié)碼文件,這不像C語(yǔ)言那樣最終生成可執(zhí)行文件。

運(yùn)行是指使用Java解釋器將字節(jié)碼文件翻譯成機(jī)器代碼,執(zhí)行并顯示結(jié)果

字節(jié)碼文件是一種和任何具體機(jī)器環(huán)境及操作系統(tǒng)環(huán)境無(wú)關(guān)的中間代碼,它是一種二進(jìn)制文件,是Java源文件由Java編譯器編譯后生成的目標(biāo)代碼文件。編程人員和計(jì)算機(jī)都無(wú)法直接讀懂字節(jié)碼文件,它必須由專用的Java解釋器來(lái)解釋執(zhí)行,因此Java是一種在編譯基礎(chǔ)上進(jìn)行解釋運(yùn)行的語(yǔ)言。

Java解釋器負(fù)責(zé)將字節(jié)碼文件翻譯成具體硬件環(huán)境和操作系統(tǒng)平臺(tái)下的機(jī)器代碼,以便執(zhí)行。因此Java程序不能直接運(yùn)行在現(xiàn)有的操作系統(tǒng)平臺(tái)上,它必須運(yùn)行在被稱為Java虛擬機(jī)的軟件平臺(tái)之上。

Java虛擬機(jī)(JVM)是運(yùn)行Java程序的軟件環(huán)境,Java解釋器就是Java虛擬機(jī)的一部分。在運(yùn)行Java程序時(shí),首先會(huì)啟動(dòng)JVM,然 后由它來(lái)負(fù)責(zé)解釋執(zhí)行Java的字節(jié)碼,并且Java字節(jié)碼只能運(yùn)行于JVM之上。這樣利用JVM就可以把Java字節(jié)碼程序和具體的硬件平臺(tái)以及操作系 統(tǒng)環(huán)境分隔開(kāi)來(lái),只要在不同的計(jì)算機(jī)上安裝了針對(duì)于特定具體平臺(tái)的JVM,Java程序就可以運(yùn)行,而不用考慮當(dāng)前具體的硬件平臺(tái)及操作系統(tǒng)環(huán)境,也不用 考慮字節(jié)碼文件是在何種平臺(tái)上生成的。JVM把這種不同軟硬件平臺(tái)的具體差別隱藏起來(lái),從而實(shí)現(xiàn)了真正的二進(jìn)制代碼級(jí)的跨平臺(tái)移植。JVM是Java平臺(tái) 無(wú)關(guān)的基礎(chǔ),Java的跨平臺(tái)特性正是通過(guò)在JVM中運(yùn)行Java程序?qū)崿F(xiàn)的。

Java語(yǔ)言這種“一次編寫,到處運(yùn)行(write once,run anywhere)”的方式,有效地解決了目前大多數(shù)高級(jí)程序設(shè)計(jì)語(yǔ)言需要針對(duì)不同系統(tǒng)來(lái)編譯產(chǎn)生不同機(jī)器代碼的問(wèn)題,即硬件環(huán)境和操作平臺(tái)的異構(gòu)問(wèn)題,大大降低了程序開(kāi)發(fā)、維護(hù)和管理的開(kāi)銷。

需要注意的是,Java程序通過(guò)JVM可以達(dá)到跨平臺(tái)特性,但JVM是不跨平臺(tái)的。也就是說(shuō),不同操作系統(tǒng)之上的JVM是不同的,Windows平臺(tái)之上的JVM不能用在Linux上面,反之亦然。

JAVA程序運(yùn)行錯(cuò)誤分析

一般來(lái)說(shuō),一個(gè)已經(jīng)投入運(yùn)營(yíng)的大型項(xiàng)目出現(xiàn)問(wèn)題的可能最多如下幾種情況:

1.異常的CPU使用

1)查看CPU使用率,與目標(biāo)進(jìn)程的使用情況,再查看每個(gè)內(nèi)核的使用情況。可以輔助定位是單個(gè)線程問(wèn)題或線程池問(wèn)題。

2)有時(shí),程序在正常一段時(shí)間后,突然CPU垂直升高,那么可能與程序內(nèi)的鎖有關(guān)(如果鎖持有的時(shí)間很短,不如試試cas+yield來(lái)實(shí)現(xiàn)自旋鎖)

3)死鎖,直接導(dǎo)出調(diào)用棧,尋找問(wèn)題解決。

2.異常的內(nèi)存

1)內(nèi)存泄漏,沒(méi)什么好說(shuō)的,dump出堆棧查找問(wèn)題

2)頻繁的GC也會(huì)導(dǎo)致性能不足,在程序經(jīng)常出現(xiàn)GC的情況下,就要注意了,調(diào)高新生代大小如果仍然不能解決則需要定位大量創(chuàng)建臨時(shí)對(duì)象的代碼(可以使用對(duì)象池技術(shù)來(lái)避免內(nèi)存重復(fù)申請(qǐng)的情況)

3.某個(gè)工作線程的意外終止

4.異常的IO

1)查看打開(kāi)文件,IO操作占用,磁盤使用率。可以使用命令 df iostat 等

2)查看是否有程序占用監(jiān)聽(tīng),網(wǎng)絡(luò)使用率,可以使用命令 netstat 等

使用工具分析故障

1.jmap

jmap pid 默認(rèn)查看JAVA進(jìn)程中內(nèi)存使用相關(guān)信息

jmap -histo pid 查看內(nèi)存中活躍的實(shí)例數(shù)量

jmap -dump:format=b,file=(文件名) pid 完整導(dǎo)出java程序內(nèi)存。完整分析分三個(gè)流程,在程序初始化完畢后執(zhí)行一次 jmap -dump:format=b,file=a.bin 然后在內(nèi)存占用開(kāi)始出現(xiàn)上漲的時(shí)候執(zhí)行一次,最后等達(dá)到上限后再執(zhí)行一次,用JHat或者第三方工具來(lái)打開(kāi)dump文件。

3.jstack或者JCONSOLE

默認(rèn) 可以查看進(jìn)程調(diào)用棧信息,用來(lái)分析IO超時(shí),死鎖,或者其他情況。程序出現(xiàn)異常必須要分析的信息,可以輔助問(wèn)題的定位和排除。

jstat -gc pid gaptime 查看GC相關(guān)信息

jstat -compiler pid 查看實(shí)時(shí)編譯信息

4.kill -3

同上,適用于沒(méi)有安裝develop工具的服務(wù)器,可以輸出調(diào)用棧信息和部分GC信息

5.iftop 查看網(wǎng)口
查看網(wǎng)絡(luò)出入流量與目標(biāo)服務(wù)器之間的流量,可以輔助排查是否由攻擊引起的

 pstack 虛擬機(jī)堆棧

需要安裝gdb,一般用于檢查c/c++程序,在某些虛擬機(jī)級(jí)錯(cuò)誤的時(shí)候。

總結(jié)

Java程序的執(zhí)行過(guò)程,必須經(jīng)過(guò)先編譯,后解釋兩個(gè)步驟。有關(guān)Java程序運(yùn)行機(jī)制及錯(cuò)誤分析的介紹就到這里,希望對(duì)大家有所幫助。感興趣的朋友可以參閱本站其他專題,在此希望大家對(duì)本站多多支持。

原文鏈接:https://www.2cto.com/kf/201611/569117.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 狠狠燥 | 久久这里只精品国产99re66 | 色综合久久综合网欧美综合网 | 国产亚洲精品自在线亚洲情侣 | 日本xxwwwxxxx | 亚洲精品免费在线观看 | 欧美国产合集在线视频 | 天生奶水1v1高h | 日韩亚洲欧美一区二区三区 | china精品对白普通话 | 免费观看二十女人一摸是水 | 亚洲美洲国产日产 | 国产日韩欧美在线观看不卡 | 欧美一卡2卡3卡无卡 | 天干夜天天夜天干天ww | 天天摸日日舔 | yellow高清免费观看日本 | 艾秋果冻麻豆老狼 | 四大美女思春艳史片 | 精品无人区麻豆乱码1区2 | 亚洲 日本 中文字幕 制服 | fuqer日本老师 | 草莓在深夜释放自己软件 | chinese456老年gay china外卖员gay帮口 | 亚洲国产精品一区二区三区久久 | 欧美成人aaaa免费高清 | 亚洲天堂视频在线观看免费 | 精品久久综合一区二区 | 国产一区二区视频在线播放 | 香蕉国产精品偷在线播放 | 99热这里只有精品一区二区三区 | 喜欢老头吃我奶躁我的动图 | 国产精品男人的天堂 | 丝袜捆绑调教丨vk | 韩国三级日本三级香港三级黄 | 白鹿扒开内裤露出尿孔 | 欧美日韩久久中文字幕 | 5566中文字幕亚洲精品 | 国产好痛疼轻点好爽的视频 | 啊啊啊好大好爽视频 | 777奇米影视一区二区三区 |