『壹』 JVM的組成和運行原理是什麼
JVM是java Virtual Machine(Java虛擬機)的縮寫。
1、JVM的組成:
JVM 由類載入器子系統、運行時數據區、執行引擎以及本地方法介面組成。
2、JVM的運行原理:
JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種基於下層的操作系統和硬體平台並利用軟體方法來實現的抽象的計算機,可以在上面執行java的位元組碼程序。java編譯器只需面向JVM,生成JVM能理解的代碼或位元組碼文件。Java源文件經編譯器,編譯成位元組碼程序,通過JVM將每一條指令翻譯成不同平台機器碼,通過特定平台運行。
『貳』 java編譯器和JVM有什麼區別
java編譯器把java源碼編譯成位元組碼 (.class文件).
jvm是在運行期將class文件編譯成機器碼文件.供程序運行.
『叄』 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 JVM如何學習?首先要了解他的類型!
java虛擬機學習
數據類型(基本類型、引用類型)====>數值本身、引用值 2. 堆、棧=====>棧是運行時的單位(如何處理數據),堆是存儲的單位(數據如何存儲)
------棧因為是運行單位,因此裡面存儲的信息都是跟當前線程(或程序相關信息的。包括局部變數、程序運行狀態、方法返回值等等;而堆只負責存儲對象信息。在Java中,Main函數就是棧的起始點,也是程序的起始點。堆中存的是對象,棧中存的是基本數據類型和堆中對象的引用
Java中的參數傳遞時傳值呢?還是傳引用?
a) 程序運行永遠都是在棧中進行的,因而參數傳遞時,只存在傳遞基本類型和對象引
用的問題。不會直接傳對象本身。
b) Java在方法調用傳遞參數時,因為沒有指針,所以它都是進行傳值調用
c) 堆和棧中,棧是程序運行最根本的東西。程序運行可以沒有堆,但是不能沒有棧。
而堆是為棧進行數據存儲服務,說白了堆就是一塊共享的內存。不過,正是因為堆和棧的分離的思想,才使得Java的垃圾回收成為可能
Java對象的大小
a) 一個空Object對象的大小是8byte(沒有任何屬性的對象) b) Object ob = new Object();所佔的空間為:4byte+8byte。4byte是上面部分所說的Java
棧中保存引用的所需要的空間。而那8byte則是Java堆中對象的信息.不論什麼樣的Java對象,其大小都必須是大於8byte
c) Java在對對象內存分配時都是以8的整數倍來分,基本類型包裝類的大小至少是
16byte
引用類型
a) 對象引用類型分為強引用、軟引用、弱引用和虛引用。
b) 強引用:就是我們一般聲明對象是時虛擬機生成的引用,強引用環境下,垃圾回收
時需要嚴格判斷當前對象是否被強引用,如果被強引用,則不會被垃圾回收 c) 軟引用:軟引用一般被作為緩存來使用。與強引用的區別是,軟引用在垃圾回收時,
虛擬機會根據當前系統的剩餘內存來決定是否對軟引用進行回收。如果剩餘內存比較緊張,則虛擬機會回收軟引用所引用的空間;如果剩餘內存相對富裕,則不會進行回收。換句話說,虛擬機在發生OutOfMemory時,肯定是沒有軟引用存在的。 d) 弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在
進行垃圾回收時,是一定會被回收掉的,因此其生命周期只存在於一個垃圾回收周期內。
JVM調優總結(三)-基本垃圾回收演算法 7. 垃圾回收面臨的問題
a) 如何區分垃圾。垃圾回收的起點是一些根對象(java棧, 靜態變數, 寄存器...)。而
最簡單的Java棧就是Java程序執行的main函數 b) 如何處理碎片。「復制」方式和「標記-整理」方式,都可以解決碎片的問題。 c) 如何解決同時存在的對象創建和對象回收問題;在現有的垃圾回收方式中,要進行
垃圾回收前,一般都需要暫停整個應用(即:暫停內存的分配),然後進行垃圾回收,回收完成後再繼續應用
8. 分代垃圾回收詳述
a) 為什麼要分代:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可
以採取不同的收集方式,以便提高回收效率。
b) 如何分代虛擬機中的共劃分為三個代:年輕代(Young Generation)、年老點(OldGeneration)和持久代(Permanent Generation)。其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關系不大。年輕代和年老代的劃分是對垃圾收集影響比較大的
什麼情況下觸發垃圾回收GC有兩種類型:Scavenge GC(當新對象生成,並且在Eden
申請空間失敗時,就會觸發Scavenge GC,對Eden區域進行GC,清除非存活對象,並且把尚且存活的對象移動到Survivor區)和Full GC(對整個堆進行回收)
典型配置舉例
a) 堆大小設置
b) 回收器選擇。串列收集器、並行收集器、並發收集器,但是串列收集器只適用於小
數據量的情況,所以這里的選擇主要針對並行收集器和並發收集器。
垃圾回收的瓶頸
a) 傳統分代垃圾回收方式,已經在一定程度上把垃圾回收給應用帶來的負擔降到了最
小,把應用的吞吐量推到了一個極限。但是他無法解決的一個問題,就是Full GC所帶來的應用暫停
學習java的夥伴加我的 群去下載視頻資料 540-998-279!
『伍』 關於JVM和編譯器
編譯為位元組碼的JAVA程序可以直接在JVM上運行,無需再次編譯.
C程序必須在不同的平台重新編譯,並且可能需要依據不同的系統修改程序中用到的數據類型.
『陸』 什麼是JVMJava跨平台的原理是什麼
首先我們要理解什麼是跨平台,所謂的跨平台就是JAVA寫的一份代碼可以在任意的操作系統平台上運行。
為什麼跨平台會成為一個問題呢?因為每一個操作系統平台支持不同的指令集我們所寫的代碼經過編譯之後只能適用於一個平台,換一個平台就不支持了。而JAVA完美的解決了這個問題。
Java的一大特色就是「write once, run anywhere」即「一次編譯,到處運行」。就是說你不用專門為每個平台寫一份代碼,你寫的Java程序在任何平台都能跑起來。
它的實現原理是在系統層面上又增加了一層虛擬機(Java Virtual Machine,簡稱JVM),且為每個平台都定製了對應的虛擬機。然後Java程序是在虛擬機上跑的,因此平台無關。
Java的運行流程是:程序員寫了源代碼(Source Code,.java後綴,跨平台),然後經過編譯器編譯成位元組碼(Byte Code,.class後綴,二進制文件),位元組碼是所有虛擬機都能理解的中間文件。然後交給虛擬機(每個平台都有對應的虛擬機)去運行。
所以對「write once, run anywhere」更准確的理解是,「一次編譯,到處裝虛擬機,所以到處運行」。
整個流程如下圖所示。
『柒』 如何實現一個能在jvm上運行的語言的編譯器
讀讀下面這本書就可以有個大體概念:
Language Implementation Patterns
還有一本,我沒讀過不過主題挺合適題主的:
Introction to Compiler Construction in a Java World
如果按問題描述來,「Scala、Clojure、JRuby這類的編程語言是如何實現的?」,要回答這個問題就得下到更細節的層面,不是三言兩語能說清楚的。
偷個懶,還是建議題主先讀讀前面兩本書再說。
Scala和Clojure在JVM上的實現都是把程序靜態編譯到Java位元組碼然後再交由JVM執行。
JRuby自身有混合執行系統,有一個用Java寫的解釋器和一個編譯器。
解釋器可以直接解釋執行Ruby程序。以前JRuby的解釋器是AST解釋器,新版用的是一個IR解釋器。
編譯器把Ruby程序編譯為Java位元組碼再交給JVM執行,不過這個編譯通常是運行時做的而不像Scala和Clojure是靜態做的。
『捌』 jvm怎麼編譯運行類的
設置好環境變數後,運行cmd.exe,cd到你*.java目錄
使用命令:javac *.java來編譯java文件
java * 來運行文件。
『玖』 JAVA游戲中的.class文件是干什麼的,什麼意思是怎麼編譯的我自己該怎麼製作一個可執行的J
.class是類文件,裡面就是代碼,源文件是 xx.java,編譯後會成為xx.class文件,由java的jvm編譯,如果你要做一個java程序,先要在你的電腦安裝jdk,然後就是開放工具,你可以下個 myEclipse ,買本看或者在網上找找一些教學視頻吧。