“JVM 為什麼使用元空間替換了永久代?” 這是一個工作6年的同學去位元組第一面遇到的問題,很遺憾,他沒有回答出來 大家好,我是Mic,一個工作了14年的Java程式員。 關於這個問題,我們怎麼回答?面試官到底關註什麼呢? 面試解析 我們都知道Java8以及以後的版本中,JVM運行時數據區的結構都在慢 ...
“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學架構」公眾號公眾號獲取更多技術乾貨!