Git常用命令面試題 60道
Java內(nèi)存模型
1. 我們開發(fā)人員編寫的Java代碼是怎么讓電腦認識的
首先先了解電腦是二進制的系統(tǒng),他只認識 01010101
比如我們經(jīng)常要編寫 HelloWord.java 電腦是怎么認識運行的HelloWord.java是我們程序員編寫的,我們?nèi)丝梢哉J識,但是電腦不認識
Java文件編譯的過程
1. 程序員編寫的.java文件
2. 由javac編譯成字節(jié)碼文件.class:(為什么編譯成class文件,因為JVM只認識.class文件)
3. 在由JVM編譯成電腦認識的文件 (對于電腦系統(tǒng)來說 文件代表一切)

2. 為什么說java是跨平臺語言
這個跨平臺是中間語言(JVM)實現(xiàn)的跨平臺
Java有JVM從軟件層面屏蔽了底層硬件、指令層面的細節(jié)讓他兼容各種系統(tǒng)難道 C 和 C++ 不能跨平臺嗎?
其實也可以 C和C++需要在編譯器層面去兼容不同操作系統(tǒng)的不同層面,寫過C和C++的就知道不同操作系統(tǒng)的有些代碼是不一樣
3. Jdk和Jre和JVM的區(qū)別
Jdk包括了Jre和Jvm,Jre包括了Jvm
Jdk是我們編寫代碼使用的開發(fā)工具包
Jre 是Java的運行時環(huán)境,他大部分都是 C 和 C++ 語言編寫的,他是我們在編譯java時所需要的基礎的類庫
Jvm俗稱Java虛擬機,他是java運行環(huán)境的一部分,它虛構出來的一臺計算機,在通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)Java應用程序
看Java官方的圖片,Jdk中包括了Jre,Jre中包括了JVM

4. 說一下 JVM由那些部分組成,運行流程是什么?
JVM包含兩個子系統(tǒng)和兩個組件: 兩個子系統(tǒng)為Class loader(類裝載)、Execution engine(執(zhí)行引擎); 兩個組件為Runtime data area(運行時數(shù)據(jù)區(qū))、Native Interface(本地接口)。
Class loader(類裝載):根據(jù)給定的全限定名類名(如:java.lang.Object)來裝載class文件到Runtime data area中的method area。
Execution engine(執(zhí)行引擎):執(zhí)行classes中的指令。
Native Interface(本地接口):與native libraries交互,是其它編程語言交互的接口。
Runtime data area(運行時數(shù)據(jù)區(qū)域):這就是我們常說的JVM的內(nèi)存。
流程 :首先通過編譯器把 Java 代碼轉換成字節(jié)碼,類加載器(ClassLoader)再把字節(jié)碼加載到內(nèi)存中,將其放在運行時數(shù)據(jù)區(qū)(Runtime data area)的方法區(qū)內(nèi),而字節(jié)碼文件只是 JVM 的一套指令集規(guī)范,并不能直接交給底層操作系統(tǒng)去執(zhí)行,因此需要特定的命令解析器執(zhí)行引擎(Execution Engine),將字節(jié)碼翻譯成底層系統(tǒng)指令,再交由 CPU 去執(zhí)行,而這個過程中需要調(diào)用其他語言的本地庫接口(Native Interface)來實現(xiàn)整個程序的功能。
5. 說一下 JVM 運行時數(shù)據(jù)區(qū)
Java 虛擬機在執(zhí)行 Java 程序的過程中會把它所管理的內(nèi)存區(qū)域劃分為若干個不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷毀的時間,有些區(qū)域隨著虛擬機進程的啟動而存在,有些區(qū)域則是依賴線程的啟動和結束而建立和銷毀。Java 虛擬機所管理的內(nèi)存被劃分為如下幾個區(qū)域:
簡單的說就是我們java運行時的東西是放在那里的

程序計數(shù)器(Program Counter Register):當前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解析器的工作是通過改變這個計數(shù)器的值,來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉、異常處理、線程恢復等基礎功能,都需要依賴這個計數(shù)器來完成;
為什么要線程計數(shù)器?因為線程是不具備記憶功能
Java 虛擬機棧(Java Virtual Machine Stacks):每個方法在執(zhí)行的同時都會在Java 虛擬機棧中創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息;
棧幀就是Java虛擬機棧中的下一個單位
本地方法棧(Native Method Stack):與虛擬機棧的作用是一樣的,只不過虛擬機棧是服務 Java方法的,而本地方法棧是為虛擬機調(diào)用 Native 方法服務的;
Native 關鍵字修飾的方法是看不到的,Native 方法的源碼大部分都是 C和C++ 的代碼Java 堆(Java Heap):Java 虛擬機中內(nèi)存最大的一塊,是被所有線程共享的,幾乎所有的對象實例都在這里分配內(nèi)存;
方法區(qū)(Methed Area):用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯后的代碼等數(shù)據(jù)。
6. 詳細的介紹下程序計數(shù)器?(重點理解)
1. 程序計數(shù)器是一塊較小的內(nèi)存空間,它可以看作是:保存當前線程所正在執(zhí)行的字節(jié)碼指令的地址(行號)
2. 由于Java虛擬機的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的,一個處理器都只會執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復到正確的執(zhí)行位置,每條線程都有一個獨立的程序計數(shù)器,各個線程之間計數(shù)器互不影響,獨立存儲。稱之為“線程私有”的內(nèi)存。程序計數(shù)器內(nèi)存區(qū)域是虛擬機中唯一沒有規(guī)定OutOfMemoryError情況的區(qū)域。
7. 詳細介紹下Java虛擬機棧?(重點理解)
8. 詳細的介紹下Java堆?(重點理解)
9. 能不能解釋一下本地方法棧?
10. 能不能解釋一下方法區(qū)(重點理解)
......
......
......