中科曙光二面面經(jīng)/成都base/高性能計(jì)算/Java開發(fā)
中科曙光二面
應(yīng)該是leader面,對(duì)面開了攝像頭,俺的壓力有點(diǎn)大,面試官說時(shí)間有限,一共就面了20分鐘左右。
1.講一下JVM里的數(shù)據(jù)結(jié)構(gòu),如果產(chǎn)生異常會(huì)在哪里產(chǎn)生異常?有哪些解決方案?
JVM的運(yùn)行時(shí)數(shù)據(jù)區(qū)域主要包括以下幾個(gè)部分:
- 方法區(qū) (Method Area):這部分用于存儲(chǔ)已被加載的類信息、常量、靜態(tài)變量和即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
- 堆 (Heap):這是JVM所管理的最大一塊內(nèi)存區(qū)域,用于存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都會(huì)在這里分配內(nèi)存。
- 虛擬機(jī)棧 (Java Virtual Machine Stacks):每個(gè)線程都有一個(gè)私有的棧,隨線程創(chuàng)建而創(chuàng)建。棧里保存了方法調(diào)用的棧幀,每次調(diào)用一個(gè)方法時(shí)都會(huì)為該方法創(chuàng)建一個(gè)新的棧幀并壓入棧,方法返回時(shí)該棧幀出棧。
- 本地方法棧 (Native Method Stacks):本地方法棧與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,它們之間的區(qū)別不過是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)使用到的Native方法服務(wù)。
- 程序計(jì)數(shù)器 (Program Counter Register):當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。字節(jié)碼解釋器工作時(shí)就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。
異常來源:
- 堆溢出 (OutOfMemoryError):當(dāng)堆中無法再為新的對(duì)象分配內(nèi)存時(shí),會(huì)拋出這個(gè)異常。解決方案:可能的解決方法包括增加堆內(nèi)存的分配(使用-Xms和-Xmx參數(shù))、優(yōu)化代碼來減少對(duì)象的創(chuàng)建、或者使用Profiler工具檢查是否有對(duì)象泄露。
- 棧溢出 (StackOverflowError):當(dāng)線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度時(shí),拋出這個(gè)異常。解決方案:可能的方法包括減少方法調(diào)用的深度,優(yōu)化遞歸邏輯,或者增加棧內(nèi)存的分配(使用-Xss參數(shù))。
- 方法區(qū)溢出 (OutOfMemoryError):當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),會(huì)拋出這個(gè)異常。解決方案:增加方法區(qū)的分配大小(例如,使用-XX:PermSize和-XX:MaxPermSize參數(shù),取決于你使用的JVM版本和類型)或者檢查類加載邏輯,確保沒有意外地加載過多的類。
總結(jié):
JVM為Java程序提供了運(yùn)行時(shí)數(shù)據(jù)存儲(chǔ)的地方。當(dāng)這些地方無法滿足程序的需求時(shí),JVM會(huì)拋出異常。處理這些異常的關(guān)鍵是識(shí)別異常的來源,然后采取適當(dāng)?shù)拇胧@可能包括為JVM分配更多的資源或優(yōu)化代碼來減少資源的使用。
2.Error和Exception有什么不同嗎?
3.堆和棧中都會(huì)OOM,那么這兩種OOM引起的原因有什么不同嗎?
堆和棧中的異常情況:
- 堆溢出 (OutOfMemoryError):堆是用于存儲(chǔ)Java對(duì)象的地方。當(dāng)堆中沒有足夠的空間分配新對(duì)象時(shí),JVM會(huì)拋出
OutOfMemoryError
異常。 引起的原因:常見的原因是程序中創(chuàng)建了大量大生命周期的對(duì)象,并且垃圾收集器無法及時(shí)回收這些對(duì)象。還可能是因?yàn)镴VM的堆內(nèi)存設(shè)置過小。 - 棧溢出 (StackOverflowError):棧是用于存儲(chǔ)局部變量、方法調(diào)用等的地方。每當(dāng)一個(gè)方法被調(diào)用,一個(gè)新的棧幀就會(huì)被添加到棧頂。當(dāng)棧的大小超過了JVM允許的深度,會(huì)拋出
StackOverflowError
。 引起的原因:常見的原因是程序中有無限的遞歸調(diào)用。
確切地說,棧中通常不發(fā)生OutOfMemoryError
,而是StackOverflowError
。
4.JVM棧主要是做啥的?
5.A方法調(diào)用B方法,B調(diào)用C方法,請(qǐng)問在棧中表現(xiàn)是什么?
6.入棧會(huì)入一些什么東西嗎?
7.方法區(qū)會(huì)存什么東西?
8.類的加載機(jī)制?
9.MySQL索引的數(shù)據(jù)結(jié)構(gòu)說一下
10.為什么矮胖的B+樹,IO就會(huì)少?
11.這種數(shù)據(jù)結(jié)構(gòu)適合全文索引嗎?
MySQL的全文索引:
- 數(shù)據(jù)結(jié)構(gòu):MySQL全文索引基于倒排索引(Inverted Index)實(shí)現(xiàn)。這是一種在文檔檢索系統(tǒng)中常見的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組文檔中每個(gè)詞及其位置的映射。
- 用法和聲明:MySQL提供了FULLTEXT索引,主要用于InnoDB和MyISAM存儲(chǔ)引擎。可以通過以下語(yǔ)句創(chuàng)建:
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... FULLTEXT(column_name) );
? B+樹與全文索引:雖然MySQL常用B+樹作為其主要的索引結(jié)構(gòu),但對(duì)于全文索引,它使用倒排索引。B+樹主要用于范圍查詢,而全文索引是為了提高文本搜索的效率。全文索引中,每個(gè)唯一的詞作為一個(gè)鍵,指向出現(xiàn)該詞的文檔或文檔中的位置。
舉例: 假設(shè)我們有一個(gè)名為articles
的表,其中有一個(gè)名為content
的文本列。我們可以創(chuàng)建一個(gè)全文索引:
ALTER TABLE articles ADD FULLTEXT(content);
之后,可以使用MATCH AGAINST
進(jìn)行搜索:
SELECT * FROM articles WHERE MATCH (content) AGAINST ('search_term');
總的來說,MySQL的全文索引為文本搜索提供了高效的方法,而不是使用傳統(tǒng)的B+樹結(jié)構(gòu),而是采用倒排索引結(jié)構(gòu)。
12.數(shù)據(jù)倉(cāng)庫(kù)和普通數(shù)據(jù)庫(kù)有什么不同?
一周后oc了。但是經(jīng)了解,HR說一個(gè)月有三個(gè)周六要加班,22個(gè)工作日有10個(gè)工作日要加班到晚上9點(diǎn),所以我想去的意愿并不是很大。
#中科曙光#