1:什么是jvm
是運行所有Java程序的抽象計算機,運行所有Java程序的抽象計算機,是Java語言的運行環境,它是Java 最具吸引力的特性之一。
java的跨平台是必須要有jvm的支持,就是不同平台支持jvm,然后才能一份java程序在不同平台運行。
參考: java虛擬機
2:進程角度
虛擬機jvm就是一個操作系統中的進程實例
jvm在操作系統中運行,進程是操作系統的執行單位,啟動一個java的程序,就是一個JVM進程實例,虛擬機進程啟動就緒,然后由虛擬機中的類加載器加載必要的class文件,包括jdk中的基礎類(如String和Object等),然后由虛擬機進程解釋class字節碼指令,把這些字節碼指令翻譯成本機cpu能夠識別的指令,才能在cpu上運行。
3: jvm如何吃進java語言編寫的程序?
java虛擬機內部,有一個叫做類加載器的子系統,這個子系統用來在運行時根據需要加載類,
"根據需要"
在Java虛擬機執行過程中,只有他需要一個類的時候,才會調用類加載器來加載這個類,並不會在開始運行時加載所有的類。
4:jvm如何處理java的字節碼文件?
由虛擬機加載的類,被加載到Java虛擬機內存中之后,虛擬機會讀取並執行它里面存在的字節碼指令。虛擬機中執行字節碼指令的部分叫做執行引擎。Java虛擬機會進行自動內存管理。具體說來就是自動釋放沒有用的對象,而不需要程序員編寫代碼來釋放分配的內存。這部分工作由垃圾收集子系統負責。
從上面的論述可以知道, 一個Java虛擬機實例在運行過程中有三個子系統來保障它的正常運行,分別是類加載器子系統, 執行引擎子系統和垃圾收集子系統。 如下圖所示:

虛擬機的運行,必須加載class文件,並且執行class文件中的字節碼指令。它做這么多事情,必須需要自己的空間。就像人吃下去的東西首先要放在胃中。這里的空間就是內存了。
5: 什么是jvm的空間或者內存?
虛擬機也需要空間來存放個中數據。首先,加載的字節碼,需要一個單獨的內存空間來存放;一個線程的執行,也需要內存空間來維護方法的調用關系,存放方法中的數據和中間計算結果;在執行的過程中,無法避免的要創建對象,創建的對象需要一個專門的內存空間來存放。

小結:
1: 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。
2: 這個叫做虛擬機的進程比較特殊,它能夠加載我們編寫的class文件。如果把JVM比作一個人,那么class文件就是我們吃的食物。
3: 加載class文件的是一個叫做類加載器的子系統。就好比我們的嘴巴,把食物吃到肚子里。
4: 虛擬機中的執行引擎用來執行class文件中的字節碼指令。就好比我們的腸胃,對吃進去的食物進行消化。
5: 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之后,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。
后面將分析類加載子系統,內存分配,垃圾收集子系統的原理。
來一張框架圖:
