19四、說一下JVM的主要組成部分? 及其做用?spa
1) 類加載器 (ClassLoader)操作系統
2) 運行時數據區 (Runtime Data Area)線程
3) 執行引擎 (Execution Engine)翻譯
4) 本地庫接口 (Native Interface)對象
組件的做用: 首先經過類加載器(ClassLoader)會把Java代碼轉換成字節碼, 運行時數據區(Runtime Data Area)再把字節碼加載到內存中,而字節碼文件只是JVM的一套指令集規範,並不能直接交給底層操做系統去執行,所以須要特定的命令解析器執行引擎(Execution Engine),將字節碼翻譯成底層指令,再交給CPU去執行,而這個過程當中須要調用其餘語言的本地庫接口(Native Interface)來實現這個程序的功能。接口
19五、說如下JVM運行時數據區?隊列
不一樣虛擬機的運行數據區可能略微有所不一樣,可是都會聽從Java虛擬機規範,Java虛擬機規範規定的區域爲如下5個部分:內存
1) 程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器, 字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令,分支,循環,跳轉,異常處理,線程恢復等基礎功能,都須要依賴這個計數器完成。虛擬機
2)Java虛擬機棧(Java Virtual Machine Stacks): 用於存儲局部變量,操做數棧,動態連接,方法出口等信息。io
3)本地方法棧(Native Method Stack): 與虛擬機棧的做用同樣的,只不過虛擬機棧服務Java方法的,而本地方法棧是爲虛擬機調用Native方法服務的;
4) Java堆(Java Heap): Java虛擬機中內存最大的一塊,是被全部線程共享的,幾乎全部的對象實例都在這裏分配內存
5) 方法區(Method Area): 用於存儲已經被虛擬機加載的類信息,常量,靜態變量,即時編譯後的代碼等數據。
19六、說一下堆棧的區別?
功能方面: 堆是用來存放對象的,棧是用來執行程序的。
共享性: 堆是線程共享的,棧是線程私有的。
空間大小 : 堆大小遠遠大於棧。
19七、隊列和棧的是什麼? 有什麼區別?
隊列和棧都是被用來預存儲數據的。
隊列容許先進先出進行檢索原生,但也有例外的狀況,Deque接口容許從兩端檢索元素。
棧和隊列很類似,可是他容許對元素後進先出進行檢索。
198. 什麼是雙親委派
在介紹雙親委派模型以前,先說下類加載器。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在JVM中的惟一性,每個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將class文件加載JVM內存中,而後再轉化爲class對象
類加載器的分類:
1)啓動加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_Home/lib/目錄中的,或者被-XBootclasspath參數所指定的路徑中而且被虛擬機識別的類庫。
2)其它類加載器
21)擴展類加載器(Extension ClassLoader)
19九、說一下類加載的執行過程?
1)加載: 根據查找路徑找到相應的class文件而後導入
2)檢查: 檢查加載的class文件的正確性
3) 準備: 給類中的靜態變量分配內存空間
4) 解析: 虛擬機將常量池中的符合引用替換成直接引用的過程。符號引用就理解爲一個標示,而在直接引用直接指向內存中的地址
5) 初始化: 對靜態變量和靜態代碼塊執行初始化工做。