jvm編譯器動作排序
java編譯器
java語言寫的源程序通過java編譯器,編譯成與平台無關的『位元組碼程序』(.class文件,也就是0,1二進製程序),然後在os之上的java解釋器中解釋執行。
也相當與
註:jvm(java虛擬機)包括解釋器,不同的jdk虛擬機是相同的,解釋器不同。
jvm-java虛擬機
.jvm:是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種利用軟體方法實現的抽象的計算機基於下層的操作系統和硬體平台,可以在上面執行java的位元組碼程序。
java編譯器只要面向jvm,生成jvm能理解的代碼或位元組碼文件。java源文件經編譯成位元組碼程序,通過jvm將每一條指令翻譯成不同平台機器碼,通過特定平台運行。
jvm執行程序的過程:
i.載入。class文件
ii.管理並分配內存
iii.執行垃圾收集
jre(java運行時環境)由jvm構造的java程序的運行環境
編譯時
運行時
Ⅱ java編譯器和JVM有什麼區別
java編譯器把java源碼編譯成位元組碼 (.class文件).
jvm是在運行期將class文件編譯成機器碼文件.供程序運行.
Ⅲ 關於JVM和編譯器
編譯為位元組碼的JAVA程序可以直接在JVM上運行,無需再次編譯.
C程序必須在不同的平台重新編譯,並且可能需要依據不同的系統修改程序中用到的數據類型.
Ⅳ 我後天要去三星SDS做JAVA筆試題,請問有哪個高人去過,有筆試和面試題的呀,好了再補分
面向對象的特徵有哪些方面
1. 抽象:抽象就是忽略一個主題中與當前目標2. 無關的那些方面,3. 以便更充分地注意與當前目標4. 有關的方面。抽象並不5. 打算了解全部問題,而6. 只是選擇其中的一部分,7. 暫時不8. 用部分細節。抽象包括兩個方面,9. 一是過程抽象,10. 二是數據抽象。
11. 繼承:繼承是一種聯結類的層次模型,12. 並且允許和鼓勵類的重用,13. 它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,14. 這個過程稱為類繼承。新類繼承了原始類的特性,15. 新類稱為原始類的派生類(子類),而16. 原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和實例變數,17. 並且類可以修改或增加新的方法使之更適合特殊的需要。
18. 封裝:封裝是把過程和數據包圍起來,19. 對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,20. 即現實世界可以被描繪成一系列完全自治、封裝的對象,21. 這些對象通過一個受保護的介面訪問其他對象。
22. 多態性:多態性是指23. 允許不同24. 類的對象對同25. 一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,26. 很好的解決了應用程序函數同27. 名28. 問題。
2、String是最基本的數據類型嗎?
基本數據類型包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類
3、int 和 Integer 有什麼區別
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。
原始類型封裝類booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble
引用類型和原始類型的行為完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的預設值。對象引用實例變數的預設值為 null,而原始類型實例變數的預設值與它們的類型有關。
4、String 和StringBuffer的區別
JAVA平台提供了兩個類:String和StringBuffer,它們可以儲存和操作字元串,即包含多個字元的字元數據。這個String類提供了數值不可改變的字元串。而這個StringBuffer類提供的字元串進行修改。當你知道字元數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字元數據。
5、運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
6、說出Servlet的生命周期,並說出Servlet和CGI的區別。
Servlet被伺服器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將實例銷毀的時候調用其destroy方法。
與cgi的區別在於servlet處於伺服器進程中,它通過多線程方式運行其service方法,一個實例可以服務於多個請求,並且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成後就銷毀,所以效率上低於servlet。
7、說出ArrayList,Vector, LinkedList的存儲性能和特性
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。
8、EJB是基於哪些技術實現的?並說出SessionBean和EntityBean的區別,StatefulBean和StatelessBean的區別。
EJB包括Session Bean、Entity Bean、Message Driven Bean,基於JNDI、RMI、JAT等技術實現。
SessionBean在J2EE應用程序中被用來完成一些伺服器端的業務操作,例如訪問資料庫、調用其他EJB組件。EntityBean被用來代表應用系統中用到的數據。
對於客戶機,SessionBean是一種非持久性對象,它實現某些在伺服器上運行的業務邏輯。
對於客戶機,EntityBean是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業應用程序實現的實體。
Session Bean 還可以再細分為 Stateful Session Bean 與 Stateless Session Bean ,這兩種的 Session Bean都可以將系統邏輯放在 method之中執行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態,因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體。Stateless Session Bean 雖然也是邏輯組件,但是他卻不負責記錄使用者狀態,也就是說當使用者呼叫 Stateless Session Bean 的時候,EJB Container 並不會找尋特定的 Stateless Session Bean 的實體來執行這個 method。換言之,很可能數個使用者在執行某個 Stateless Session Bean 的 methods 時,會是同一個 Bean 的 Instance 在執行。從內存方面來看, Stateful Session Bean 與 Stateless Session Bean 比較, Stateful Session Bean 會消耗 J2EE Server 較多的內存,然而 Stateful Session Bean 的優勢卻在於他可以維持使用者的狀態。
9、Collection 和 Collections的區別。 Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
10、&和&&的區別。 &是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。
11、HashMap和Hashtable的區別。 HashMap是Hashtable的輕量級實現(非線程安全
的實現),他們都完成了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。
Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差異。
12、final, finally, finalize的區別。 final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。finally是異常處理語句結構的一部分,表示總是執行。finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
13、sleep() 和 wait() 有什麼區別? sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池准備獲得對象鎖進入運行狀態。
14、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被「屏蔽」了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
15、error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。
16、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用非同步編程,在很多情況下採用非同步途徑往往更有效率。
17、abstract class和interface有什麼區別?聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。
還有一些個。。。
留下你的郵箱我發給你.
我的郵箱是:[email protected]
只要掌握這些就不怕了。。。
郵件都給你發了怎麼還沒結束呢???
。。。。。。。。。。
Ⅳ 編譯器 JVM JDK JRE JSE是什麼 關系都有什麼用,都怎麼樣工作的
java是面向對象編程,一切皆對象。這個觀念要以後慢慢才能了解,無論怎麼樣講都是初學者理解不了的。所以還需要多多練習。
C語言是面向過程編程的。所以沒有「類」的概念,而java的類卻更符合人類的思維方式,C語言更符合機器的思維方式。
還有就是,千萬不要把C語言的一些概念和java混淆,這是兩種不同類型的語言,java是純的面向對像的編程語言,而C是面向過程的。以後的學習中你會發現java比C更有優勢。再重申一下,最好不要把C的概念和java做對比。你把java當作一門新的語言來學。 唯一可以借鑒C的就是語法和編程的一些基本概念如數據類型,設計模式之類的。
jvm 是java虛擬機,將java的class位元組碼文件翻譯成二進制可執行程序。
jdk 是java的開發包 java sdk, java的開發工具,包含SUN公司提供的java API,將java源碼編譯為class位元組碼文件,通常jdk中就包含了jre。
jre 是java運行時,用於執行java程序。
jse 是java標准開發,jse 就是java開發的一種,標准開發,例如開發桌面程序。
其餘的還有 javaEE, javaMe 前者是java的企業應用,後者是java的嵌入式開發,例如java手機程序。
如果netbeans能運行,說明你安裝的netbeans已經包含了JDK,而jdk里已經包含了jre和jvm,故以後就可以省心了,至於環境變數的事情,你可以去搜索一下,很簡單的配置,有個好消息告訴你,如果你是按照安裝向導操作的,向導會自動將環境變數寫進去。
java基礎類庫就是API,而你說的「庫」我不太明白是什麼意思。
jdk是開發工具包,裡麵包含 javaSE, JRE, JVM
jdk 把.java文件編譯成為.class位元組碼文件
然後JRE調用JVM將位元組碼文件翻譯成可供機器執行的程序。就這樣了啊。
最後說一句: 不推薦使用Netbeans, 現在公司里都用Eclipse,這才是趨勢。
************************************8
繼續補充
angelicdemon 所說的沒錯,IDE環境會在配置文件里自己寫上jdk和jre的路徑以便找到他們。
但是經過安裝向導安裝jdk後確實會自動將java所需要的環境變數寫進系統環境變數中。再有,如果使用IDE的話 環境變數沒啥用處,只有用命令行模式編譯java源碼才會有用處。
另外: Eclipse絕對是現在公司的首選,因為公司里的項目用ECLIPSE構建的,源碼上傳到版本控制系統後,同步後,你用Netbeans打不開,還得重新構建,麻煩嗎? 再說了NB和EC還是有相當大區別的。
還有就是,這句話最重要,如果你真的是java初學者,絕對不要用IDE,用記事本+命令行 這樣才能真正掌握java的機理。 哈哈 累死我了,就寫到這吧
angelicdemon 看來也和這貼幹上了。
一會兒這貼成論文貼了
***********************************
以上回答可能有錯誤,要參考其他人的答案。
Ⅵ jdk jre jvm執行順序
JVM(JAVA虛擬機),是可以運行JAVA代碼的假想計算機,主要任務是把JAVA位元組碼編譯成特定計算機的機器指令,是JAVA實現「一次運行,處處運行」的關鍵;
JDK是JAVA的核心,包括JRE(JAVA 虛擬環境)、編譯器等,JDK的主流產品是由SUN公司開發的,JDK本身是用JAVA編寫的,安裝包的SRC.ZIP就是JDK的源碼;
JRE是JAVA運行環境,包括JVM、JAVA平台核心類和支持文件,如果只是運行JAVA程序的話,可以下載JRE就可以了,如果要開發的話,就要下JDK了。
Ⅶ JVM的組成和運行原理是什麼
JVM是Java Virtual Machine(Java虛擬機)的縮寫。
1、JVM的組成:
JVM 由類載入器子系統、運行時數據區、執行引擎以及本地方法介面組成。
2、JVM的運行原理:
JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種基於下層的操作系統和硬體平台並利用軟體方法來實現的抽象的計算機,可以在上面執行java的位元組碼程序。java編譯器只需面向JVM,生成JVM能理解的代碼或位元組碼文件。Java源文件經編譯器,編譯成位元組碼程序,通過JVM將每一條指令翻譯成不同平台機器碼,通過特定平台運行。
Ⅷ jdk中有編譯器,解釋器,jvm,那麼它們是如何配合工作的呢
Java源代碼---->編譯器---->Java位元組碼(即虛擬指令)---->jvm---->解釋器----->二進制機器碼
Ⅸ JVM的運行機制是什麼
學過編譯原理沒有?先編譯成位元組碼(自己寫的編譯器識別的可運行的代碼);JVM解釋器運行代碼時,JVM根據底層操作系統的不同會調用早已適配好的底層語言代碼庫(比如windows多數是.dll,linux是.so之類)
Ⅹ java中eclipse,jdk,jvm,jre,編譯器的區別
JVM就是常說的java虛擬機,它是整個java實現跨平台的 最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可 以在虛擬機上執行,也就是說class並不直接與機器的操作系統相對應,而是經過虛擬機間接與操作系統交互,由虛擬機將程序解 釋給本地系統執行。
JVM 是 Java 平台的基礎,和實際的機器一樣,它也有自己的指令集,並且在運行 時操作不同的內存區域。 JVM 通過抽象操作系統和 CPU 結構,提供了一種與平台無關的代碼執行方法,即與特殊的實現方 法、主機硬體、主機操作系統無關。但是在一些小的方面, JVM 的實現也是互不相同的,比如垃圾回收 演算法,線程調度演算法(可能不同 OS 有不同的實現)。JVM 的主要工作是解釋自己的指令集(即位元組碼)到 CPU 的指令集或 OS 的系統調用,保護用戶免被惡意程序騷擾。 JVM 對上層的 Java 源文件是不關心的,它關注的只是由源文件生成的類文件( class file )。類文件的 組成包括 JVM 指令集,符號表以及一些補助信息。
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開發工具包,基本上每個學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去掉了.