欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

2020面試阿里字節(jié)跳動(dòng)90%被問(wèn)到的JVM面試題附答案(史上最全)

  發(fā)布時(shí)間:2020-06-15 16:46:13   作者:前程有光   我要評(píng)論
這篇文章主要介紹了2020面試阿里字節(jié)跳動(dòng)90%被問(wèn)到的JVM面試題附答案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言:最近老是收到小伙伴的私信問(wèn)我能不能幫忙整理出一份JVM相關(guān)的面試題出來(lái),說(shuō)自己在大廠去面試的時(shí)候這一塊問(wèn)的是特別多的,每次自己學(xué)的時(shí)候每次都學(xué)不到重點(diǎn)去。這不他來(lái)了,一份詳細(xì)的JVM面試真題給大家整理在下方了!

一、什么情況下會(huì)發(fā)生棧內(nèi)存溢出?
1、棧是線程私有的,棧的生命周期和線程一樣,每個(gè)方法在執(zhí)行的時(shí)候就會(huì)創(chuàng)建一個(gè)棧幀,它包含局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息,局部變量表又包括基本數(shù)據(jù)類(lèi)型和對(duì)象的引用;
2、當(dāng)線程請(qǐng)求的棧深度超過(guò)了虛擬機(jī)允許的最大深度時(shí),會(huì)拋出StackOverFlowError異常,方法遞歸調(diào)用肯可能會(huì)出現(xiàn)該問(wèn)題;
3、調(diào)整參數(shù)-xss去調(diào)整jvm棧的大小

二、詳解JVM內(nèi)存模型?
jvm將虛擬機(jī)分為5大區(qū)域,程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、java堆、方法區(qū);

程序計(jì)數(shù)器:線程私有的,是一塊很小的內(nèi)存空間,作為當(dāng)前線程的行號(hào)指示器,用于記錄當(dāng)前虛擬機(jī)正在執(zhí)行的線程指令地址;

虛擬機(jī)棧:線程私有的,每個(gè)方法執(zhí)行的時(shí)候都會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表、操作數(shù)、動(dòng)態(tài)鏈接和方法返回等信息,當(dāng)線程請(qǐng)求的棧深度超過(guò)了虛擬機(jī)允許的最大深度時(shí),就會(huì)拋出StackOverFlowError;

本地方法棧:線程私有的,保存的是native方法的信息,當(dāng)一個(gè)jvm創(chuàng)建的線程調(diào)用native方法后,jvm不會(huì)在虛擬機(jī)棧中為該線程創(chuàng)建棧幀,而是簡(jiǎn)單的動(dòng)態(tài)鏈接并直接調(diào)用該方法;

堆:java堆是所有線程共享的一塊內(nèi)存,幾乎所有對(duì)象的實(shí)例和數(shù)組都要在堆上分配內(nèi)存,因此該區(qū)域經(jīng)常發(fā)生垃圾回收的操作;

方法區(qū):存放已被加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼數(shù)據(jù)。即永久代,在jdk1.8中不存在方法區(qū)了,被元數(shù)據(jù)區(qū)替代了,原方法區(qū)被分成兩部分;1:加載的類(lèi)信息,2:運(yùn)行時(shí)常量池;加載的類(lèi)信息被保存在元數(shù)據(jù)區(qū)中,運(yùn)行時(shí)常量池保存在堆中;

三、JVM中一次完整的GC是什么樣子的?對(duì)象如何晉升到老年代?
java堆 = 新生代+老年代;
新生代 = Eden + Suivivor(S0 + S1),默認(rèn)分配比例是8:1:1;
當(dāng)Eden區(qū)空間滿了的時(shí)候,就會(huì)觸發(fā)一次Minor GC,以收集新生代的垃圾,存活下來(lái)的對(duì)象會(huì)被分配到Survivor區(qū)
大對(duì)象(需要大量連續(xù)內(nèi)存空間的對(duì)象)會(huì)直接被分配到老年代
如果對(duì)象在Eden中出生,并且在經(jīng)歷過(guò)一次Minor GC之后仍然存活,被分配到存活區(qū)的話,年齡+1,此后每經(jīng)歷過(guò)一次Minor GC并且存活下來(lái),年齡就+1,當(dāng)年齡達(dá)到15的時(shí)候,會(huì)被晉升到老年代;
當(dāng)老年代滿了,而無(wú)法容納更多對(duì)象的話,會(huì)觸發(fā)一次full gc;full gc存儲(chǔ)的是整個(gè)內(nèi)存堆(包括年輕代和老年代);;
Major GC是發(fā)生在老年代的GC,清理老年區(qū),經(jīng)常會(huì)伴隨至少一次minor gc;

四、Java中的垃圾回收算法?
java中有四種垃圾回收算法,分別是標(biāo)記清除法、標(biāo)記整理法、復(fù)制算法、分代收集算法;
標(biāo)記清除法:
第一步:利用可達(dá)性去遍歷內(nèi)存,把存活對(duì)象和垃圾對(duì)象進(jìn)行標(biāo)記;
第二步:在遍歷一遍,將所有標(biāo)記的對(duì)象回收掉;
特點(diǎn):效率不行,標(biāo)記和清除的效率都不高;標(biāo)記和清除后會(huì)產(chǎn)生大量的不連續(xù)的空間分片,可能會(huì)導(dǎo)致之后程序運(yùn)行的時(shí)候需分配大對(duì)象而找不到連續(xù)分片而不得不觸發(fā)一次GC;

標(biāo)記整理法:
第一步:利用可達(dá)性去遍歷內(nèi)存,把存活對(duì)象和垃圾對(duì)象進(jìn)行標(biāo)記;
第二步:將所有的存活的對(duì)象向一段移動(dòng),將端邊界以外的對(duì)象都回收掉;
特點(diǎn):適用于存活對(duì)象多,垃圾少的情況;需要整理的過(guò)程,無(wú)空間碎片產(chǎn)生;

復(fù)制算法:
將內(nèi)存按照容量大小分為大小相等的兩塊,每次只使用一塊,當(dāng)一塊使用完了,就將還存活的對(duì)象移到另一塊上,然后在把使用過(guò)的內(nèi)存空間移除;
特點(diǎn):不會(huì)產(chǎn)生空間碎片;內(nèi)存使用率極低;

分代收集算法:
根據(jù)內(nèi)存對(duì)象的存活周期不同,將內(nèi)存劃分成幾塊,java虛擬機(jī)一般將內(nèi)存分成新生代和老生代,在新生代中,有大量對(duì)象死去和少量對(duì)象存活,所以采用復(fù)制算法,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集;老年代中因?yàn)閷?duì)象的存活率極高,沒(méi)有額外的空間對(duì)他進(jìn)行分配擔(dān)保,所以采用標(biāo)記清理或者標(biāo)記整理算法進(jìn)行回收;

五、如何判斷一個(gè)對(duì)象是否存活?
判斷一個(gè)對(duì)象是否存活,分為兩種算法1:引用計(jì)數(shù)法;2:可達(dá)性分析算法;
引用計(jì)數(shù)法:
給每一個(gè)對(duì)象設(shè)置一個(gè)引用計(jì)數(shù)器,當(dāng)有一個(gè)地方引用該對(duì)象的時(shí)候,引用計(jì)數(shù)器就+1,引用失效時(shí),引用計(jì)數(shù)器就-1;當(dāng)引用計(jì)數(shù)器為0的時(shí)候,就說(shuō)明這個(gè)對(duì)象沒(méi)有被引用,也就是垃圾對(duì)象,等待回收;
缺點(diǎn):無(wú)法解決循環(huán)引用的問(wèn)題,當(dāng)A引用B,B也引用A的時(shí)候,此時(shí)AB對(duì)象的引用都不為0,此時(shí)也就無(wú)法垃圾回收,所以一般主流虛擬機(jī)都不采用這個(gè)方法;

可達(dá)性分析法
從一個(gè)被稱(chēng)為GC Roots的對(duì)象向下搜索,如果一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈相連接時(shí),說(shuō)明此對(duì)象不可用,在java中可以作為GC Roots的對(duì)象有以下幾種:

虛擬機(jī)棧中引用的對(duì)象
方法區(qū)類(lèi)靜態(tài)屬性引用的變量
方法區(qū)常量池引用的對(duì)象
本地方法棧JNI引用的對(duì)象
但一個(gè)對(duì)象滿足上述條件的時(shí)候,不會(huì)馬上被回收,還需要進(jìn)行兩次標(biāo)記;第一次標(biāo)記:判斷當(dāng)前對(duì)象是否有finalize()方法并且該方法沒(méi)有被執(zhí)行過(guò),若不存在則標(biāo)記為垃圾對(duì)象,等待回收;若有的話,則進(jìn)行第二次標(biāo)記;第二次標(biāo)記將當(dāng)前對(duì)象放入F-Queue隊(duì)列,并生成一個(gè)finalize線程去執(zhí)行該方法,虛擬機(jī)不保證該方法一定會(huì)被執(zhí)行,這是因?yàn)槿绻€程執(zhí)行緩慢或進(jìn)入了死鎖,會(huì)導(dǎo)致回收系統(tǒng)的崩潰;如果執(zhí)行了finalize方法之后仍然沒(méi)有與GC Roots有直接或者間接的引用,則該對(duì)象會(huì)被回收;

六、有哪幾種垃圾回收器,有哪些優(yōu)缺點(diǎn)?cms和g1的區(qū)別?
垃圾回收器主要分為以下幾種:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;
Serial:
單線程的收集器,收集垃圾時(shí),必須stop the world,使用復(fù)制算法。

ParNew:
Serial收集器的多線程版本,也需要stop the world,復(fù)制算法.

Parallel Scavenge:
新生代收集器,復(fù)制算法的收集器,并發(fā)的多線程收集器,目標(biāo)是達(dá)到一個(gè)可控的吞吐量,和ParNew的最大區(qū)別是GC自動(dòng)調(diào)節(jié)策略;虛擬機(jī)會(huì)根據(jù)系統(tǒng)的運(yùn)行狀態(tài)收集性能監(jiān)控信息,動(dòng)態(tài)設(shè)置這些參數(shù),以提供最優(yōu)停頓時(shí)間和最高的吞吐量;

Serial Old:
Serial收集器的老年代版本,單線程收集器,使用標(biāo)記整理算法。

Parallel Old:
是Parallel Scavenge收集器的老年代版本,使用多線程,標(biāo)記-整理算法。

CMS:
是一種以獲得最短回收停頓時(shí)間為目標(biāo)的收集器,標(biāo)記清除算法,運(yùn)作過(guò)程:初始標(biāo)記,并發(fā)標(biāo)記,重新標(biāo)記,并發(fā)清除,收集結(jié)束會(huì)產(chǎn)生大量空間碎片;

G1:
標(biāo)記整理算法實(shí)現(xiàn),運(yùn)作流程主要包括以下:初始標(biāo)記,并發(fā)標(biāo)記,最終標(biāo)記,篩選回收。不會(huì)產(chǎn)生空間碎片,可以精確地控制停頓;
G1將整個(gè)堆分為大小相等的多個(gè)Region(區(qū)域),G1跟蹤每個(gè)區(qū)域的垃圾大小,在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,每次根據(jù)允許的收集時(shí)間,優(yōu)先回收價(jià)值最大的區(qū)域,已達(dá)到在有限時(shí)間內(nèi)獲取盡可能高的回收效率;

七、什么是類(lèi)加載?
虛擬機(jī)把描述類(lèi)的數(shù)據(jù)加載到內(nèi)存里面,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、解析和初始化,最終變成可以被虛擬機(jī)直接使用的class對(duì)象;

八、類(lèi)加載的過(guò)程?
主要分為以下幾個(gè)過(guò)程:加載、驗(yàn)證、準(zhǔn)備、解析、初始化;
加載:
加載分為三步:
1、通過(guò)類(lèi)的全限定性類(lèi)名獲取該類(lèi)的二進(jìn)制流;
2、將該二進(jìn)制流的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu);
3、在堆中為該類(lèi)生成一個(gè)class對(duì)象;

驗(yàn)證:
驗(yàn)證該class文件中的字節(jié)流信息復(fù)合虛擬機(jī)的要求,不會(huì)威脅到j(luò)vm的安全;

準(zhǔn)備:
為class對(duì)象的靜態(tài)變量分配內(nèi)存,初始化其初始值;

解析:
該階段主要完成符號(hào)引用轉(zhuǎn)化成直接引用;

初始化:
到了初始化階段,才開(kāi)始執(zhí)行類(lèi)中定義的java代碼;
初始化階段是調(diào)用類(lèi)構(gòu)造器的過(guò)程;

九、什么是類(lèi)加載器,常見(jiàn)的類(lèi)加載器有哪些?
類(lèi)加載器是指:通過(guò)一個(gè)類(lèi)的全限定性類(lèi)名獲取該類(lèi)的二進(jìn)制字節(jié)流叫做類(lèi)加載器;
類(lèi)加載器分為以下四種:
啟動(dòng)類(lèi)加載器:
用來(lái)加載java核心類(lèi)庫(kù),無(wú)法被java程序直接引用;

擴(kuò)展類(lèi)加載器:
用來(lái)加載java的擴(kuò)展庫(kù),java的虛擬機(jī)實(shí)現(xiàn)會(huì)提供一個(gè)擴(kuò)展庫(kù)目錄,該類(lèi)加載器在擴(kuò)展庫(kù)目錄里面查找并加載java類(lèi);

系統(tǒng)類(lèi)加載器:
它根據(jù)java的類(lèi)路徑來(lái)加載類(lèi),一般來(lái)說(shuō),java應(yīng)用的類(lèi)都是通過(guò)它來(lái)加載的;

自定義類(lèi)加載器:
由java語(yǔ)言實(shí)現(xiàn),繼承自ClassLoader;

十、什么是雙親委派模型?
當(dāng)一個(gè)類(lèi)加載器收到一個(gè)類(lèi)加載的請(qǐng)求,他首先不會(huì)嘗試自己去加載,而是將這個(gè)請(qǐng)求委派給父類(lèi)加載器去加載,只有父類(lèi)加載器在自己的搜索范圍類(lèi)查找不到給類(lèi)時(shí),子加載器才會(huì)嘗試自己去加載該類(lèi);

十一、為什么需要雙親委派模型?
為了防止內(nèi)存中出現(xiàn)多個(gè)相同的字節(jié)碼;
因?yàn)槿绻麤](méi)有雙親委派的話,用戶就可以自己定義一個(gè)java.lang.String類(lèi),那么就無(wú)法保證類(lèi)的唯一性;

十二、怎么打破雙親委派模型?
自定義類(lèi)加載器,繼承ClassLoader類(lèi),重寫(xiě)loadClass方法和findClass方法;

十三、強(qiáng)引用、軟應(yīng)用、弱引用、虛引用的區(qū)別?
強(qiáng)引用:強(qiáng)引用是我們使用最廣泛的引用,如果一個(gè)對(duì)象具有強(qiáng)引用,那么垃圾回收期絕對(duì)不會(huì)回收它,當(dāng)內(nèi)存空間不足時(shí),垃圾回收器寧愿拋出OutOfMemoryError,也不會(huì)回收具有強(qiáng)引用的對(duì)象;我們可以通過(guò)顯示的將強(qiáng)引用對(duì)象置為null,讓gc認(rèn)為該對(duì)象不存在引用,從而來(lái)回收它;

軟引用:軟應(yīng)用是用來(lái)描述一些有用但不是必須的對(duì)象,在java中用SoftReference來(lái)表示,當(dāng)一個(gè)對(duì)象只有軟應(yīng)用時(shí),只有當(dāng)內(nèi)存不足時(shí),才會(huì)回收它;
軟引用可以和引用隊(duì)列聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收器所回收了,虛擬機(jī)會(huì)把這個(gè)軟引用加入到與之對(duì)應(yīng)的引用隊(duì)列中;

弱引用:弱引用是用來(lái)描述一些可有可無(wú)的對(duì)象,在java中用WeakReference來(lái)表示,在垃圾回收時(shí),一旦發(fā)現(xiàn)一個(gè)對(duì)象只具有軟引用的時(shí)候,無(wú)論當(dāng)前內(nèi)存空間是否充足,都會(huì)回收掉該對(duì)象;
弱引用可以和引用隊(duì)列聯(lián)合使用,如果弱引用所引用的對(duì)象被垃圾回收了,虛擬機(jī)會(huì)將該對(duì)象的引用加入到與之關(guān)聯(lián)的引用隊(duì)列中;

虛引用:虛引用就是一種可有可無(wú)的引用,無(wú)法用來(lái)表示對(duì)象的生命周期,任何時(shí)候都可能被回收,虛引用主要使用來(lái)跟蹤對(duì)象被垃圾回收的活動(dòng),虛引用和軟引用與弱引用的區(qū)別在于:虛引用必須和引用隊(duì)列聯(lián)合使用;在進(jìn)行垃圾回收的時(shí)候,如果發(fā)現(xiàn)一個(gè)對(duì)象只有虛引用,那么就會(huì)將這個(gè)對(duì)象的引用加入到與之關(guān)聯(lián)的引用隊(duì)列中,程序可以通過(guò)發(fā)現(xiàn)一個(gè)引用隊(duì)列中是否已經(jīng)加入了虛引用,來(lái)了解被引用的對(duì)象是否需要被進(jìn)行垃圾回收;

到此這篇關(guān)于2020面試阿里字節(jié)跳動(dòng)90%被問(wèn)到的JVM面試題附答案(史上最全)的文章就介紹到這了,更多相關(guān)JVM面試題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!文章的最后祝大家在工作的工作順利,在找工作的都能拿到自己滿意的offer!

相關(guān)文章

  • 10道JVM常見(jiàn)面試題解析(附答案)

    這篇文章主要介紹了10道JVM常見(jiàn)面試題解析(附答案),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)
    2020-09-04
  • JVM相關(guān)面試題及答案(小結(jié))

    這篇文章主要介紹了JVM相關(guān)面試題及答案(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-02
  • 2020年JVM高頻率面試題整理

    這篇文章主要介紹了2020年JVM高頻率面試題整理,真是小編下了血本給大家整理出來(lái)的,值得大家收藏,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-09
  • JVM面試題小結(jié)(2020最新版)

    這篇文章主要介紹了JVM面試題小結(jié)(2020最新版),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-21
  • 2019年JVM面試都問(wèn)了什么?(附答案解析)

    這篇文章主要介紹了2019年JVM面試都問(wèn)了什么?(附答案解析),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-04
  • Java研發(fā)面試99題(含答案):JVM+Spring+MySQL+線程池+鎖

    這篇文章主要介紹了Java研發(fā)面試99題,主要包括了JVM,Spring,MySQL,線程池,鎖等,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-16
  • 講一講JVM的組成(Java經(jīng)典面試題)

    JVM(Java 虛擬機(jī))算是面試必問(wèn)的問(wèn)題的了,而但凡問(wèn) JVM 一定會(huì)問(wèn)的第一個(gè)問(wèn)題就是:講一講 JVM 的組成?那本文就注重講一下 JVM 的組成,感興趣的可以了解一下
    2019-04-10
  • 30道有趣的JVM面試題(小結(jié))

    這篇文章主要介紹了30道有趣的JVM面試題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-26

最新評(píng)論