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次——老年代)



每日一言:

不要让未来的你,讨厌现在的自己。

你可能感兴趣的:(并发编程学习,jvm,垃圾回收,GC,Roots)