編譯原理與jvm
① jdk jre jvm 的區別和聯系
JDK,JRE,JVM的區別與聯系
JDK(java Development ToolKit) java 開發工具
JDK是Java語言的軟體開發工具包SDK。針對java開發者使用,整個Java的核心,包括Java運行環境JRE,Java工具(編譯器,打包壓縮工具,調試工具,反編譯工具),和Java基礎類庫等。
JRE(Java Runtime Environment) Java運行環境
Java運行環境,不是一個開發環境,包含JVM 等一些運行Java程序需要的必要組件和Java基礎類庫.要運行Java程序,只需安裝JRE即可,但要開發Java程序就需要安裝JDK.
JVM(Java Virtual Machine) Java虛擬機
JVM是用來執行Java位元組碼的,且依賴平台的抽象機器。JVM可以將位元組碼文件根據操作系統的不同,以不同的方式映射到操作系統底層,交由操作系統執行.
Java的跨平台本質是因為不同的操作系統擁有不同的Java虛擬機.Java虛擬機屏蔽了底層運行平台之間的差別,使得Java程序可以"一次編譯,隨處運行"…
總的來說: JDK > JRE > JVM
② JDK,JRE,JVM區別與聯系
JVM -- java virtual machine
JVM就是我們常說的java虛擬機,它是整個java實現跨平台的 最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可 以在虛擬機上執行,也就是說class並不直接與機器的操作系統相對應,而是經過虛擬機間接與操作系統交互,由虛擬機將程序解 釋給本地系統執行。
JVM 是 Java 平台的基礎,和實際的機器一樣,它也有自己的指令集,並且在運行 時操作不同的內存區域。 JVM 通過抽象操作系統和 CPU 結構,提供了一種與平台無關的代碼執行方法,即與特殊的實現方 法、主機硬體、主機操作系統無關。但是在一些小的方面, JVM 的實現也是互不相同的,比如垃圾回收 演算法,線程調度演算法(可能不同 OS 有不同的實現)。
JVM 的主要工作是解釋自己的指令集(即位元組碼)到 CPU 的指令集或 OS 的系統調用,保護用戶免被惡意程序騷擾。 JVM 對上層的 Java 源文件是不關心的,它關注的只是由源文件生成的類文件( class file )。類文件的 組成包括 JVM 指令集,符號表以及一些補助信息。
JRE -- java runtime environment
JRE是指java運行環境。光有JVM還不能成class的 執行,因為在解釋class的時候JVM需要調用解釋所需要的類庫lib。 在JDK的安裝目 錄里你可以找到jre目錄,裡面有兩個文件夾bin和lib,在 這里可以認為bin里的就是jvm,lib中則是jvm工 作所需要的類庫,而jvm和 lib和起來就稱為jre。所以,在你寫完java程序編譯成.class之後,你可以把這個.class文件 和jre一起打包發給朋友,這樣你的朋友就 可以運行你寫程序了。(jre里有運行.class的java.exe)
JRE 是 Sun 公司發布的一個更大的系統,它裡面就有一個 JVM 。 JRE 就與具體的 CPU 結構和操作系統有關,我們從 Sun 下載 JRE 的時候就看到了不同的各種版本。同 JVM 一起組成 JRE 的還有一些 API (如 awt , swing 等)。 JRE 是運行 Java 程序必不可少的。
JRE ( Java Runtime Environment ),是運行 Java 程序必不可少的(除非用其他一些編譯環境編譯成.exe可執行文件……),JRE的 地位就象一台PC機一樣,我們寫好的Win32應用程序需要操作系統幫 我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。
JRE裡面有一個 JVM , JRE 與具體的 CPU 結構和操作系統有關,我們從 Sun 下載 JRE 的時候就看到了不同的各種版本,,同 JVM 一起組成 JRE 的還有 一些 API (如 awt , swing 等), JRE 是 運行 Java 程序必不可少的.
JDK -- java development kit
JDK是java開發工具包,基本上每個學java的人都會先在機器 上裝一個JDK,那他都包含哪幾部分呢?讓我們看一下JDK的安裝目錄。在目錄下面有 六個文件夾、一個src類庫源碼壓縮包、和其他幾個聲明文件。其中,真正在運行java時起作用的 是以下四個文件夾:bin、include、lib、 jre。現在我們可以看出這樣一個關系,JDK包含JRE,而JRE包 含JVM。
bin:最主要的是編譯器(javac.exe)
include:java和JVM交互用的頭文件
lib:類庫
jre:java運行環境
(注意:這里的bin、lib文件夾和jre里的bin、lib是 不同的)總的來說JDK是用於java程序的開發,而jre則 是只能運行class而沒有編譯的功能。
eclipse、idea等 其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時你會發現他們只要求你 選中jre路徑就ok了。
三者聯系
Java 喊出的帶有標志性的口號「 Write Once , Run Anywhere (一次編寫,到處運行)」,正是建立在 JRE 的基礎之上。何以實現?就是在 Java 應用程序和操作系統之間增加了一虛擬層—— JRE 。
程序源代碼不是直 接編譯、鏈接成機器代碼,而是先轉化到位元組碼( bytecode ) 這種特殊的中間形式,位元組碼再轉換成機器碼或系統調用。前者是傳統的編譯方法,生成的機器代碼就不可避免地跟特殊的操作系統和特殊的機器結構相關。
而 Java 程序的位元組碼文件可以放到任意裝有 JRE 的計算機運行,再由不同 JRE 的將它們轉化成相應的機器代碼,這就實現了 Java 程序的可移植性。這樣程序員也不用去 關心程序運行的具體環境,而可以專心編寫軟體。這種分層抽象、隱藏細節的思想在計算機科學中處處可見,比如機器組織結構的設計、網路協議的實現等。 Pascal 語言的發明者 Niklaus Wirth ,就富有預見性地指出應該有這樣一種可移植的語言,其生成的中間代碼可以在一台假想的機器( a hypothetical machine )上運行。
而 Java 虛擬機( Java virtual machine 或 JVM )就是這樣的一台機器,它模擬實際處理器的結構,解釋位元組碼。 怎麼一會說是 JRE ,一會兒又成了 JVM ,兩者是否同物不同名? 回答是否定的。
JRE的地位就象一台PC機一樣,我們寫好的Win32應用程序需要操作系統幫 我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。
要運行Applet,在客戶端必須安裝有 JRE,即「運行時」,容易一點理解,就象所謂的「插件」,要開發JAVA應用程序Web應用,就必須在伺服器端安裝相應的 JVM+JDK 了(開發應用 Java web應用 時,客戶端不需要安裝任何的JVM)
如果你使用JAVA開發應用,就需要安裝 JRE+JDK,就是 J2SE.
如果在客戶端運行Applet,客戶端瀏覽器必須嵌有JAVA JVM,如果沒有,就需要安裝,即: 在客戶端創建JRE(運行時,包含JVM),而客戶端是不需要做開發的,所以,JDK就沒有必要安裝 了。
不同版本的Applet在不同的JVM下可能無法正常運行,而Microsoft JVM只是Sun JVM的「低版本」,微軟在windows xp/2003中乾脆將JVM去掉了.
③ 深入理解Java虛擬機:JVM高級特性與最佳實踐的內容簡介
作為一位java程序員,你是否也曾經想深入理解java虛擬機,但是卻被它的復雜和深奧拒之門外?沒關系,《深入理解java虛擬機:jvm高級特性與最佳實踐》極盡化繁為簡之妙,能帶領你在輕松中領略java虛擬機的奧秘。《深入理解java虛擬機:jvm高級特性與最佳實踐》是近年來國內出版的唯一一本與java虛擬機相關的專著,也是唯一一本同時從核心理論和實際運用這兩個角度去探討java虛擬機的著作,不僅理論分析得透徹,而且書中包含的典型案例和最佳實踐也極具現實指導意義。
全書共分為五大部分。第一部分從宏觀的角度介紹了整個java技術體系的過去、現在和未來,以及如何獨立地編譯一個openjdk7,這對理解後面的內容很有幫助。第二部分講解了jvm的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產生的原因;常見的垃圾收集演算法以及垃圾收集器的特點和工作原理;常見的虛擬機的監控與調試工具的原理和使用方法。第三部分分析了虛擬機的執行子系統,包括class的文件結構以及如何存儲和訪問class中的數據;虛擬機的類創建機制以及類載入器的工作原理和它對虛擬機的意義;虛擬機位元組碼的執行引擎以及它在實行代碼時涉及的內存結構。第四部分講解了程序的編譯與代碼的優化,闡述了泛型、自動裝箱拆箱、條件編譯等語法糖的原理;講解了虛擬機的熱點探測方法、hotspot的即時編譯器、編譯觸發條件,以及如何從虛擬機外部觀察和分析jit編譯的數據和結果。第五部分探討了java實現高效並發的原理,包括jvm內存模型的結構和操作;原子性、可見性和有序性在java內存模型中的體現;先行發生原則的規則和使用;線程在java語言中的實現原理;虛擬機實現高效並發所做的一系列鎖優化措施。
《深入理解java虛擬機:jvm高級特性與最佳實踐》適合所有java程序員、系統調優師和系統架構師閱讀。
④ jvm原理是什麼呢
jvm原理是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種利用軟體方法實現的抽象的計算機基於下層的操作系統和硬體平台,可以在上面執行java的位元組碼程序,java編譯器只要面向JVM,生成JVM能理解的代碼或位元組碼文件。
jvm執行程序的過程
載入.class文件,管理並分配內存,執行垃圾收,四步完成JVM環境,創建JVM裝載環境和配置,裝載JVM.dll,初始化JVM.dll並掛界到JNIENV(JNI調用介面)實例,調用JNIEnv實例裝載並處理class類。
JVM實例和JVM執行JVM實例對應了一個獨立運行的java程序,進程級別, 一個運行時的Java虛擬機(JVM)負責運行一個Java程序,當啟動一個Java程序時,一個虛擬機實例誕生,當程序關閉退出,這個虛擬機實例也就隨之消亡。
⑤ 深入探索Java工作原理:JVM,內存回收及其他
Java語言引入了Java虛擬機 具有跨平台運行的功能 能夠很好地適應各種Web應用 同時 為了提高Java語言的性能和健壯性 還引入了如垃圾回收機制等新功能 通過這些改進讓Java具有其獨特的工作原理
.Java虛擬機
Java虛擬機(Java Virtual Machine JVM)是軟體模擬的計算機 它可以在任何處理器上(無論是在計算機中還是在其他電子設備中)安全兼容地執行保存在 class文件中的位元組碼 Java虛擬機的 機器碼 保存在 class文件中 有時也可以稱之為位元組碼文件
升大團Java程序的跨平台特性主要是指位元組碼文件可以在任何具有Java虛擬機的計算機或者電子設備上運行 Java虛擬機中的Java解釋器負責將位元組碼文件解釋成為特定的機器碼進行運行 因此在運行時 Java源程序需要通過編譯器編譯成為 class文件
Java虛擬機的建立需要針對不同的軟硬體平台來實現 既要考慮處理器的型號 也要考慮操作系統的種類 由此在SPARC結構 X 結構 MIPS和PPC等嵌入式處理晶元上 在UNIX Linux Windows和部分實時操作系統上都可實現Java虛擬機
.無用內存自動回收機制
在程序的執行過程中 部分內存在使用過後就處於廢棄狀態 如果不及時進行回收 很有可能會導致內存泄漏 進而引發系統崩潰 在C++語言中是由程序員進行內存回收的 程序員需要在編寫程序時把不再使用的對象內存釋放掉 這種人為管理內存釋放的方法往往由於程序員的疏忽而致使內存無法回收 同時也增加了程序員的工作量 而在Java運行環境中 始終存在著一個系統級的線程 專門跟蹤內存的使用情況 定期檢測出不再使用的內存 並自動進行回收 避免了內存的泄露 也減輕了程序員的工作量
.代碼安全性檢查機制
安全和方便總是相對矛盾的 Java編程語吵橘言的出現使得客戶端計算機可以方便地從網路上上傳或下載Java程序到本地計算機上運行 但是如何保證該Java程序不攜帶病毒或者沒有其他危險目的呢?為了確保Java程序執行的安全性 Java語言通過Applet程序來控制非法程序的安全性 也就是有了它才確保Java語言的生存
Java位元組碼的執行需要經過以下 個步驟
( )由類裝載器(class loader)負責把類文件( class文件)載入到Java虛擬機中 在此仿悉過程需要檢驗該類文件是否符合類文件規范
( )位元組碼校驗器(bytecode verifier)檢查該類文件的代碼中是否存在著某些非法操作 例如Applet程序中寫本地計算機文件系統的操作
( )如果位元組碼校驗器檢驗通過 由Java解釋器負責把該類文件解釋成為機器碼進行執行
注意
Java虛擬機採用 沙箱 運行模式 即把Java程序的代碼和數據都限制在一定內存空間里執行 不允許程序訪問該內存空間以外的內存 如果是Applet程序 還不允許訪問客戶端機器的文件系統
Java的運行環境
無論哪種語言都需要有它特定的運行環境 也就是平台 Java語言同樣不例外 但是如何理解Java程序與硬體環境無關呢?
幾乎所有的語言都需要通過編譯或者解釋才可以被計算機執行 但是Java有一點不同 它同時需要這兩個過程 其實 也正是因為這個原因才使Java這種語言具有了平台無關性 當完成一個Java源程序後 首先 通過Java翻譯程序將它編譯成一種叫做位元組碼的中間代碼 然後再由Java平台的解釋器將它轉換成為機器語言來執行 這一平台的核心就是JVM
Java的編譯過程與其他的語言不同 像C++這樣的語言 在編譯時它是與計算機的硬體平台信息密不可分的 編譯程序通過查表將所有指令的操作數和操作碼等轉換成內存的偏移量 即程序運行時的內存分配方式 目的是保證程序正常運行 而Java卻是將指令轉換成為一種 class的文件 這種文件不包含硬體的信息 需要執行時只要經過安裝有JVM的機器進行解釋 創建內存分配後再通過查表來確定一條指令所在的地址 這樣就有效地保證了Java的可移植性和安全性
Java平台具有這樣的特性和它的結構有關 通常一個程序運行的平台是一個硬體或者軟體運行的環境 目前比較流行的是Windows XP Linux Solaris和MacOS Java的平台不太一樣 它由兩個部分組成 即JVM和應用程序設計介面
.JVM
JVM是Java平台的核心 為了讓編譯產生的位元組碼能更好地解釋與執行 因此把JVM分成了 個部分 JVM解釋器 指令系統 寄存器 棧 存儲區和碎片回收區
◆JVM解釋器 即這個虛擬機處理欄位碼的CPU
◆JVM指令系統 該系統與計算機很相似 一條指令由操作碼和操作數兩部分組成 操作碼為 位二進制數 主要是為了說明一條指令的功能 操作數可以根據需要而定 JVM有多達 種不同的操作指令
◆寄存器 JVM有自己的虛擬寄存器 這樣就可以快速地與JVM的解釋器進行數據交換 為了功能的需要 JVM設置了 個常用的 位寄存器 pc(程序計數器) optop(操作數棧頂指針) frame(當前執行環境指針)和vars(指向當前執行環境中第一個局部變數的指針)
◆JVM棧 指令執行時數據和信息存儲的場所和控制中心 它提供給JVM解釋器運算所需要的信息
◆存儲區 JVM存儲區用於存儲編譯過後的位元組碼等信息
◆碎片回收區 JVM碎片回收是指將使用過的Java類的具體實例從內存進行回收 這就使得開發人員免去了自己編程式控制制內存的麻煩和危險 隨著JVM的不斷升級 其碎片回收的技術和演算法也更加合理 JVM 版後產生了一種叫分代收集技術 簡單來說就是利用對象在程序中生存的時間劃分成代 以此為標准進行碎片回收
.Java應用程序設計介面
Java Application Programming Interface簡稱Java API 其中文名為Java應用程序設計介面 它是一個軟體集合 其中有許多開發時所需要的控制項 可以用它來輔助開發
lishixin/Article/program/Java/hx/201311/26733
⑥ Java的運行原理及JVM虛擬機是怎麼工作的
運行原理:
java程序就是花盆裡的花,花盆就是虛擬機。花盆你放在哪裡(系統平台)都可以,不影響花的生長。就這么簡單
JVM的工作原理:
首先,JVM就是指JAVA虛擬機
首先編譯器,先將java程序源代碼編譯成位元組碼。
運行程序時:JVM會載入和解釋位元組碼,並通過JAVA虛擬機運行
這個問題,有很多詳細的資料可查
⑦ 簡述Java程序從編寫到運行的基本步驟,並說明Java的基本工作原理
Java編譯原理:
Java 虛擬機(JVM)是可運行Java 代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。
一.Java源文件的編譯、下載 、解釋和執行
Java應用程序的開發周期包括編譯、下載 、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。這一編譯過程同C/C++ 的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全 性。
運行JVM位元組碼的工作是由解釋器來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。
隨後,被裝入的代碼由位元組碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。通過校驗後,代碼便開始執行了。
Java位元組碼的執行有兩種方式:
1.即時編譯方式:解釋器先將位元組碼編譯成機器碼,然後再執行該機器碼。
2.解釋執行方式:解釋器通過每次解釋並執行一小段代碼來完成Java位元組碼程 序的所有操作。
通常採用的是第二種方法。由於JVM規格描述具有足夠的靈活性,這使得將位元組碼翻譯為機器代碼的工作
具有較高的效率。對於那些對運行速度要求較高的應用程序,解釋器可將Java位元組碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。