1.jvm中一次完整的GC流程? 首先對象會在新生代分配,若是新生代沒有資源了,就會進行新生代回收,即Minor GC(後面簡稱MG),若是MG後對象依然存活,將會給對象年齡+1,重複整個操做,若是年齡達到了年齡閥值,就會將對象存入老年代,這裏還有一個特殊的地方,若是你的對象是一個須要大量連續的內存空間的對象,則直接進入老年代。程序員
2.一共有幾種經常使用垃圾回收機制,各自優缺點,如何啓用?算法
3.新生區跟養老區默認按照多大比例分配?多線程
首先新生代跟老年代沒有明確多少,你們基本上都是1:2,這個都是能夠配置的併發
4.伊甸園區、倖存0區、倖存1區默認分配比例?jvm
新生代中的eden跟survivor的默認比例是8:1:1性能
5.什麼叫指令重排序,內存柵欄?學習
內存柵欄是一個同步屏蔽指令,是CPU對內存訪問時的同步標記,可讓前面的都執行完成後,在執行柵欄後面的東西,你可能會問,全部的程序執行不是一步一步的運行嗎?爲何還要控制,其實如今機器爲了提升性能,都採用亂序執行,你定義一個變量A在定義一個變量B,理論上是先執行A在執行B,可是有多是先執行B在執行A,因此這就是亂序執行,而柵欄就是這麼出現的,保證程序執行不亂序,固然不能保證每一句話都不亂序,只是能保證這個節點先後的執行不要互相混亂了,內存可見性的底層原理就是內存柵欄。線程
6.g1和cms區別,吞吐量優先和響應優先的垃圾回收器選擇?對象
CMS收集器:是基於標記清除算法實現的,通常就是初始標記,併發標記,從新標記,併發清除,目的是實現最短的響應回收時間。保證系統的響應時間,減小垃圾收集時的停頓時間排序
G1收集器:他的過程是初始標記、併發標記、最終標記、篩選回收,基於標記整理算法實現,以吞吐量優先,保證保證吞吐量的。
7.強引用、軟引用、弱引用、虛引用
強引用:new出來的對象之類的引用,只要強引用還在,永遠不會回收。 軟引用:引用但非必須的對象,內存溢出異常以前,回收。 弱引用:非必須的對象,對象能生存到下一次垃圾收集發生以前。 虛引用:對生存時間無影響,在垃圾回收時獲得通知。
8.volatile如何保證可見性?
使用volatile修飾時,能夠理解成全部的操做都放到了主存中,多個線程共享資源時,能夠保證內存中的數據可見,一個線程修改了數據,會當即更新到主存,下一個線程使用時必定會是最新的數據,這即是可見性。
9.JVM內存是怎麼分配的?
在Jvm中,Java少了不少權力,好比說配置和釋放資源,由於這一切都交給jvm來完成,因此這種狀況下咱們Java程序員比C程序員輕鬆不少,不容易形成內存溢出,可是引起一個新的問題,就是一旦出現溢出問題,咱們不瞭解jvm就會沒辦法解決問題,因此學習jvm的緣由就在這,
我來解釋一下這個問題啊
jvm內存分配一共有這幾個地方,
程序計數器:佔用內存較小,就是爲字節碼作行號引用的
Java虛擬機棧:其實能夠理解爲咱們常常聽到的棧內存,
本地方法棧:就是爲虛擬機使用的Native方法所用,
Java堆:這是jvm中用到最多的地方,全部的線程均可以使用,用來放實例
方法區:也是被全部的線程共同使用的,用來存儲靜態變量,常量等
10.新生代,老年代,永生代的含義與區別?
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中就是方法區,存放常量池等東西地方。之後可能會取代