歡迎光臨
每天分享高質量文章

JVM 面試題

來源:老碼農 

lingsui.github.io/2018/03/30/JVM面試題/

1、你知道哪些或者你們線上使⽤什麼GC策略?它有什麼優勢,適⽤於什麼場景?

參考 觸發JVM進行Full GC的情況及應對策略

https://blog.csdn.net/chenleixing/article/details/46706039/

2、Java類加載器包括⼏種?它們之間的⽗⼦關係是怎麼樣的?雙親委派機制是什麼意思?有什麼好處?

啟動Bootstrap類加載、擴展Extension類加載、系統System類加載。

父子關係如下:

  • 啟動類加載器 ,由C++ 實現,沒有父類;

  • 擴展類加載器,由Java語言實現,父類加載器為null;

  • 系統類加載器,由Java語言實現,父類加載器為擴展類加載器;

  • 自定義類加載器,父類加載器肯定為AppClassLoader。

雙親委派機制:類加載器收到類加載請求,自己不加載,向上委托給父類加載,父類加載不了,再自己加載。

優勢避免Java核心API篡改。詳細查看:深入理解Java類加載器(ClassLoader)

https://blog.csdn.net/javazejian/article/details/73413292/

3、如何⾃定義⼀個類加載器?你使⽤過哪些或者你在什麼場景下需要⼀個⾃定義的類加載器嗎?

自定義類加載的意義:

  1. 加載特定路徑的class檔案

  2. 加載一個加密的網絡class檔案

  3. 熱部署加載class檔案

4、堆記憶體設置的引數是什麼?

  1. -Xmx 設置堆的最大空間大小

  2. -Xms 設置堆的最小空間大小

5、Perm Space中儲存什麼資料?會引起OutOfMemory嗎?

加載class檔案。

會引起,出現異常可以設置 -XX:PermSize 的大小。JDK 1.8後,字串常量不存放在永久帶,而是在堆記憶體中,JDK8以後沒有永久代概念,而是用元空間替代,元空間不存在虛擬機中,二是使用本地記憶體。

詳細查看Java8記憶體模型—永久代(PermGen)和元空間(Metaspace)

https://www.cnblogs.com/paddix/p/5309550.html/

6、做GC時,⼀個物件在記憶體各個Space中被移動的順序是什麼?

標記清除法,複製演算法,標記整理、分代演算法。

新生代一般採用複製演算法 GC,老年代使用標記整理演算法。

垃圾收集器:串行新生代收集器、串行老生代收集器、並行新生代收集器、並行老年代收集器。

CMS(Current Mark Sweep)收集器是一種以獲取最短回收停頓時間為標的的收集器,它是一種併發收集器,採用的是Mark-Sweep演算法。

詳見 Java GC機制

http://www.cnblogs.com/dolphin0520/p/3783345.htmll/

7、你有沒有遇到過OutOfMemory問題?你是怎麼來處理這個問題的?處理 過程中有哪些收穫?

permgen space、heap space 錯誤。

常見的原因

  1. 記憶體加載的資料量太大:一次性從資料庫取太多資料;

  2. 集合類中有對物件的取用,使用後未清空,GC不能進行回收;

  3. 代碼中存在迴圈產生過多的重覆物件;

  4. 啟動引數堆記憶體值小。

詳見 Java 記憶體上限溢位(java.lang.OutOfMemoryError)的常見情況和處理方式總結

http://outofmemory.cn/c/java-outOfMemoryError/

8、JDK 1.8之後Perm Space有哪些變動? MetaSpace⼤⼩預設是⽆限的麽? 還是你們會通過什麼⽅式來指定⼤⼩?

JDK 1.8後用元空間替代了 Perm Space;字串常量存放到堆記憶體中。

MetaSpace大小預設沒有限制,一般根據系統記憶體的大小。JVM會動態改變此值。

  • -XX:MetaspaceSize:分配給類元資料空間(以位元組計)的初始大小(Oracle邏輯儲存上的初始高水位,the initial high-water-mark)。此值為估計值,MetaspaceSize的值設置的過大會延長垃圾回收時間。垃圾回收過後,引起下一次垃圾回收的類元資料空間的大小可能會變大。

  • -XX:MaxMetaspaceSize:分配給類元資料空間的最大值,超過此值就會觸發Full GC,此值預設沒有限制,但應取決於系統記憶體的大小。JVM會動態地改變此值。

9、jstack 是⼲什麼的? jstat 呢?如果線上程式周期性地出現卡頓,你懷疑可 能是 GC 導致的,你會怎麼來排查這個問題?執行緒⽇志⼀般你會看其中的什麼 部分?

jstack 用來查詢 Java 行程的堆棧信息。

jvisualvm 監控記憶體泄露,跟蹤垃圾回收、執行時記憶體、cpu分析、執行緒分析。

詳見Java jvisualvm簡要說明,可參考 線上FullGC頻繁的排查

Java jvisualvm簡要說明

https://blog.csdn.net/a19881029/article/details/8432368/

線上FullGC頻繁的排查

https://blog.csdn.net/wilsonpeng3/article/details/70064336/

10、StackOverflow異常有沒有遇到過?⼀般你猜測會在什麼情況下被觸發?如何指定⼀個執行緒的堆棧⼤⼩?⼀般你們寫多少?

棧記憶體上限溢位,一般由棧記憶體的區域性變數過爆了,導致記憶體上限溢位。出現在遞迴方法,引數個數過多,遞迴過深,遞迴沒有出口。


編號754,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂