博客說明



文章所涉及的資料來自互聯(lián)網(wǎng)整理和個(gè)人總結(jié),意在于個(gè)人學(xué)習(xí)和經(jīng)驗(yàn)匯總,如有什么地方侵權(quán),請(qǐng)聯(lián)系本人刪除,謝謝!



簡介

Java" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 什么是Java虛擬機(jī)(JVM)?--------回過頭來看

什么是Java虛擬機(jī)(JVM)?--------回過頭來看

時(shí)間:2023-07-02 03:54:02 | 來源:網(wǎng)站運(yùn)營

時(shí)間:2023-07-02 03:54:02 來源:網(wǎng)站運(yùn)營

什么是Java虛擬機(jī)(JVM)?--------回過頭來看:

什么是Java虛擬機(jī)(JVM)?--------回過頭來看



博客說明



文章所涉及的資料來自互聯(lián)網(wǎng)整理和個(gè)人總結(jié),意在于個(gè)人學(xué)習(xí)和經(jīng)驗(yàn)匯總,如有什么地方侵權(quán),請(qǐng)聯(lián)系本人刪除,謝謝!



簡介



Java虛擬機(jī)(Java Virtual Machine 簡稱JVM)是運(yùn)行所有Java程序的抽象計(jì)算機(jī),是Java語言的運(yùn)行環(huán)境,它是Java 最具吸引力的特性之一



Java虛擬機(jī)(JVM)一種用于計(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)過編譯的任何Java代碼能夠在該系統(tǒng)上運(yùn)行。



Java虛擬機(jī)規(guī)范定義了一個(gè)抽象的——而非實(shí)際的——機(jī)器或處理器。這個(gè)規(guī)范描述了一個(gè)指令集,一組寄存器,一個(gè)堆棧,一個(gè)“垃圾堆”,和一個(gè)方法區(qū)。一旦一個(gè)Java虛擬機(jī)在給定的平臺(tái)上運(yùn)行,任何Java程序(編譯之后的程序,稱作字節(jié)碼)都能在這個(gè)平臺(tái)上運(yùn)行。Java虛擬機(jī)(JVM)可以以一次一條指令的方式來解釋字節(jié)碼(把它映射到實(shí)際的處理器指令),或者字節(jié)碼也可以由實(shí)際處理器中稱作just-in-time的編譯器進(jìn)行進(jìn)一步的編譯。



靈魂一問,什么是JVM?



前面說了一大堆,最后啥也記不住,視頻看了好多遍,最后還是忘記得干干凈凈,那到底該怎么來定義這個(gè)Java的核心JVM呢?我們來運(yùn)用我們中華語言的魅力,JVM在我們java語言執(zhí)行的流程當(dāng)中到底做了什么?我們給它一種修辭手法。還是擬人吧。它就是一個(gè)java語言的專有的隨身的且不能離開的翻譯



Java的跨平臺(tái)



在得到答案之后,我們來。來做什么呢?來總結(jié),前面我們說它是一個(gè)翻譯,那么這個(gè)翻譯讓Java具有了一種魅力——跨平臺(tái)性,正是多虧了這個(gè)牛壞了的翻譯,Java在哪個(gè)平臺(tái)都能吃得了,而且吃得開。



那這個(gè)JVM是怎么來實(shí)現(xiàn)跨平臺(tái)的呢?



其實(shí)在我們的一些平臺(tái)上的JVM是不同的翻譯,但是他們都為Java服務(wù),它把Java程序翻譯到各個(gè)平臺(tái),導(dǎo)致一套代碼就可以同時(shí)運(yùn)行在多個(gè)平臺(tái)了。就是每個(gè)不同的操作系統(tǒng)的JVM是不同的版本。



講了這么多不來一張圖,搞得我多l(xiāng)ao似的







其實(shí)這個(gè)圖并不是那么的好看,但是看了一下在腦海里會(huì)有一個(gè)印象,這有助于我們理解JVM



兩個(gè)老J---JRE和JDK



不知道你們?cè)趺醋x,我們這邊讀gou,懂得自然懂的哈

JRE簡介

Java運(yùn)行環(huán)境(Java Runtime Environment)包含JVM和運(yùn)行時(shí)所需要的核心類庫,我們想要運(yùn)行一個(gè)已有的Java程序,那么只需要安裝JRE

JDK簡介

JDK(Java Development Kit) 是 Java 語言的軟件開發(fā)工具包,包含JRE和開發(fā)人員使用的工具,如果要開發(fā)一個(gè)全新的Java程序,那么必須安裝JDK

JDK版本

SE(JavaSE),standard edition,標(biāo)準(zhǔn)版,是我們通常用的一個(gè)版本,從JDK 5.0開始,改名為Java SE。



EE(JavaEE),enterprise edition,企業(yè)版,使用這種JDK開發(fā)J2EE應(yīng)用程序,從JDK 5.0開始,改名為Java EE。從2018年2月26日開始,J2EE改名為Jakarta EE [1] 。



ME(J2ME),micro edition,主要用于移動(dòng)設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,從JDK 5.0開始,改名為Java ME。



沒有JDK的話,無法編譯Java程序(指java源碼.java文件),如果想只運(yùn)行Java程序(指class或jar或其它歸檔文件),要確保已安裝相應(yīng)的JRE

JDK的歷史圖



JDK版本新特性

jdk1.8新特性



Java 8允許我們給接口添加一個(gè)非抽象的方法實(shí)現(xiàn),只需要使用 default關(guān)鍵字即可。



新增lambda表達(dá)式



提供函數(shù)式接口



Java 8 允許你使用關(guān)鍵字來傳遞方法或者構(gòu)造函數(shù)引用



我們可以直接在lambda表達(dá)式中訪問外層的局部變量。

JDK基礎(chǔ)組件

javac – 編譯器,將源程序轉(zhuǎn)成字節(jié)碼



jar – 打包工具,將相關(guān)的類文件打包成一個(gè)文件



javadoc – 文檔生成器,從源碼注釋中提取文檔



jdb – debugger,查錯(cuò)工具



java – 運(yùn)行編譯后的java程序(.class后綴的)



appletviewer:小程序?yàn)g覽器,一種執(zhí)行HTML文件上的Java小程序的Java瀏覽器。



Javah:產(chǎn)生可以調(diào)用Java過程的C過程,或建立能被Java程序調(diào)用的C過程的頭文件。



Javap:Java反匯編器,顯示編譯類文件中的可訪問功能和數(shù)據(jù),同時(shí)顯示字節(jié)代碼含義。



Jconsole: Java進(jìn)行系統(tǒng)調(diào)試和監(jiān)控的工具



JVM、JRE和JDK的關(guān)系



剛才好像忽略了什么,這里已經(jīng)有三個(gè)老J(gou)啦。



說它們的關(guān)系就是JDK包含JRE包含JVM,直接上圖就好







這樣就好理解了吧



JVM內(nèi)存管理



對(duì)于Java運(yùn)行時(shí)涉及到的存儲(chǔ)區(qū)域主要包括程序計(jì)數(shù)器、Java虛擬機(jī)棧、本地方法棧、java堆、方法區(qū)以及直接內(nèi)存等等。對(duì)于每個(gè)部分,都有其使用的條件。程序計(jì)數(shù)器主要是取下一條指令,在Java里面主要是取下一條指令的字節(jié)碼文件;Java虛擬機(jī)棧主要是利用棧先進(jìn)后出的特性存儲(chǔ)局部變量表,動(dòng)態(tài)鏈接等,主要包括堆內(nèi)存和棧內(nèi)存,對(duì)于程序員內(nèi)存分析而言是特別重要的。本地方法棧與上邊的棧基本作用差不多,只不過這里是為Java方法而服務(wù)。Java堆是內(nèi)存管理中最大的一塊,所有的線程共享這一塊內(nèi)容,同時(shí)該部分也是垃圾收集器的主要區(qū)域。



虛擬機(jī)的垃圾回收機(jī)制是完善的,動(dòng)態(tài)內(nèi)存分配和回收是比較成熟的,在內(nèi)存管理機(jī)制中,大部分都不需要我們考慮內(nèi)存回收,只有Java堆和方法區(qū)需要我們考慮處理內(nèi)存問題。一般的對(duì)于內(nèi)存回收首先就是判斷某一個(gè)部分是生存還是死亡,主要是通過下面二種算法:



其一是引用計(jì)數(shù)算法,本算法實(shí)現(xiàn)簡單,判定的效率也是比較高的,很多的軟件都使用了該算法,但是主流的Java并沒有選擇該算法,核心的問題是該算法難以處理對(duì)象之間相互調(diào)用的問題。



其二是稱可達(dá)性分析算法,該算法核心思想是依靠判斷對(duì)象是否存活來實(shí)現(xiàn)的,本算法是通過一系列的GC ROOTS的對(duì)象作為起始點(diǎn),采用搜索的算法遍歷引用鏈,如果搜索過程中沒有發(fā)現(xiàn)該節(jié)點(diǎn),則認(rèn)為該節(jié)點(diǎn)是不可達(dá)的,即可回收的,在Java里面,一般可以使用該算法處理問題。



感謝



百度百科

以及勤勞的自己

微信公眾號(hào):歸子莫

關(guān)鍵詞:虛擬

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉