首先這里澄清兩個概念:JVM實例和JVM執(zhí)行引擎實例,JVM實例對應了一個獨立運行的Java程序,而JVM執(zhí)行引擎實例則對應了屬于用戶運行程序的線程;也就是JVM實例是進程級別,而執(zhí)行引擎是線程級別的。JVM是什么?—JVM的生命周期JVM實例的誕生:當啟動一個Java程序時,一個JVM實例就產(chǎn)生了,任何一個擁有publicstaticvoidmain(String[]args)函數(shù)的class都可以作為JVM實例運行的起點,既然如此,那么JVM如何知道是運行classA的main而不是運行classB的main呢?這就需要顯式的告訴JVM類名,也就是我們平時運行Java程序命令的由來,如JavaclassAhelloworld,這里Java是告訴os運行SunJava2SDK的Java虛擬機,而classA則指出了運行JVM所需要的類名。JVM實例的運行:main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,Java程序也可以標明自己創(chuàng)建的線程是守護線程。JVM實例的消亡:當程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出。JVM是什么?—JVM的體系結構粗略分來,JVM的內(nèi)部體系結構分為三部分,分別是:類裝載器(ClassLoader)子系統(tǒng),運行時數(shù)據(jù)區(qū),和執(zhí)行引擎。下面將先介紹類裝載器,然后是執(zhí)行引擎,最后是運行時數(shù)據(jù)區(qū)1、類裝載器,顧名思義,就是用來裝載.class文件的。JVM的兩種類裝載器包括:啟動類裝載器和用戶自定義類裝載器,啟動類裝載器是JVM實現(xiàn)的一部分,用戶自定義類裝載器則是Java程序的一部分,必須是ClassLoader類的子類。(下面所述情況是針對SunJDK1.2)動類裝載器:只在系統(tǒng)類(JavaAPI的類文件)的安裝路徑查找要裝入的類用戶自定義類裝載器:系統(tǒng)類裝載器:在JVM啟動時創(chuàng)建,用來在CLASSPATH目錄下查找要裝入的類其他用戶自定義類裝載器:這里有必要先說一下ClassLoader類的幾個方法,了解它們對于了解自定義類裝載器如何裝載.class文件至關重要。protectedfinalClassdefineClass(Stringname,bytedata[],intoffset,intlength) protectedfinalClassdefineClass(Stringname,bytedata[],intoffset,intlength,ProtectionDomainprotectionDomain);protectedfinalClassfindSystemClass(Stringname) protectedfinalvoidresolveClass(Classc) defineClass用來將二進制class文件(新類型)導入到方法區(qū),也就是這里指的類是用戶自定義的類(也就是負責裝載類)findSystemClass通過類型的全限定名,先通過系統(tǒng)類裝載器或者啟動類裝載器來裝載,并返回Class對象。ResolveClass:讓類裝載器進行連接動作(包括驗證,分配內(nèi)存初始化,將類型中的符號引用解析為直接引用),這里涉及到Java命名空間的問題,JVM保證被一個類裝載器裝載的類所引用的所有類都被這個類裝載器裝載,同一個類裝載器裝載的類之間可以相互訪問,但是不同類裝載器裝載的類看不見對方,從而實現(xiàn)了有效的屏蔽。2、執(zhí)行引擎:它或者在執(zhí)行字節(jié)碼,或者執(zhí)行本地方法要說執(zhí)行引擎,就不得不的指令集,每一條指令包含一個單字節(jié)的操作碼,后面跟0個或者多個操作數(shù)。(一)指令集以棧為設計中心,而非以寄存器為中心這種指令集設計如何滿足Java體系的要求:平臺無關性:以棧為中心使得在只有很少register的機器上實現(xiàn)Java更便利compiler一般采用stack向連接優(yōu)化器傳遞編譯的中間結果,若指令集以stack為基礎,則有利于運行時進行的優(yōu)化工作與執(zhí)行即時編譯或者自適應優(yōu)化的執(zhí)行引擎結合,通俗的說就是使編譯和運行用的數(shù)據(jù)結構統(tǒng)一,更有利于優(yōu)化的開展。網(wǎng)絡移動性:class文件的緊湊性。安全性:指令集中絕大部分操作碼都指明了操作的類型。(在裝載的時候使用數(shù)據(jù)流分析期進行一次性驗證,而非在執(zhí)行每條指令的時候進行驗證,有利于提高執(zhí)行速度)。(二)執(zhí)行技術主要的執(zhí)行技術有:解釋,即時編譯,自適應優(yōu)化、芯片級直接執(zhí)行其中解釋屬于第一代JVM,即時編譯JIT屬于第二代JVM,自適應優(yōu)化(目前Sun的HotspotJVM采用這種技術)則吸取第一代JVM和第二代JVM的經(jīng)驗,采用兩者結合的方式自適應優(yōu)化:開始對所有的代碼都采取解釋執(zhí)行的方式,并監(jiān)視代碼執(zhí)行情況,然后對那些經(jīng)常調(diào)用的方法啟動一個后臺線程,將其編譯為本地代碼,并進行仔細優(yōu)化。若方法不再頻繁使用,則取消編譯過的代碼,仍對其進行解釋執(zhí)行。3、運行時數(shù)據(jù)區(qū):主要包括:方法區(qū),堆,Java棧,PC寄存器,本地方法棧(1)方法區(qū)和堆由所有線程共享堆:存放所有程序在運行時創(chuàng)建的對象方法區(qū):當JVM的類裝載器加載.class文件,并進行解析,把解析的類型信息放入方法區(qū)。(2)Java棧和PC寄存器由線程獨享,在新線程創(chuàng)建時間里(3)本地方法棧:存儲本地方法調(diào)用的狀態(tài)上邊總體介紹了運行時數(shù)據(jù)區(qū)的主要內(nèi)容,下邊進行詳細介紹,要介紹數(shù)據(jù)區(qū),就不得不說明JVM中的數(shù)據(jù)類型。JVM中的數(shù)據(jù)類型:JVM中基本的數(shù)據(jù)單元是word,而word的長度由JVM具體的實現(xiàn)者來決定數(shù)據(jù)類型包括基本類型和引用類型,(1)基本類型包括:數(shù)值類型(包括除boolean外的所有的Java基本數(shù)據(jù)類型),boolean(在JVM中使用int來表示,0表示false,其他int值均表示true)和returnAddress(JVM的內(nèi)部類型,用來實現(xiàn)finally子句)。(2)引用類型包括:數(shù)組類型,類類型,接口類型前邊講述了JVM中數(shù)據(jù)的表示,下面讓我們輸入到JVM的數(shù)據(jù)區(qū)首先來看方法區(qū):上邊已經(jīng)提到,方法區(qū)主要用來存儲JVM從class文件中提取的類型信息,那么類型信息是如何存儲的呢?眾所周知,Java使用的是大端序(big?endian:即低字節(jié)的數(shù)據(jù)存儲在高位內(nèi)存上,如對于1234,12是高位數(shù)據(jù),34為低位數(shù)據(jù),則Java中的存儲格式應該為12存在內(nèi)存的低地址,34存在內(nèi)存的高地址,x86中的存儲格式與之相反)來存儲數(shù)據(jù),這實際上是在class文件中數(shù)據(jù)的存儲格式,但是當數(shù)據(jù)倒入到方法區(qū)中時,JVM可以以任何方式來存儲它。類型信息:包括class的全限定名,class的直接父類,類類型還是接口類型,類的修飾符(public,等),所有直接父接口的列表,Class對象提供了訪問這些信息的窗口(可通過Class.forName(“”)或instance.getClass()獲得),下面是Class的方法,相信大家看了會恍然大悟,(原來如此J)getName(),getSuperClass(),isInterface(),getInterfaces(),getClassLoader();static變量作為類型信息的一部分保存指向ClassLoader類的引用:在動態(tài)連接時裝載該類中引用的其他類指向Class類的引用:必然的,上邊已述該類型的常量池:包括直接常量(String,integer和floatpoint常量)以及對其他類型、字段和方法的符號引用(注意:這里的常量池并不是普通意義上的存儲常量的地方,這些符號引用可能是我們在編程中所接觸到的變量),由于這些符號引用,使得常量池成為Java程序動態(tài)連接中至關重要的部分字段信息:普通意義上的類型中聲明的字段方法信息:類型中各個方法的信息編譯期常量:指用final聲明或者用編譯時已知的值初始化的類變量class將所有的常量復制至其常量池或者其字節(jié)碼流中。方法表:一個數(shù)組,包括所有它的實例可能調(diào)用的實例方法的直接引用(包括從父類中繼承來的)除此之外,若某個類不是抽象和本地的,還要保存方法的字節(jié)碼,操作數(shù)棧和該方法的棧幀,異常表。舉例:classLava{ privateintspeed=5; voidflow(){} classVolcano{ publicstaticvoidmain(String[]args){ Lavalava=newLava(); lava.flow(); } } 運行命令JavaVolcano;(1)JVM找到Volcano.class倒入,并提取相應的類型信息到方法區(qū)。通過執(zhí)行方法區(qū)中的字節(jié)碼,JVM執(zhí)行main()方法,(執(zhí)行時會一直保存指向Vocano類的常量池的指針)(2)Main()中第一條指令告訴JVM需為列在常量池第一項的類分配內(nèi)存(此處再次說明了常量池并非只存儲常量信息),然后JVM找到常量池的第一項,發(fā)現(xiàn)是對Lava類的符號引用,則檢查方法區(qū),看Lava類是否裝載,結果是還未裝載,則查找“Lava.class”,將類型信息寫入方法區(qū),并將方法區(qū)Lava類信息的指針來替換Volcano原常量池中的符號引用,即用直接引用來替換符號引用。(3)JVM看到new關鍵字,準備為Lava分配內(nèi)存,根據(jù)Volcano的常量池的第一項找到Lava在方法區(qū)的位置,并分析需要多少對空間,確定后,在堆上分配空間,并將speed變量初始為0,并將lava對象的引用壓到棧中(4)調(diào)用lava的flow()方法好了,大致了解了方法區(qū)的內(nèi)容后,讓我們來看看堆Java對象的堆實現(xiàn):Java對象主要由實例變量(包括自己所屬的類和其父類聲明的)以及指向方法區(qū)中類數(shù)據(jù)的指針,指向方法表的指針,對象鎖(非必需),等待集合(非必需),GC相關的數(shù)據(jù)(非必需)(主要視GC算法而定,如對于標記并清除算法,需要標記對象是否被引用,以及是否已調(diào)用finalize()方法)。那么為什么Java對象中要有指向類數(shù)據(jù)的指針呢?我們從幾個方面來考慮首先:當程序中將一個對象引用轉為另一個類型時,如何檢查轉換是否允許?需用到類數(shù)據(jù)其次:動態(tài)綁定時,并不是需要引用類型,而是需要運行時類型,這里的迷惑是:為什么類數(shù)據(jù)中保存的是實際類型,而非引用類型?這個問題先留下來,我想在后續(xù)的讀書筆記中應該能明白指向方法表的指針:這里和C++的VTBL是類似的,有利于提高方法調(diào)用的效率對象鎖:用來實現(xiàn)多個線程對共享數(shù)據(jù)的互斥訪問等待集合:用來讓多個線程為完成共同目標而協(xié)調(diào)功過。(注意Object類中的wait(),notify(),notifyAll()方法)。Java數(shù)組的堆實現(xiàn):數(shù)組也擁有一個和他們的類相關聯(lián)的Class實例,具有相同dimension和type的數(shù)組是同一個類的實例。數(shù)組類名的表示:如[[LJava/lang/Object表示Object[][],[I表示int[],[[[B表示byte[][][]至此,堆已大致介紹完畢,下面來介紹程序計數(shù)器和Java棧程序計數(shù)器:為每個線程獨有,在線程啟動時創(chuàng)建,若thread執(zhí)行Java方法,則PC保存下一條執(zhí)行指令的地址。若thread執(zhí)行native方法,則Pc的值為undefinedJava棧:Java棧以幀為單位保存線程的運行狀態(tài),Java棧只有兩種操作,幀的壓棧和出棧。每個幀代表一個方法,Java方法有兩種返回方式,return和拋出異常,兩種方式都會導致該方法對應的幀出棧和釋放內(nèi)存。幀的組成:局部變量區(qū)(包括方法參數(shù)和局部變量,對于instance方法,還要首先保存this類型,其中方法參數(shù)按照聲明順序嚴格放置,局部變量可以任意放置),操作數(shù)棧,幀數(shù)據(jù)區(qū)(用來幫助支持常量池的解析,正常方法返回和異常處理)。本地方法棧:依賴于本地方法的實現(xiàn),如某個JVM實現(xiàn)的本地方法借口使用C連接模型,則本地方法棧就是C棧,可以說某線程在調(diào)用本地方法時,就進入了一個不受JVM限制的領域,也就是JVM可以利用本地方法來動態(tài)擴展本身。相信大家都明白JVM是什么了吧。原文鏈接: http://www.cnblogs.com/chenzhao/archive/2011/08/14/2137713.html
JVM工作原理和特點主要是指操作系統(tǒng)裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環(huán)境.
1.創(chuàng)建JVM裝載環(huán)境和配置
2.裝載JVM.dll
3.初始化JVM.dll并掛界到JNIENV(JNI調(diào)用接口)實例
4.調(diào)用JNIEnv實例裝載并處理class類。
簡單說JVM你可以認為是一套完整的自定義的指令系統(tǒng),它工作就是完成一種指令的編碼和解釋工作,如果你想了解的透徹點我推薦你可以讀下JVM的源碼,或者看些相關虛擬機實現(xiàn)原理的書籍
咕泡學院 James講JVM看了就知道,百度搜索 咕泡學院
vm是什么
VM,即Virtual Machine,中文常稱為虛擬機。它是一種在計算機上模擬真實計算機運行環(huán)境的軟件技術。通過虛擬機技術,我們可以在單一的物理計算機上同時運行多個獨立的操作系統(tǒng)和應用程序。二、VM的工作原理 虛擬機技術通過軟件模擬硬件環(huán)境來實現(xiàn)。其核心思想是在物理計算機上創(chuàng)建一個或多個虛擬的計算環(huán)境,這...
vm虛擬機的實現(xiàn)原理有哪些?
1. 虛擬機的實現(xiàn)原理主要通過軟件模擬硬件,但這種模擬方式可能較為緩慢,因此需要采取加速措施。2. 虛擬化技術主要模擬CPU、內(nèi)存、網(wǎng)絡和存儲等硬件資源。針對這些資源的模擬,有各自的加速方法。3. CPU和內(nèi)存的模擬主要通過硬件輔助虛擬化技術實現(xiàn)加速。但這種加速方式需要配備特殊的硬件才能正常工作。4. ...
計算機組成原理中vm是什么
在計算機組成原理中,VM代表虛擬機。虛擬機是一種運行在一臺或多臺物理計算機上的軟件實現(xiàn)。以下是關于虛擬機的 虛擬機通過模擬硬件和軟件環(huán)境來創(chuàng)建完全獨立的虛擬計算機系統(tǒng)。它可以運行在各種不同類型的物理硬件上,并能夠模擬不同操作系統(tǒng)和硬件環(huán)境。虛擬機技術廣泛應用于服務器虛擬化、桌面虛擬化以及云...
虛擬機是怎樣運行的,原理是什么?
指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的完整計算機系統(tǒng)。原理:從最初編寫的Java源文件(.java文件)是如何一步步執(zhí)行的,如下圖所示,首先Java源文件經(jīng)過前端編譯器(javac或ECJ)將.java文件編譯為Java字節(jié)碼文件。然后JRE加載Java字節(jié)碼文件,載入系統(tǒng)分配給JVM的內(nèi)存區(qū),然...
計算機組成原理中VM是什么
VM)是計算機系統(tǒng)內(nèi)存管理的一種技術。將外存虛擬成為內(nèi)存的意思。個人理解:我們編程時,總感覺自己可以有很大的內(nèi)存空間可以讓我們使用,然而實際上這些內(nèi)存是不存在的,只是“讓我們感覺我們擁有”這樣的內(nèi)存,滿足每個程序員的需求。這就是虛擬內(nèi)存的意思吧 希望可以幫你o(∩_∩)o ,加油,ITer!
什么是虛擬機 Virtual Machine ?
CPU的二進制格式,實現(xiàn)運行。綜上所述,虛擬機的用途廣泛,無論是硬件不兼容、多操作系統(tǒng)需求還是跨平臺編程,虛擬機都能提供解決方案。在區(qū)塊鏈領域,虛擬機如EVM和CKB-VM為智能合約的運行提供了平臺。對于區(qū)塊鏈和虛擬機的原理,本文進行了深入闡述,希望能幫助讀者對這一技術有更清晰的理解。
vmware是什么軟件
VMware的工作原理是模擬硬件環(huán)境,讓每個虛擬機(VM)都能像在物理機上一樣獨立運行。每個VM都有自己獨立的操作系統(tǒng)、應用程序和硬件資源,它們之間相互隔離,不會互相影響。企業(yè)使用VMware可以顯著提高IT資源的利用效率,減少硬件投資和運營成本。對于開發(fā)者來說,VMware提供了一個方便的環(huán)境,可以同時測試不...
化學vm是什么意思?
化學vm是一種名為虛擬機(Virtual Machine)的技術,它可運行化學軟件,如Molpro、Gaussian等,以加快計算機對化學問題的處理速度。這種虛擬技術可以將計算機的物理資源與計算任務分離,從而提高了計算效率。化學領域的虛擬機還能夠在不同的平臺之間進行轉移和共享化學數(shù)據(jù),這為化學家們提供了更好的交流和合作...
求問維勒米爾循環(huán)(VM循環(huán))、吉福特-麥克馬洪循環(huán)(G-M循環(huán))、索爾文循環(huán)...
吉福特-麥克馬洪制冷循環(huán) Gifford-Mcmahon refrigeration cycle 由吉福特和麥克馬洪兩人提出的利用絕熱放氣制冷原理工作的制冷循環(huán)。 美國錫拉丘茲大學的吉福德與麥克馬洪于1959年提出利用高壓氣體被絕熱抽氣來達到制冷目的,這種循環(huán)稱為G-M循環(huán),它的熱力學過程為兩個等壓過程與兩個等容過程構成一個循環(huán)。...
酶的可逆抑制劑影響Km和Vm的原理是什么?
酶的可逆抑制劑如何影響Km和Vm:深入解析其原理 酶在生物化學中的角色至關重要,而可逆抑制劑對其動力學特性的影響是研究的核心。《王鏡巖版生物化學》以其詳盡的闡述為我們揭示了這一過程。首先,我們從米氏方程的基石出發(fā),理解酶促反應的動力學基礎。質(zhì)量作用定律是基石,它描述了二級反應mA+nB→……...
相關評說:
言寧18289385541: jvm的垃圾回收機制詳解 -
五大連池市定形:
______ 1.JVM的gc概述 gc即垃圾收集機制是指jvm用于釋放那些不再使用的對象所占用的內(nèi)存.java語言并不要求jvm有gc,也沒有規(guī)定gc如何工作.不過常用的jvm都有gc,而且大多數(shù)gc都使用類似的算法管理內(nèi)存和執(zhí)行收集操作. 在充分理解了垃...
言寧18289385541: jvm 加載class文件的原理 -
五大連池市定形:
______ 第一部分 類和類的裝載 我們來看一下類以及它們被JVM裝載的時候做了些什么?一個類的二進制形式 用Java語言的開發(fā)人員通常不必關心通過編譯器運行他們的源代碼時所發(fā)生的一些細節(jié)問題.在本文中.我會介紹許多有關從源代碼到可執(zhí)行...
言寧18289385541: Java的GC機制到底怎么回事 -
五大連池市定形:
______ 這個有點復雜,現(xiàn)在JVM應該都是分代回收,具體你可以去看一下JVM原理;簡單點說就是: 你 new 出來的對象,當不用的時候是不會馬上回收的;JVM分時間,分階段逐步回收;當然,如果你直接調(diào)用System.gc()的話;這時候會引發(fā) full gc();也就是JVM里面不被引用的對象都會被回收一次,資源消耗的代價是比較高的;你可以用jstat命令查看到具體的回收過程,回收次數(shù)等信息
言寧18289385541: JVM是什么? -
五大連池市定形:
______ JVM是Java虛擬機,所有的Java程序都在Java虛擬機中運.JDK是Java開發(fā)工具包,用來開發(fā)Java程序.jdk中有一個編譯器,可以把你的java源代碼編譯成可以在虛擬機(jvm) 上運行的字節(jié)碼(中間代碼).
言寧18289385541: java中反射原理,和應用 -
五大連池市定形:
______ 1、反射的原理,即是jvm通過字節(jié)碼class文件,生成相應的對象. 就像正常生成一個對象一樣,都是來源于字節(jié)碼class文件, 之所以叫反射,只是因為他不像正常的對象聲明,如A a=new A()的方式.2、反射在框架中的應用太廣,只舉一個典型的例子,即Spring中Bean的注入. bean總是先聲明class路徑,然后依次生成就可以了.再試下吧.
言寧18289385541: Java中的JVM是指什么?
五大連池市定形:
______ JVM指的是Java虛擬機
言寧18289385541: java 運行原理是什么? -
五大連池市定形:
______ 編譯成字節(jié)碼,在jvm上就可以運行了
言寧18289385541: 簡述Java程序從編寫到運行的基本步驟,并說明Java的基本工作原理 -
五大連池市定形:
______ Java編譯原理: Java 虛擬機(JVM)是可運行Java 代碼的假想計算機.只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計算機上,就能保證經(jīng)過編譯的任何Java代碼能夠在該系統(tǒng)上運行. 一.Java源文件的編譯、下載 、解釋和執(zhí)行 Java應用程...
言寧18289385541: JVM是什么 他有什么腳本語言呢? -
五大連池市定形:
______ JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規(guī)范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的.下面就由福州卓躍教育就福州java培訓過程中的一些經(jīng)驗具體介紹下...
言寧18289385541: java兩種核心機制是什么? -
五大連池市定形:
______ Java中有兩種核心機制:Java虛擬機(Java Virtual Machine)、垃圾32313133353236313431303231363533e58685e5aeb931333337613837收集機制(Garbage collection) 一、核心機制之Java虛擬機 ① Java虛擬機可以理解成一個以字節(jié)碼...