每日三道面試題,通往自由的道路6——JVM


茫茫人海千千萬萬,感謝這一秒你看到這里。希望我的面試題系列能對你的有所幫助!共勉!

願你在未來的日子,保持熱愛,奔赴山海!

每日三道面試題,成就更好自我

今天我們繼續聊聊JVM的話題吧!

1. 那你知道什么時候才會觸發Full GC

  1. 在老年代空間不足的時候:
    老年代空間只有在新生代對象發生minor Gc轉入或者是直接創建為大對象、大數組時出現空間不足的現象,當JVM執行Full GC后空間仍然不足,則拋出如下錯誤:java.lang.OutOfMemoryError: Java heap space

    解決措施:盡量做到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要創建過大的對象及數組。

  2. 在我們程序中直接調用了System.gc, 也會直接出發Full GC。

  3. 在永久代空間滿
    永久代中存放的為一些class的信息等,當系統中要加載的類、反射的類和調用的方法較多時,永久代空間可能會被占滿,在未配置的時候采用這CMS垃圾收集器的情況下會執行Full GC。如果經過Full GC仍然回收不了,那么JVM會拋出如下錯誤信息:java.lang.OutOfMemoryError: PermGen space

    解決措施:可采用的方法為增大永久代空間或轉為使用CMS GC。

  4. 在CMS垃圾收集器出現promotion failed(晉升失敗)和concurrent mode failure(並發模式故障)

    對於如果我們采用CMS垃圾收集器進行老年代GC的程序而言,我們就需要主要在GC日志中是否有晉升失敗和並發模式故障兩種狀況,當這兩種狀況出現時可能會觸發Full GC:

    晉升失敗(promotion failed) 是在新生代進行Minor GC時,幸存區中放不下、而對象只能放入老年代,而此時老年代也放不下造成的。

    concurrent mode failure是CMS轉悠的錯誤,即並發清楚線程和工作線程同時工作,清理出來老年代的空間不足以存放由新生代晉升到老年代的對象。

    解決措施:減少年輕代大小,避免放入老年代時需要分配大的空間,同時調整觸發Full GC時的比率以及將觸發CMS GC的閥值適當增大

不錯不錯,這都難不倒你!

2. JVM中四種引用你有了解過嗎?

  • 強引用:垃圾收集器不會回收被強引用的對象。

    在 Java 中最常見的就是強引用, 把一個對象賦給一個引用變量,這個引用變量就是一個強引用。即在我們寫類似這樣User user = new User(),我們new出來的user對象就是一個強引用了!

    當一個對象被強引用變量引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的即使在內存不足的情況下,JVM寧願拋出OutOfMemory錯誤也不會回收這種對象。

  • 軟引用:在沒有被強引用對象,當系統要發生內存溢出的異常之前,會將其列為回收范圍,進行第二次回收。

    軟引用需要用 SoftReference 類來實現,對於只有軟引用的對象來說,當系統內存足夠時它不會被回收,當系統內存空間不足時它會被回收。軟引用通常用在對內存敏感的程序中。

  • 弱引用:具有弱引用的對象擁有更短暫的生命周期。在沒有被強引用對象,只能存活在下一次垃圾收集器前。無論內存夠不夠。

    弱引用需要用 WeakReference 類來實現,它比軟引用的生存期更短,對於只有弱引用的對象來說,只要垃圾回收機制一運行,不管 JVM 的內存空間是否足夠,總會回收該對象占用的內存。

  • 虛引用:無法通過虛引用取得一個對象實例,設置虛引用的目的是為了能在這個對象被垃圾收集器回收時收到一個通知。 虛引用的主要作用是跟蹤對象被垃圾回收的狀態。

可以,那問你最后一道:

3. 說說你知道的幾種主要的JVM參數

  1. 堆設置

    • -Xms:初始堆大小
    • -Xmx:最大堆大小
    • -XX:NewSize=n:設置新生代大小
    • -XX:NewRatio=n:設置年輕代和年老代的比值。如:為3,表示新生代與老年代比值為1:3,新生代占整個新生代老年代和的1/4
    • -XX:SurvivorRatio=n:新生代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區占整個新生代的1/5
    • -XX:MaxPermSize=n:設置持久代大小
  2. 收集器設置

    • -XX:+UseSerialGC:設置串行收集器
    • -XX:+UseParallelGC:設置並行收集器
    • -XX:+UseParalledlOldGC:設置並行老年代收集器
    • -XX:+UseConcMarkSweepGC:設置並發收集器
  3. 並行收集器設置

    • -XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。

    • -XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間

    • -XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比。公式為1/(1+n)

  4. 並發收集器設置

    • -XX:+CMSIncrementalMode:設置為增量模式。適用於單CPU情況。

    • -XX:ParallelGCThreads=n:設置並發收集器新生代收集方式為並行收集時,使用的CPU數。並行收集線程數。

  5. JVM 調優的參數

    • -Xms2g:初始化推大小為 2g;
    • -Xmx2g:堆最大內存為 2g;
    • -XX:NewRatio=4:設置年輕的和老年代的內存比例為 1:4;
    • -XX:SurvivorRatio=8:設置新生代 Eden 和 Survivor 比例為 8:2;
    • –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器組合;
    • -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器組合;
    • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器組合;
    • -XX:+PrintGC:開啟打印 gc 信息;
    • -XX:+PrintGCDetails:打印 gc 詳細信息。

小伙子不錯嘛!今天就到這里,期待你明天的到來,希望能讓我繼續保持驚喜!

注: 如果文章有任何錯誤和建議,請各位大佬盡情留言!如果這篇文章對你也有所幫助,希望可愛親切的您給個三連關注下,非常感謝啦!也可以微信搜索太子爺哪吒公眾號私聊我,感謝各位大佬!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM