更新時間:2020-10-22 17:14:00 來源:動力節(jié)點 瀏覽1382次
說到java,大家都知道這是一種十分流行且應用廣泛的計算機語言,接觸過java語言的人大多也都知道面向?qū)ο笮浴⒕€程安全性和跨平臺性等都是它的特點。那么是什么使java語言具備了這些優(yōu)秀的特性呢,JVM就是實現(xiàn)了眾多特性中一個的工具,這篇文章帶大家學習JVM是什么,希望java初學者可以通過下面的內(nèi)容對JVM有一個總體的認識和了解。
JVM是什么,就是java虛擬機,是英文Java Virtual Machine的縮寫,是由軟件技術(shù)模擬出計算機運行的一個虛擬的計算機 ,同時JVM是構(gòu)成java技術(shù)的重要一部分,先來看看java技術(shù)的結(jié)構(gòu)圖:
運行期環(huán)境代表著Java平臺,開發(fā)人員編寫Java代碼(.java文件),然后將之編譯成字節(jié)碼(.class文件),JVM才能識別并運行它,JVM針對每個操作系統(tǒng)開發(fā)其對應的解釋器,所以只要其操作系統(tǒng)有對應版本的JVM,那么這份Java編譯后的代碼就能夠運行起來,這就是Java能一次編譯,到處運行的原因。
要全面的理解JVM是什么,要知道如下的內(nèi)容:
1、JVM堆
Java堆是和Java應用程序最密切的內(nèi)存空間,幾乎所有的對象都放到堆中。并且堆完全由JVM管理,通過垃圾回收機制,垃圾對象會被自動清理,而不需顯式的釋放。根據(jù)垃圾回收機制的不同,Java堆通常被分為以下的集中不同的結(jié)構(gòu):New Generation:由 Eden + Survivor (From Space + To Space)組成;Eden:所有的new出來的新對象都存放到Eden區(qū);Survivor Space:Eden每次垃圾清理過后,任然沒又被清理的對象,會轉(zhuǎn)移到交換區(qū)中;Old Generation:在交換區(qū)中未被清理的對象(默認清理18次標記),將轉(zhuǎn)移到老年代。
2、JVM棧
Java棧是一塊線程私有的內(nèi)存空間,Java棧和線程執(zhí)行密切相關。線程的執(zhí)行基本單位就是函數(shù)調(diào)用,每次函數(shù)調(diào)用的數(shù)據(jù)就會通過Java棧傳遞。Java棧與數(shù)據(jù)結(jié)構(gòu)上的棧有著類似的含義,它是一塊先進后出的數(shù)據(jù)結(jié)構(gòu),只支持出棧和入棧的兩種操作。在Java棧中保存的主要內(nèi)容為棧幀。每次調(diào)用一個函數(shù),都會有一個對應的棧幀被壓入Java棧。每一個函數(shù)調(diào)用結(jié)束,都會有一個棧幀被彈出Java棧。例如:
如圖所示,每次調(diào)用一個函數(shù)都會被當做棧幀壓入到棧中。其中每一個棧幀對應一個函數(shù)。由于每次調(diào)用函數(shù)都會生成一個棧幀,從而占用一定的棧空間。如果線程中存在大量的遞歸操作,會頻繁的壓棧,導致棧的深入過于深入,當棧的空間被消耗殆盡的時候,會拋出StackOverflowError棧溢出錯誤。
3、JVM方法區(qū)
它主要存放一些虛擬機加載的類信息,常量,靜態(tài)變量,即使編譯器后的代碼等數(shù)據(jù)。根據(jù)Java虛擬機規(guī)范的規(guī)定,當方法區(qū)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError異常。運行時常量池:運行時常量區(qū)是方法區(qū)的一部分。用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后進入方法區(qū)的運行時常量池中存放。還會有一些符號引用轉(zhuǎn)換的直接引用一保存在運行時常量池中。運行時常量池具備動態(tài)性,也就是運行期間也可以將新的常量放入池中,例如String.intern()方法。當常量池無法再申請到內(nèi)存時,會拋出OutOfMemoryError異常。
關于JVM是什么的問題,一句話總結(jié)下來就是:Java虛擬機是一種跨平臺的軟件,是一種新的網(wǎng)絡計算平臺。該平臺包括許多相關的技術(shù),使得同一種應用可以運行在不同的平臺上。使用Java虛擬機是實現(xiàn)java語言與平臺無關性的關鍵,所以在學習了JVM是什么后,要通過java教程來學習更多的JVM其他知識。