一、JVM專欄之一

zhuangwei發表於2019-04-18

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中就是方法區,存放常量池等東西地方。以後可能會取代

相關文章