JVM面經(jīng)!?。?/h1>
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
76套java從入門到精通實(shí)戰(zhàn)課程分享
JVM主要組成部分
Class loader(類加載器):根據(jù)給定的全限定名類名來裝載class文件到方法區(qū)
Execution engine(執(zhí)行引擎):執(zhí)行classes中的指令。
Native Interface(本地接口):與native libraries交互,是其它編程語言交互的接口。
Runtime data area(運(yùn)行時(shí)數(shù)據(jù)區(qū)域):這就是我們常說的JVM的內(nèi)存。
運(yùn)行時(shí)數(shù)據(jù)區(qū)
程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器 2個(gè)作用 1記錄線程執(zhí)行位置; 2讀取指令
Java 虛擬機(jī)棧:用于存儲對象的引用,基本數(shù)據(jù)類型.
本地方法棧:與虛擬機(jī)棧的作用是一樣的,只不過虛擬機(jī)棧是服務(wù) Java 方法的,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的;
Java 堆:Java 虛擬機(jī)中內(nèi)存最大的一塊,是被所有線程共享的,用于存儲實(shí)例化對象;
方法區(qū):用于存儲 class文件,常量 靜態(tài)變量與方法
對象的創(chuàng)建的幾種方式
使用new關(guān)鍵字
使用Class的newInstance方法
使用Constructor類的newInstance方法
使用clone方法
使用反序列化
為對象分配內(nèi)存的兩種方式 1 指針碰撞 2 空閑列
為什么要進(jìn)行垃圾回收?
隨著程序的運(yùn)行,內(nèi)存中存在的實(shí)例對象、變量等信息占據(jù)的內(nèi)存越來越多,如果不及時(shí)進(jìn)行垃圾回收,必然會帶來程序性能的下降,甚至?xí)驗(yàn)榭捎脙?nèi)存不足造成一些不必要的系統(tǒng)異常。
優(yōu)點(diǎn): 垃圾回收機(jī)制有效的防止了內(nèi)存泄露,可以有效的使用可使用的內(nèi)存。
大對象直接進(jìn)入老年代,避免大對象分配內(nèi)存時(shí)由于分配擔(dān)保機(jī)制帶來的復(fù)制而降低效率
Java 中都有哪些引用類型?
強(qiáng)引用:發(fā)生 gc 的時(shí)候不會被回收。
軟引用:有用但不是必須的對象,在發(fā)生內(nèi)存溢出之前會被回收。
弱引用:有用但不是必須的對象,在下一次GC時(shí)會被回收。
虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 實(shí)現(xiàn)虛引用,虛引用的用途是在 gc 時(shí)返回一個(gè)通知。
怎么判斷對象是否可以被回收?
一般有兩種方法來判斷:
引用計(jì)數(shù)器法:為每個(gè)對象創(chuàng)建一個(gè)引用計(jì)數(shù),有對象引用時(shí)計(jì)數(shù)器 +1,引用被釋放時(shí)計(jì)數(shù) -1,當(dāng)計(jì)數(shù)器為 0 時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問題;
可達(dá)性分析算法:從 GC Roots 作為起點(diǎn),引用鏈作為路徑。當(dāng)一個(gè)對象到 GC Roots 沒有任何引用鏈相連時(shí),則證明此對象是可以被回收的。
內(nèi)存分配策略
堆內(nèi)存中還要細(xì)分為三個(gè)區(qū)域: ●新生區(qū)(伊甸園區(qū)) Young/New ●養(yǎng)老區(qū)old ●永久區(qū)Perm
大對象直接進(jìn)入老年代 : 需要大量的連續(xù)的內(nèi)存空間,為了避免大對象分配內(nèi)存時(shí)的分配擔(dān)保機(jī)制帶來的復(fù)制而降低效率
長期存活對象將進(jìn)入老年代 :對象在伊甸園區(qū)分配,經(jīng)過新生代垃圾回收,對象還存活則會進(jìn)入幸存者區(qū),并且對象的年齡會+1經(jīng)過數(shù)次GC后,會晉升到老年代
JVM垃圾回收算法
標(biāo)記清除
首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉被標(biāo)記的對象 (老年代)
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,不需要對象進(jìn)行移動。
缺點(diǎn):第一個(gè)是執(zhí)行效率不穩(wěn)定,第二個(gè)是內(nèi)存空間的碎片化問題
標(biāo)記復(fù)制
將可用內(nèi)存按容量劃分為大小相等的兩塊,每次使用其中的一塊,這一塊用完了就將還存活者的對象復(fù)制到另一塊上面 (新生代)
優(yōu)點(diǎn):按順序分配內(nèi)存即可,實(shí)現(xiàn)簡單、運(yùn)行高效,不用考慮內(nèi)存碎片。
缺點(diǎn):內(nèi)存縮小到原來的一半.
不過新生代的98%的對象熬不過第一輪收集. 所以eden區(qū)和幸存區(qū)大小比例是8:1
標(biāo)記整理
讓所有存活的對象都移向內(nèi)存空間的一端,然后直接清理掉邊界以外的內(nèi)存 (老年代.)
優(yōu)點(diǎn):解決了標(biāo)記-清理算法存在的內(nèi)存碎片問題。
缺點(diǎn):仍需要進(jìn)行局部對象移動,一定程度上降低了效率。
垃圾回收器 作用:釋放和重用資源。
是垃圾回收算法的具體實(shí)現(xiàn)

Serial收集器(復(fù)制算法): 新生代單線程收集器,標(biāo)記和清理都是單線程,優(yōu)點(diǎn)是簡單高效;
ParNew收集器 (復(fù)制算法): 新生代收并行集器,實(shí)際上是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn);
Parallel Scavenge收集器 (復(fù)制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用戶線程時(shí)間/(用戶線程時(shí)間+GC線程時(shí)間),高吞吐量可以高效率的利用CPU時(shí)間,盡快完成程序的運(yùn)算任務(wù),適合后臺應(yīng)用等對交互相應(yīng)要求不高的場景;
Serial Old收集器 (標(biāo)記-整理算法): 老年代單線程收集器,Serial收集器的老年代版本;
Parallel Old收集器 (標(biāo)記-整理算法):老年代并行收集器,吞吐量優(yōu)先,Parallel Scavenge收集器的老年代版本;
CMS(Concurrent Mark Sweep)收集器(標(biāo)記-清除算法):老年代并行收集器,以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,具有高并發(fā)、低停頓的特點(diǎn),追求最短GC回收停頓時(shí)間。
G1(Garbage First)收集器 (標(biāo)記-整理算法):Java堆并行收集器,G1收集器是JDK1.7提供的一個(gè)新收集器,G1收集器基于“標(biāo)記-整理”算法實(shí)現(xiàn),也就是說不會產(chǎn)生內(nèi)存碎片。
為什么元空間會取代永久代
整個(gè)永久代有一個(gè)JVM本身設(shè)置固定大小的上限,無法進(jìn)行調(diào)整,而元空間使用的是直接內(nèi)存,受本機(jī)可用內(nèi)存限制,出現(xiàn)OOM錯(cuò)誤的幾率大大降低
雙親委派機(jī)制:避免重復(fù)加載 + 避免核心類篡改

————————————————
版權(quán)聲明:本文為CSDN博主「熱愛編程的小張同學(xué)」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/weixin_45326085/article/details/115566399
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
??長按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
瀏覽
59
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
76套java從入門到精通實(shí)戰(zhàn)課程分享
JVM主要組成部分
Class loader(類加載器):根據(jù)給定的全限定名類名來裝載class文件到方法區(qū)
Execution engine(執(zhí)行引擎):執(zhí)行classes中的指令。
Native Interface(本地接口):與native libraries交互,是其它編程語言交互的接口。
Runtime data area(運(yùn)行時(shí)數(shù)據(jù)區(qū)域):這就是我們常說的JVM的內(nèi)存。
運(yùn)行時(shí)數(shù)據(jù)區(qū)
程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器 2個(gè)作用 1記錄線程執(zhí)行位置; 2讀取指令
Java 虛擬機(jī)棧:用于存儲對象的引用,基本數(shù)據(jù)類型.
本地方法棧:與虛擬機(jī)棧的作用是一樣的,只不過虛擬機(jī)棧是服務(wù) Java 方法的,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的;
Java 堆:Java 虛擬機(jī)中內(nèi)存最大的一塊,是被所有線程共享的,用于存儲實(shí)例化對象;
方法區(qū):用于存儲 class文件,常量 靜態(tài)變量與方法
對象的創(chuàng)建的幾種方式
使用new關(guān)鍵字
使用Class的newInstance方法
使用Constructor類的newInstance方法
使用clone方法
使用反序列化
為對象分配內(nèi)存的兩種方式 1 指針碰撞 2 空閑列
為什么要進(jìn)行垃圾回收?
隨著程序的運(yùn)行,內(nèi)存中存在的實(shí)例對象、變量等信息占據(jù)的內(nèi)存越來越多,如果不及時(shí)進(jìn)行垃圾回收,必然會帶來程序性能的下降,甚至?xí)驗(yàn)榭捎脙?nèi)存不足造成一些不必要的系統(tǒng)異常。
優(yōu)點(diǎn): 垃圾回收機(jī)制有效的防止了內(nèi)存泄露,可以有效的使用可使用的內(nèi)存。
大對象直接進(jìn)入老年代,避免大對象分配內(nèi)存時(shí)由于分配擔(dān)保機(jī)制帶來的復(fù)制而降低效率
Java 中都有哪些引用類型?
強(qiáng)引用:發(fā)生 gc 的時(shí)候不會被回收。
軟引用:有用但不是必須的對象,在發(fā)生內(nèi)存溢出之前會被回收。
弱引用:有用但不是必須的對象,在下一次GC時(shí)會被回收。
虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 實(shí)現(xiàn)虛引用,虛引用的用途是在 gc 時(shí)返回一個(gè)通知。
怎么判斷對象是否可以被回收?
一般有兩種方法來判斷:
引用計(jì)數(shù)器法:為每個(gè)對象創(chuàng)建一個(gè)引用計(jì)數(shù),有對象引用時(shí)計(jì)數(shù)器 +1,引用被釋放時(shí)計(jì)數(shù) -1,當(dāng)計(jì)數(shù)器為 0 時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問題;
可達(dá)性分析算法:從 GC Roots 作為起點(diǎn),引用鏈作為路徑。當(dāng)一個(gè)對象到 GC Roots 沒有任何引用鏈相連時(shí),則證明此對象是可以被回收的。
內(nèi)存分配策略
堆內(nèi)存中還要細(xì)分為三個(gè)區(qū)域: ●新生區(qū)(伊甸園區(qū)) Young/New ●養(yǎng)老區(qū)old ●永久區(qū)Perm
大對象直接進(jìn)入老年代 : 需要大量的連續(xù)的內(nèi)存空間,為了避免大對象分配內(nèi)存時(shí)的分配擔(dān)保機(jī)制帶來的復(fù)制而降低效率
長期存活對象將進(jìn)入老年代 :對象在伊甸園區(qū)分配,經(jīng)過新生代垃圾回收,對象還存活則會進(jìn)入幸存者區(qū),并且對象的年齡會+1經(jīng)過數(shù)次GC后,會晉升到老年代
JVM垃圾回收算法
標(biāo)記清除
首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉被標(biāo)記的對象 (老年代)
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,不需要對象進(jìn)行移動。
缺點(diǎn):第一個(gè)是執(zhí)行效率不穩(wěn)定,第二個(gè)是內(nèi)存空間的碎片化問題
標(biāo)記復(fù)制
將可用內(nèi)存按容量劃分為大小相等的兩塊,每次使用其中的一塊,這一塊用完了就將還存活者的對象復(fù)制到另一塊上面 (新生代)
優(yōu)點(diǎn):按順序分配內(nèi)存即可,實(shí)現(xiàn)簡單、運(yùn)行高效,不用考慮內(nèi)存碎片。
缺點(diǎn):內(nèi)存縮小到原來的一半.
不過新生代的98%的對象熬不過第一輪收集. 所以eden區(qū)和幸存區(qū)大小比例是8:1
標(biāo)記整理
讓所有存活的對象都移向內(nèi)存空間的一端,然后直接清理掉邊界以外的內(nèi)存 (老年代.)
優(yōu)點(diǎn):解決了標(biāo)記-清理算法存在的內(nèi)存碎片問題。
缺點(diǎn):仍需要進(jìn)行局部對象移動,一定程度上降低了效率。
垃圾回收器 作用:釋放和重用資源。
是垃圾回收算法的具體實(shí)現(xiàn)

Serial收集器(復(fù)制算法): 新生代單線程收集器,標(biāo)記和清理都是單線程,優(yōu)點(diǎn)是簡單高效;
ParNew收集器 (復(fù)制算法): 新生代收并行集器,實(shí)際上是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn);
Parallel Scavenge收集器 (復(fù)制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用戶線程時(shí)間/(用戶線程時(shí)間+GC線程時(shí)間),高吞吐量可以高效率的利用CPU時(shí)間,盡快完成程序的運(yùn)算任務(wù),適合后臺應(yīng)用等對交互相應(yīng)要求不高的場景;
Serial Old收集器 (標(biāo)記-整理算法): 老年代單線程收集器,Serial收集器的老年代版本;
Parallel Old收集器 (標(biāo)記-整理算法):老年代并行收集器,吞吐量優(yōu)先,Parallel Scavenge收集器的老年代版本;
CMS(Concurrent Mark Sweep)收集器(標(biāo)記-清除算法):老年代并行收集器,以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,具有高并發(fā)、低停頓的特點(diǎn),追求最短GC回收停頓時(shí)間。
G1(Garbage First)收集器 (標(biāo)記-整理算法):Java堆并行收集器,G1收集器是JDK1.7提供的一個(gè)新收集器,G1收集器基于“標(biāo)記-整理”算法實(shí)現(xiàn),也就是說不會產(chǎn)生內(nèi)存碎片。
為什么元空間會取代永久代
整個(gè)永久代有一個(gè)JVM本身設(shè)置固定大小的上限,無法進(jìn)行調(diào)整,而元空間使用的是直接內(nèi)存,受本機(jī)可用內(nèi)存限制,出現(xiàn)OOM錯(cuò)誤的幾率大大降低
雙親委派機(jī)制:避免重復(fù)加載 + 避免核心類篡改

————————————————
版權(quán)聲明:本文為CSDN博主「熱愛編程的小張同學(xué)」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/weixin_45326085/article/details/115566399
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
??長按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
