JVM 常見面試題及詳解

 

大廠常見面試題:

1、JVM 垃圾回收的時候如何確定垃圾?

2、知道什麼是 GC Roots 嗎?

3、如何盤點查看 JVM 系統默認值?

4、你平時工作用過的 JVM 常用的基本配置參數有哪些?


一、JVM 垃圾回收的時候如何確定垃圾?

1、什麼是垃圾

       簡單來說就是內存中已經不在被使用到的空間就是垃圾

2、要進行垃圾回收,如何判斷一個對象是否可以被回收?

       引用計數法

       枚舉根節點做可達性分析(根搜索路徑 GC Roots


二、什麼是 GC Roots?

爲了解決引用計數法的循環引用問題,Java 使用了可達性算法。

跟蹤收集器採用的爲集中式的管理方式,全局記錄對象之間的引用狀態,執行時從一系列名爲GC Roots的對象做爲起點,從這些節點向下開始進行搜索所有的引用鏈,當一個對象到GC Roots 沒有任何引用鏈時,則證明此對象是不可用的。也即給定一個集合的引用作爲根出發點,通過引用關係遍歷。

 

哪些對象可以作爲 GC Roots 的對象

  • 虛擬機棧(棧幀中的局部變量區,也叫局部變量表)中引用的對象
  • 方法區中的類靜態屬性引用的對象
  • 方法去常量引用的對象
  • 本地方法棧中 JNI (Native方法)引用的對象

 

三、如何盤點查看 JVM 系統默認值?

JVM 的參數類型

標配參數

  • -version
  • -help

X 參數(瞭解)

  • -Xint:解釋執行
  • -Xcomp:第一次使用就編譯成本地代碼
  • -Xmixed:混合模式

XX 參數

Boolean 類型:-XX:+ 或者 - 某個屬性值(+ 表示開啓,- 表示關閉)

        -XX:+PrintGCDetails:打印 GC 收集細節

        -XX:-UseSerialGC:不使用了串行收集器

        -XX:+UseSerialGC:使用了串行收集器

        -XX:-PrintGCDetails:不打印 GC 收集細節

KV 設置類型:-XX:key=value

         -XX:MetaspaceSize=128m

        -XX:MaxTenuringThreshold=15

 

盤點家底查看 JVM 默認值

查看初始默認值:-XX:+PrintFlagsInitial

cuzz@cuzz-pc:~/Project/demo$ java -XX:+PrintFlagsInitial
[Global flags]
     intx ActiveProcessorCount                      = -1                                  {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  
......

 

查看修改更新:-XX:+PrintFlagsFinal

bool UsePSAdaptiveSurvivorSizePolicy           = true                                {product}
bool UseParNewGC                               = false                               {product}
bool UseParallelGC                            := true                                {product}
bool UseParallelOldGC                          = true                                {product}
bool UsePerfData                               = true                                {product}
bool UsePopCountInstruction                    = true                                {product}
bool UseRDPCForConstantTableBase               = false                               {C2 product}

= 與 := 的區別是,一個是默認,一個是人爲改變或者 jvm 加載時改變的參數

 

打印命令行參數(可以看默認垃圾回收器):-XX:+PrintCommandLineFlags

cuzz@cuzz-pc:~/Project/demo$ java -XX:+PrintCommandLineFlags
-XX:InitialHeapSize=128789376 
-XX:MaxHeapSize=2060630016 
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseParallelGC

 

四、你平時工作用過的 JVM 常用的基本配置參數有哪些?

-Xms

初始大小內存,默認爲物理內存 1/64

等價於 -XX:InitialHeapSize


-Xmx

最大分配內存,默認爲物理內存的 1/4

等價於 -XX:MaxHeapSize


-Xss

設置單個線程棧的大小,一般默認爲 512-1024k

等價於 -XX:ThreadStackSize


-Xmn

設置年輕代的大小

整個JVM內存大小=年輕代大小 + 年老代大小 + 持久代大小,持久代一般固定大小爲64m,所以增大年輕代後,將會減小年  老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。


-XX:MetaspaceSize

設置元空間大小(元空間的本質和永久代類似,都是對 JVM 規範中的方法區的實現,不過元空間於永久代之間最大區別在於,元空間並不在虛擬中,而是使用本地內存,因此默認情況下,元空間的大小僅受本地內存限制)

元空間默認比較小,我們可以調大一點


-XX:+PrintGCDetails

輸出詳細 GC 收集日誌信息

設置 JVM 參數爲: -Xms10m -Xmx10m -XX:+PrintGCDetails


-XX:SurvivorRatio

設置新生代中 eden 和 S0/S1 空間比例

默認 -XX:SurvivorRatio=8,Eden : S0 : S1 = 8 : 1 : 1


-XX:NewRatio

配置年輕代和老年代在堆結構的佔比

默認 -XX:NewRatio=2 新生代佔1,老年代佔2,年輕代佔整個堆的 1/3


-XX:MaxTenuringThreshold(值規定在0-15)

設置垃圾最大年齡(年輕代經過15次——老年代)



每日一言:

不要讓未來的你,討厭現在的自己。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章