最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年09月25日 11:35:14   作者:Iceflame  
這篇文章主要主要介紹了Java虛擬機(jī)(JVM)的有關(guān)內(nèi)容以及Java程序的運(yùn)行機(jī)制和錯誤分析,需要的朋友可以了解下。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.異常的CPU使用

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

2)有時,程序在正常一段時間后,突然CPU垂直升高,那么可能與程序內(nèi)的鎖有關(guān)(如果鎖持有的時間很短,不如試試cas+yield來實(shí)現(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í)例數(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 查看實(shí)時編譯信息

4.kill -3

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

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

 pstack 虛擬機(jī)堆棧

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

總結(jié)

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

相關(guān)文章

  • JAVA中JNI的簡單使用分享

    JAVA中JNI的簡單使用分享

    這篇文章介紹了JAVA中JNI的簡單使用,有需要的朋友可以參考一下
    2013-10-10
  • Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟

    Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟

    本文主要介紹了Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟,首先介紹eclipse開發(fā)JavaWeb項(xiàng)目需要配置的相關(guān)環(huán)境,使用tomcat軟件在本地搭建服務(wù)器,然后再在eclipse環(huán)境下配置tomcat,感興趣的可以了解一下
    2021-08-08
  • SSM框架把日志信息保存到數(shù)據(jù)庫過程詳解

    SSM框架把日志信息保存到數(shù)據(jù)庫過程詳解

    這篇文章主要介紹了SSM框架把日志信息保存到數(shù)據(jù)庫過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java HashMap的工作原理

    Java HashMap的工作原理

    這篇文章主要介紹了Java HashMap的工作原理的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • mybatis Reflector反射類的具體使用

    mybatis Reflector反射類的具體使用

    Reflector類是MyBatis反射模塊的核心,負(fù)責(zé)處理類的元數(shù)據(jù),以實(shí)現(xiàn)屬性與數(shù)據(jù)庫字段之間靈活映射的功能,本文主要介紹了mybatis Reflector反射類的具體使用,感興趣的可以了解一下
    2024-02-02
  • 關(guān)于Mybatis實(shí)體別名支持通配符掃描問題小結(jié)

    關(guān)于Mybatis實(shí)體別名支持通配符掃描問題小結(jié)

    MyBatis可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄,這篇文章主要介紹了Mybatis實(shí)體別名支持通配符掃描的問題,需要的朋友可以參考下
    2022-01-01
  • Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法

    Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法

    今天小編就為大家分享一篇Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • springboot集成elasticsearch7的圖文方法

    springboot集成elasticsearch7的圖文方法

    本文記錄springboot集成elasticsearch7的方法,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-05-05
  • 淺析java中遍歷map的兩種方式

    淺析java中遍歷map的兩種方式

    本篇文章主要分享了java中遍歷map的兩種方式,代碼簡潔明了,有需要的朋友可以參考下,希望會有所幫助
    2016-12-12
  • Spring?Boot使用MyBatis進(jìn)行兩個表的關(guān)聯(lián)

    Spring?Boot使用MyBatis進(jìn)行兩個表的關(guān)聯(lián)

    本文主要介紹了Spring?Boot使用MyBatis進(jìn)行兩個表的關(guān)聯(lián),通過實(shí)例演示了如何使用MyBatis的XML映射文件和注解實(shí)現(xiàn)關(guān)聯(lián)操作,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

贵南县| 甘孜县| 涪陵区| 进贤县| 桓台县| 禹城市| 中阳县| 吉木萨尔县| 乌拉特前旗| 五台县| 阿瓦提县| 宁晋县| 西峡县| 察哈| 凤庆县| 大竹县| 普陀区| 东城区| 大悟县| 千阳县| 桦甸市| 延吉市| 察雅县| 重庆市| 全州县| 雅安市| 湖北省| 汨罗市| 贵阳市| 五莲县| 淳安县| 将乐县| 承德市| 屯昌县| 讷河市| 武定县| 儋州市| 宁晋县| 万安县| 南投市| 施秉县|