當前位置:首頁 » 編程語言 » java虛擬機的原理

java虛擬機的原理

發布時間: 2022-09-14 19:35:34

java虛擬機是什麼意思

Java虛擬機(Java Virtual Machine,簡稱JVM)是一種假想的計算機。從結構上看,它由抽象的指令集、寄存器組、類文件格式規定、堆棧、內存垃圾收集器和存儲區六個部件組成。指令集採用與平合無關的位元組碼形式,寄存器組中包含程序計數器、堆棧指針、運行環境指針和變數指針,類文件也與平台無關,堆棧用來傳遞參數和返回運行結果,垃圾收集器收集不再使用的內存片段,存儲區則用來存放位元組碼。JVM僅僅規定部件的功能和規格。雖然這些功能和規格是統一的,但是並沒有規定這此部件的具體實現技術,就是說,可以用任何一種技術來實現。

Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的介面。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫做位元組碼(ByteCode),它不面向任何特定的處理器,只面向虛擬機。

每一種平台的解釋器是不同的,但是實現的虛擬機是相同的。Java源程序經過編譯器編譯後變成位元組碼,位元組碼由虛擬機解釋執行,虛擬機將每一條要執行的位元組碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然後在特定的機器上運行。

可以說,Java虛擬機是Java語言的基礎。它是Java技術的重要組成部分。Java虛擬機是一個抽象的計算機,和實際的計算機一樣,它具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。Java解釋器負責將位元組代碼翻譯成特定機器的機器代碼。Java是一種簡單的語言。它用到的概念不多,而且多為程序員所熟悉。如果你是一名程序員,掌握Java對你來說是易如反掌的事。即使你沒有學過任何編程語言,學習Java也要比學習C++要容易的多。

Ⅱ 什麼是Java虛擬機它的作用是什麼

Java虛擬機是一種抽象化的計算機,作用是可以在多種平台上不加修改地運行。

Java虛擬機通過在實際的計算機上模擬模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。

Java虛擬機屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼,就可以在多種平台上不加修改地運行。

(2)java虛擬機的原理擴展閱讀:

Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。

Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。

Ⅲ java工作原理

Java工作原理
由四方面組成:

(1)Java編程語言
(2)Java類文件格式
(3)Java虛擬機
(4)Java應用程序介面
當編輯並運行一個Java程序時,需要同時涉及到這四種方面。使用文字編輯軟體(例如記事本、寫字板、UltraEdit等)或集成開發環境(Eclipse、MyEclipse等)在Java源文件中定義不同的類 ,通過調用類(這些類實現了Java API)中的方法來訪問資源系統,把源文件編譯生成一種二進制中間碼,存儲在class文件中,然後再通過運行與操作系統平台環境相對應的Java虛擬機來運行class文件,執行編譯產生的位元組碼,調用class文件中實現的方法來滿足程序的Java API調用 。

Ⅳ 虛擬機是怎樣運行的,原理是什麼

虛擬機的運行:

指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。

原理:

從最初編寫的Java源文件(.java文件)是如何一步步執行的,如下圖所示,首先Java源文件經過前端編譯器(javac或ECJ)將.java文件編譯為Java位元組碼文件。

然後JRE載入Java位元組碼文件,載入系統分配給JVM的內存區,然後執行引擎解釋或編譯類文件,再由即時編譯器將位元組碼轉化為機器碼。

(4)java虛擬機的原理擴展閱讀:

虛擬機資源涉及多個方面:CPU、內存、網路以及磁碟。在規劃虛擬機時應該考慮這些資源之間的關系,否則,分配的資源不合理將導致虛擬機內的應用程序性能表現不佳。

CPU:

虛擬機每個vCPU只運行在一個物理核心之上,因此CPU頻率越高虛擬機的運行速度也就越高,vCPU數量越多有助於提升應用的性能表現。

一個比較復雜的因素就是在ESXi伺服器內,所有的虛擬機共享使用物理CPU。ESXi伺服器的核心數越多,每個vCPU獲得的核心份額也就越大,因此多核心的性能表現要強於核心頻率高但數量少的情況。

如果虛擬機需要佔用大量的CPU時間,那麼可以考慮為虛擬機分配第二個vCPU,但是,為虛擬機分配兩個以上vCPU並不一定讓應用運行的更快,因為只有多線程應用才能有效地使用多個vCPU。

RAM:

ESXi伺服器內RAM資源通常有限,因此在給虛擬機分配RAM時需要格外小心。VMkernel在處理RAM時非常巧妙;允許虛擬機使用ESXi伺服器所有的物理內存而且會盡量避免佔用物理內存卻沒有真正使用的情況。

物理內存被完全用完後,VMkernel必須確定哪些虛擬機能夠保留物理內存,哪些虛擬機要釋放物理內存。這稱之為「內存回收」。當虛擬機佔用的物理內存被回收後,存在的一個風險就是會對虛擬機的性能造成影響。虛擬機被回收的內存越多,相應的風險也就越大。

最明智的是只為虛擬機分配完成工作所需要的內存。分配額外的內存將會增加回收風險。另一方面,當虛擬機操作系統將未被使用的內存用作磁碟緩存時,將會顯著降低對磁碟系統的性能要求,所以這里有一個折衷問題。

對於資料庫伺服器以及VDI桌面來說,為虛擬機分配更多的內存往往更劃算—在一台ESXi伺服器上運行更少的虛擬機—而不是購買高性能的磁碟陣列。關鍵在於針對虛擬機的負載分配足夠多內存而且沒有浪費。

參考資料:

網路-虛擬機

Ⅳ microsoft VM Java虛擬機是什麼東西

1,什麼是Java虛擬機
Java虛擬機(JVM)是Java Virtual Machine的縮寫,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能模擬來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。

2,為什麼使用Java虛擬機?
Java語言最重要的特點就是可以在任何操作系統中運行。使用Java虛擬機就是為了支持與操作系統無關,在任何系統中都可以運行。

3,Java虛擬機的基本原理
Java虛擬機屏蔽了與具體操作系統平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,實際上最終還是把位元組碼解釋成具體平台上的機器指令執行。

我們上網時,有些網頁是用java語言寫的,以及一些java程序腳本等等都需要系統中有Java虛擬機時才能打開察看。不過,有些惡意網頁有帶病毒的java腳本程序,使電腦中毒。但畢竟是少數。如果不裝的話可能中的毒就少一些,但這個虛擬機還是很實用的,很多地方都要用到,建議安裝。

Ⅵ 什麼是Java虛擬機

虛擬機是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。

Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。

這種解釋應該算是正確的,但是只描述了虛擬機的外部行為和功能,並沒有針對內部原理做出說明。一般情況下我們不需要知道虛擬機的運行原理,只要專注寫java代碼就可以了,這也正是虛擬機之所以存在的原因--屏蔽底層操作系統平台的不同並且減少基於原生語言開發的復雜性,使java這門語言能夠跨各種平台(只要虛擬機廠商在特定平台上實現了虛擬機),並且簡單易用。這些都是虛擬機的外部特性,但是從這些信息來解釋虛擬機,未免太籠統了,無法讓我們知道內部原理。


從進程的角度解釋JVM


讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那麼什麼東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放於文件系統中),可以把它叫做程序。

對命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令並且回車後,就會創建一個進程,載入對應的可執行文件到進程的地址空間中,並且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。

首先編寫C語言版的HelloWorld程序。

總結

寫到這里,基本上關於我對java虛擬機的理解就寫完了。這篇文章的主題雖然是深入理解Java虛擬機,但是你可能感覺一點也不「深入」,也只是泛泛而談。我也有這樣的感覺。限於自己水平有限,也只能這樣了,要是想深入理解java虛擬機,強烈建議讀一下三本書:

《深入Java虛擬機》

《深入理解Java虛擬機JVM高級特性與最佳實踐》

《Java虛擬機規范》

其實我也讀過這幾本書,但是它們對虛擬機的解釋也是基於一個外部模型,而沒有深入剖析虛擬機內部的實現原理。虛擬機是一個大而復雜的東西,實現虛擬機的人都是大牛級別的,如果不是參與過虛擬機的實現,應該很少有人能把它參透。本專欄後面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數, 但是深入講解虛擬機的書, 目前為止我就見過這三本,並且網上的資料也不是很多。

最後做一個總結:

1 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。

2 這個叫做虛擬機的進程比較特殊,它能夠載入我們編寫的class文件。如果把JVM比作一個人,那麼class文件就是我們吃的食物。

3 載入class文件的是一個叫做類載入器的子系統。就好比我們的嘴巴,把食物吃到肚子里。

4 虛擬機中的執行引擎用來執行class文件中的位元組碼指令。就好比我們的腸胃,對吃進去的食物進行消化。

5 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之後,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。

(6)java虛擬機的原理擴展閱讀:

關於JAVA虛擬機的參數說明如下:

1、運行class文件

執行帶main方法的class文件,Java虛擬機[3]命令參數行為:

java <CLASS文件名>

注意:CLASS文件名不要帶文件後綴.class

例如:

java Test

如果執行的class文件是帶包的,即在類文件中使用了:

package <;包名>

那應該在包的基路徑下執行,Java虛擬機命令行參數:

java <;包名>.CLASS文件名

例如:

PackageTest.java中,其包名為:com.ee2ee.test,對應的語句為:

package com.ee2ee.test;

PackageTest.java及編譯後的class文件PackageTest.class的存放目錄如下:

classes

|__com

|__ee2ee

|__test

|__PackageTest.java

|__PackageTest.class

要運行PackageTest.class,應在classes目錄下執行:

java com.ee2ee.test.PackageTest

2、運行jar文件中的class

原理和運行class文件一樣,只需加上參數-cp <jar文件名>;即可。

例如:執行test.jar中的類com.ee2ee.test.PackageTest,命令行如下:

java -cp test.jar com.ee2ee.test.PackageTest

3、顯示JDK版本信息

當一台機器上有多個jdk版本時,需要知道當前使用的是那個版本的jdk,使用參數-version即可知道其版本,命令行為:

java -version

4、增加虛擬機可以使用的最大內存

Java虛擬機可使用的最大內存是有限制的,預設值通常為64MB或128MB。

如果一個應用程序為了提高性能而把數據載入內存中而佔用較大的內存,比如超過了默認的最大值128MB,需要加大java虛擬機可使用的最大內存,否則會出現Out of Memory的異常。啟動java時,需要使用如下兩個參數:

-Xms java虛擬機初始化時使用的內存大小

-Xmx java虛擬機可以使用的最大內存

以上兩個命令行參數中設置的size,可以帶單位,例如:256m表示256MB

舉例說明:

java -Xms128m -Xmx256m ...

表示Java虛擬機初始化時使用的內存為128MB,可使用的最大內存為256MB。

對於tomcat,可以修改其腳本catalina. sh(Unix平台)或catalina.bat(Windows平台),設置變數JAVA_OPTS即可,例如:

JAVA_OPTS='-Xms128m -Xmx256m'



Ⅶ 什麼是java虛擬機

1.什麼是Java虛擬機?為什麼Java被稱作是平台無關的編程語言?
Java虛擬機是一個可以執行Java位元組碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的位元組碼文件。Java應用程序可以運行在任意的平台,而不需要程序員為每一個平台單獨重寫或者是重新編譯。Java虛擬機讓這個變為可能。
2.JDK和JRE的區別是什麼?
Java開發工具包(JDK)是完整的Java軟體開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調試器),可以讓開發者開發、編譯、執行Java應用程序。
Java運行時環境(JRE)是將要執行Java程序的Java虛擬機。它同時也包含了執行applet需要的瀏覽器插件。

3.描述一下JVM載入class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件的類。如果你想學習Java可以來這個群,首先是五三二,中間是二五九,最後是九五二,裡面有大量的學習資料可以下載。
4.Java基本數據類型有哪些,String是Java的基本數據類型嗎? 什麼是自動拆裝箱?
基本數據類型包括byte、short、int、long、float、double、char、boolean。
String不是Java的基本數據類型,String類是final類型,因此不可以繼承也不能修改這個類。
自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。比如:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。
5.Java有沒有goto
java中的保留字,現在沒有在java中使用。
6. 0.6332的數據類型是()
A float B double C Float D Double
答案:B
解析:默認為double型,如果為float型需要加上f顯示說明,即0.6332f。
7.short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)
short s1 = 1; s1 += 1;(+=是Java的運算符,Java編譯器會進行特殊處理,因此可以正確編譯)
8.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回與參數最接近的長整數
9.數據類型轉換有哪幾種?並舉例說明。
1、隱式類型轉換
int i=1;long l=i;
2、強制類型轉換
long l=1;int i=(int)l;
10.簡述邏輯操作(&,|)與條件操作(&&,||)的區別
區別主要答兩點:
&& ||只能操作布爾型的,而& |不僅可以操作布爾型,而且可以操作數值型
& |在運算布爾型時不會產生短路現象,而&& || 會產生短路現象。

Ⅷ 什麼是java虛擬機,簡述其工作機制

摘要 java虛擬機運行機制如下:Java語言使用模式Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。

Ⅸ java虛擬機工作原理

從宏觀上介紹一下Java虛擬機的工作原理。從最初編寫的Java源文件(.java文件)是如何一步步執行的,如下圖所示,首先Java源文件經過前端編譯器(javac或ECJ)將.java文件編譯為Java位元組碼文件,然後JRE載入Java位元組碼文件,載入系統分配給JVM的內存區,然後執行引擎解釋或編譯類文件,再由即時編譯器將位元組碼轉化為機器碼。主要介紹下圖中的類載入器和運行時數據區兩個部分。

熱點內容
test伺服器搭建 發布:2025-01-11 23:03:22 瀏覽:420
微信里的密碼和賬號在哪裡 發布:2025-01-11 22:46:04 瀏覽:750
java字元串個數統計 發布:2025-01-11 22:45:05 瀏覽:541
完美國際2捏臉資料庫 發布:2025-01-11 22:45:04 瀏覽:279
php淘寶互刷平台源碼 發布:2025-01-11 22:43:49 瀏覽:215
劍俠情緣緩存怎麼清理 發布:2025-01-11 22:33:56 瀏覽:316
win7旗艦版怎麼設置密碼 發布:2025-01-11 22:21:09 瀏覽:144
被害人訪問 發布:2025-01-11 22:06:24 瀏覽:366
朋友圈上傳長視頻方法 發布:2025-01-11 22:01:41 瀏覽:357
我的世界ice伺服器被炸罰款 發布:2025-01-11 21:54:36 瀏覽:725