已經進入三月份,正所謂金三銀四,正是一年最好的招聘期,想必個人公號粉絲們必定有很多想要跳槽的吧,哈哈,/**偷偷告訴大家其實小編也準備跳槽*/(我要加個註釋,被老闆知道可就完蛋了),說到面試,想必你們必定氣不打一處來,明明擰螺絲的活,非讓咱們有造火箭的技術,話是這麼說,其實不少面試官問jvm題主要緣由有兩個,一是讓你感受他們公司很牛,二就是壓低你的工資,這就是他們的套路,真正能用到的公司少之又少,可是咱們還必須瞭解jvm的,在此,話很少少,小編整合多年jvm的經驗,外加星球的朋友提出的面試遇到的問題,整理一篇jvm面經,但願你們喜歡吧。程序員
Q:jvm中一次完整的GC流程面試
首先對象會在新生代分配,若是新生代沒有資源了,就會進行新生代回收,即Minor GC(後面簡稱MG),若是MG後對象依然存活,將會給對象年齡+1,重複整個操做,若是年紀達到了年齡閾值,就會將對象存入老年代,這裏還有一個特殊的地方,若是你的對象是一個須要大量連續的內存空間的對象,則直接會進入老年代算法
Q:一共有幾種經常使用垃圾回收機制,各自優缺點,如何啓用多線程
一、串行收集器:暫停全部的線程,屬於單線程工做,併發
啓用:-XX:+UseSerialGCjvm
二、並行收集器(默認):暫停全部線程,多線程工做性能
啓用:-XX:+UseParNewGC學習
三、G1收集器:這個主要是對堆內存進行分區,併發性回收線程
啓用:-XX:+UseG1GC對象
四、CMS收集器:多線程掃描,使用的算法是標記清除算法,標記須要回收的對象,進行回收
啓動:-XX:+UseConcMarkSweepGC
Q:新生區跟養老區默認按照多大比例分配的?
首先新生代跟老年代沒有明確多少,你們基本上都是1:2,這個都是能夠配置的,
Q:伊甸園區、倖存0區,倖存1區默認分配比例
新生代中的eden跟survivor的默認比例是8:1:1
Q:什麼叫作指令重排序,內存柵欄
內存柵欄是一個同步屏蔽指令,是CPU對內存訪問時的同步標記,可讓前面的都執行完成後,在執行柵欄後面的東西,你可能會問,全部的程序執行不是一步一步運行的嗎,爲何還要控制,其實如今機器上爲了提升性能,都採用了亂序執行,你先定義一個變量A在定義一個變量B,理論上是先執行A在執行B,可是有多是先執行的B,在執行A,因此,這就是亂序執行,而柵欄就是這麼出現的,保證程序執行不亂序,固然不能保證每一句話都不亂序,只能保證這個節點先後的執行不要相互混亂了,內存可見性的底層原理就是內存柵欄
Q:g1和cms區別,吞吐量優先和響應優先的垃圾收集器選擇
CMS收集器:是基於標記清除算法實現的,通常就是初始標記,併發標記,從新標記,併發清除,目的是實現最短的響應回收時間。保證系統的響應時間,減小垃圾收集時的停頓時間
G1收集器:他的過程是初始標記、併發標記、最終標記、篩選回收,基於標記整理算法實現,以吞吐量優先,保證保證吞吐量的。
Q:強引用、軟引用、弱引用、虛引用
強引用:new出的對象之類的引用,
只要強引用還在,永遠不會回收
軟引用:引用但非必須的對象,內存溢出異常以前,回收
弱引用:非必須的對象,對象能生存到下一次垃圾收集發生以前。
虛引用:對生存時間無影響,在垃圾回收時獲得通知。
Q:volatile如何保證可見性
使用volatile修飾時,能夠理解成全部的操做都放到了主存中,,多個線程共享數據時,能夠保證內存中的數據可見,一個線程修改了數據,會當即更新到主存,下一個線程使用時必定是最新的數據,這即是可見性
Q:jvm內存是怎麼分配的
在Jvm中,Java少了不少權力,好比說配置和釋放資源,由於這一切都交給jvm來完成,因此這種狀況下咱們Java程序員比C程序員輕鬆不少,不容易形成內存溢出,可是引起一個新的問題,就是一旦出現溢出問題,咱們不瞭解jvm就會沒辦法解決問題,因此學習jvm的緣由就在這,
我來解釋一下這個問題啊
jvm內存分配一共有這幾個地方,
程序計數器:佔用內存較小,就是爲字節碼作行號引用的
Java虛擬機棧:其實能夠理解爲咱們常常聽到的棧內存,
本地方法棧:就是爲虛擬機使用的Native方法所用,
Java堆:這是jvm中用到最多的地方,全部的線程均可以使用,用來放實例
方法區:也是被全部的線程共同使用的,用來存儲靜態變量,常量等
Q:新生代,老年代,永生代的含義與區別
hotspot把新生代分爲1個Eden區和2個Survivor區(分別叫from和to)。默認比例爲8:1,通常狀況下,新建立的對象都會被分配到Eden區,若是Minor GC一次後還存在,將會加入Survivor,每次對象堅持在Minor GC存活一次,這個對象就會計數+1,當達到某個數值(年齡閾值,能夠經過-XX:MaxTenuringThreshold來設置)後,就會轉移到老年代,新生代的算法是複製算法,關於什麼叫複製算法,能夠百度,在新生代開始GC時,全部的對象都存在於Eden跟from中,當GC完成後,Eden中還存在的對象會進入to,在from中的對象,根據計數的個數取決去哪,沒達到閾值的進入to,達到的進入老年代,因此每次進行GC後,from跟Eden都是空,第二次GC時,上一次的to就變成這一次的from,(不知道我這麼說能不能明白)由於沒有進入老年代,第二次Minor GC還會對from,也就是這一次的from中的對象進行回收,反覆重複該過程。
什麼叫作老年代呢,老年代都是重新生代熬過來的對象,就是達到年齡閾值的對象,因此老年代不會那麼頻繁的進行回收了,老年代的回收稱爲Major GC 就是清理老年代,老年代回收頻率低於新生代。
什麼叫作永久代呢,其實永久代在hotspot中就是方法區,存放常量池等東西地方。之後可能會取代,
結束語
先寫這些吧,寫多了,你們沒興趣看了,咱們的口號就是「懟死麪試官,從我作起」,你們必定要記住暗號