“JVM 為什么使用元空間替換了永久代?”
這是一個作業6年的同學去位元組第一面遇到的問題,很遺憾,他沒有回答出來
大家好,我是Mic,一個作業了14年的Java程式員,
關于這個問題,我們怎么回答?面試官到底關注什么呢?
面試決議
我們都知道Java8以及以后的版本中,JVM運行時資料區的結構都在慢慢調整和優化,
但實際上這些變化,對于業務開發的小伙伴來說,沒有任何影響,
因此我可以說,99%的人都回答不出這個問題,
但是互聯網大廠的面試就是篩選那1%的優秀人才,因此通過這道題,
- 既可以考察求職者對JVM原理的理解程度
- 又能夠考察求職者基本功的扎實程度
- 還能實作高級人才的篩選
在Java7里面,JVM運行時資料區是這樣的,
在Hotspot虛擬機中,方法區的實作是在永久代里面,它里面主要存盤運行時常量池、Klass類元資訊等,
永久代屬于JVM運行時記憶體中的一塊存盤空間,我們可以通過-XX:PermSize來設定永久代的大小,
當記憶體不夠的時候,會觸發垃圾回收,

在JDK1.8里面,JVM運行時資料區是這樣的,
在Hotspot虛擬機中,取消了永久代,由元空間來實作方法區的資料存盤,
元空間不屬于JVM記憶體,而是直接使用本地記憶體,因此不需要考慮GC問題,
默認情況下元空間是可以無限制的使用本地記憶體的,但是我們也可以使用JVM引數來限制記憶體使用大小,

為什么要使用元空間來替換永久代,背后必然有它的道理,但是如果求職者能夠回答出來,
必然對于JVM底層原理是有一定了解的,
我們來看看高手的回答,
高手:
有三個方面的原因:
-
在1.7版本里面,永久代記憶體是有上限的,雖然我們可以通過引數來設定,但是JVM加載的class總數、大小是很難確定的,
所以很容易出現OOM問題,
但是元空間是存盤在本地記憶體里面,記憶體上限比較大,可以很好的避免這個問題,
-
永久代的物件是通過FullGC進行垃圾收集,也就是和老年代同時實作垃圾收集,
替換成元空間以后,簡化了Full GC,可以在不進行暫停的情況下并發地釋放類資料,同時也提升了GC的性能
-
Oracle要合并Hotspot和JRockit的代碼,而JRockit沒有永久代,
以上就是我對這個問題的理解,
總結
好了,今天的分享就到這里結束了,
如果喜歡我的作品,記得點贊、收藏、關注!!!
需要金九銀十Java面試題資料掃下方
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/504620.html
標籤:Java
