1.jvm中一次完整的GC流程? 首先物件會在新生代分配,如果新生代沒有資源了,就會進行新生代回收,即Minor GC(後面簡稱MG),如果MG後物件依然存活,將會給物件年齡+1,重複整個操作,如果年齡達到了年齡閥值,就會將物件存入老年代,這裡還有一個特殊的地方,如果你的物件是一個需要大量連續的記憶體空間的物件,則直接進入老年代。
2.一共有幾種常用垃圾回收機制,各自優缺點,如何啟用?
- 1.序列收集器:暫停所有的執行緒,屬於單執行緒工作,啟動:-XX:+UseSerialGC
- 2.並行收集器(預設):暫停所有執行緒,多執行緒工作,啟用:-XX:+UseParNewGC
- 3.G1收集器:這個主要是對堆記憶體進行分割槽,併發性回收,啟用:-XX:+UseG1GC
- 4.CMS收集器:多執行緒掃描,使用的演算法是標記清除演算法,標記需要回收的物件,進行回收。啟用:-XX:+UseConcMarkSweepGc
3.新生區跟養老區預設按照多大比例分配?
首先新生代跟老年代沒有明確多少,大家基本上都是1:2,這個都是可以配置的
4.伊甸園區、倖存0區、倖存1區預設分配比例?
新生代中的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中就是方法區,存放常量池等東西地方。以後可能會取代