更新時(shí)間:2023-01-13 17:20:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1254次
1. 我們開(kāi)發(fā)人員編寫(xiě)的Java代碼是怎么讓電腦認(rèn)識(shí)的
首先先了解電腦是二進(jìn)制的系統(tǒng),他只認(rèn)識(shí) 01010101
比如我們經(jīng)常要編寫(xiě) HelloWord.java 電腦是怎么認(rèn)識(shí)運(yùn)行的HelloWord.java是我們程序員編寫(xiě)的,我們?nèi)丝梢哉J(rèn)識(shí),但是電腦不認(rèn)識(shí)
Java文件編譯的過(guò)程
1. 程序員編寫(xiě)的.java文件
2. 由javac編譯成字節(jié)碼文件.class:(為什么編譯成class文件,因?yàn)镴VM只認(rèn)識(shí).class文件)
3. 在由JVM編譯成電腦認(rèn)識(shí)的文件 (對(duì)于電腦系統(tǒng)來(lái)說(shuō) 文件代表一切)
2. 為什么說(shuō)java是跨平臺(tái)語(yǔ)言
這個(gè)跨平臺(tái)是中間語(yǔ)言(JVM)實(shí)現(xiàn)的跨平臺(tái)
Java有JVM從軟件層面屏蔽了底層硬件、指令層面的細(xì)節(jié)讓他兼容各種系統(tǒng)難道 C 和 C++ 不能跨平臺(tái)嗎
其實(shí)也可以 C和C++需要在編譯器層面去兼容不同操作系統(tǒng)的不同層面,寫(xiě)過(guò)C和C++的就知道不同操作系統(tǒng)的有些代碼是不一樣
3. Jdk和Jre和JVM的區(qū)別
Jdk包括了Jre和Jvm,Jre包括了Jvm
Jdk是我們編寫(xiě)代碼使用的開(kāi)發(fā)工具包
Jre 是Java的運(yùn)行時(shí)環(huán)境,他大部分都是 C 和 C++ 語(yǔ)言編寫(xiě)的,他是我們?cè)诰幾gjava時(shí)所需要的基礎(chǔ)的類(lèi)庫(kù)
Jvm俗稱(chēng)Java虛擬機(jī),他是java運(yùn)行環(huán)境的一部分,它虛構(gòu)出來(lái)的一臺(tái)計(jì)算機(jī),在通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)Java應(yīng)用程序
看Java官方的圖片,Jdk中包括了Jre,Jre中包括了JVM
4. 說(shuō)一下 JVM由那些部分組成,運(yùn)行流程是什么?
JVM包含兩個(gè)子系統(tǒng)和兩個(gè)組件: 兩個(gè)子系統(tǒng)為Class loader(類(lèi)裝載)、Execution engine(執(zhí)行引擎); 兩個(gè)組件為Runtime data area(運(yùn)行時(shí)數(shù)據(jù)區(qū))、Native Interface(本地接口)。
Class loader(類(lèi)裝載):根據(jù)給定的全限定名類(lèi)名(如:java.lang.Object)來(lái)裝載class文件到Runtime data area中的method area。
Execution engine(執(zhí)行引擎):執(zhí)行classes中的指令。
Native Interface(本地接口):與native libraries交互,是其它編程語(yǔ)言交互的接口。
Runtime data area(運(yùn)行時(shí)數(shù)據(jù)區(qū)域):這就是我們常說(shuō)的JVM的內(nèi)存。
流程 :首先通過(guò)編譯器把 Java 代碼轉(zhuǎn)換成字節(jié)碼,類(lèi)加載器(ClassLoader)再把字節(jié)碼加載到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime data area)的方法區(qū)內(nèi),而字節(jié)碼文件只是 JVM 的一套指令集規(guī)范,并不能直接交給底層操作系統(tǒng)去執(zhí)行,因此需要特定的命令解析器執(zhí)行引擎(Execution Engine),將字節(jié)碼翻譯成底層系統(tǒng)指令,再交由 CPU 去執(zhí)行,而這個(gè)過(guò)程中需要調(diào)用其他語(yǔ)言的本地庫(kù)接口(Native Interface)來(lái)實(shí)現(xiàn)整個(gè)程序的功能。
5. 說(shuō)一下 JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)
Java 虛擬機(jī)在執(zhí)行 Java 程序的過(guò)程中會(huì)把它所管理的內(nèi)存區(qū)域劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷(xiāo)毀的時(shí)間,有些區(qū)域隨著虛擬機(jī)進(jìn)程的啟動(dòng)而存在,有些區(qū)域則是依賴(lài)線(xiàn)程的啟動(dòng)和結(jié)束而建立和銷(xiāo)毀。Java 虛擬機(jī)所管理的內(nèi)存被劃分為如下幾個(gè)區(qū)域:
簡(jiǎn)單的說(shuō)就是我們java運(yùn)行時(shí)的東西是放在那里的
程序計(jì)數(shù)器(Program Counter Register):當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器,字節(jié)碼解析器的工作是通過(guò)改變這個(gè)計(jì)數(shù)器的值,來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線(xiàn)程恢復(fù)等基礎(chǔ)功能,都需要依賴(lài)這個(gè)計(jì)數(shù)器來(lái)完成;
為什么要線(xiàn)程計(jì)數(shù)器?因?yàn)榫€(xiàn)程是不具備記憶功能
Java 虛擬機(jī)棧(Java Virtual Machine Stacks):每個(gè)方法在執(zhí)行的同時(shí)都會(huì)在Java 虛擬機(jī)棧中創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息;
棧幀就是Java虛擬機(jī)棧中的下一個(gè)單位
本地方法棧(Native Method Stack):與虛擬機(jī)棧的作用是一樣的,只不過(guò)虛擬機(jī)棧是服務(wù) Java方法的,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的;
Native 關(guān)鍵字修飾的方法是看不到的,Native 方法的源碼大部分都是 C和C++ 的代碼Java 堆(Java Heap):Java 虛擬機(jī)中內(nèi)存最大的一塊,是被所有線(xiàn)程共享的,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存;
方法區(qū)(Methed Area):用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯后的代碼等數(shù)據(jù)。
以上就是“git的常用命令面試題,你知道多少”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)