面试之-JVM

一、JVM垃圾回收的时候如何确定是垃圾?是否知道什么是GC Root:

  1. 什么是垃圾:

    简单来说就是内存中已经不再被使用到的空间就是垃圾。例如:Person p1 = null

  2. 要进行垃圾回收,如何判断一个对象是否可以被回收?

    2.1 引用计数法:

  Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的方法就是通过引用计数来判断一个对象是否可以回收。简单说,给对象添加一个引用计数器,每当有地方引用它,计数器加1,每当有一个引用失效时,计数器值减1.任何时刻计数器为0的对象就是不可能再被使用的,那么这个对象就是可回收对象。那么为什么主流的Java虚拟机里面都没有选用这种算法呢?其中最主要的原因是它很难解决对象之间相互循环引用的问题。(该算法存在,但目前无人使用,解决不掉循环引用问题,了解即可)

    2.2 枚举根节点做可达性分析(根搜索路径):

  为了解决引用计数循环引用问题,Java使用了可定分析的方法。所谓的“GC Roots”或者说tracing GC的“根集合”就是一组必须活跃的引用。基本思路就是通过一系列名为“GC Root”的对象作为起始点,从这个被称为GC Roots的对象向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即给定一个集合的引用作为根出发,通过引用关系便利对象图,能被便利到(可达性的)的对象就被判断为存活,没有便利掉的自然就被判定为死亡。

 

   Java中哪些可以作为GC Roots的对象:

    虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中引用的对象。

    方法区中类静态属性引用的对象。

    方法区中常量引用的对象。

    本地方法栈中JNI(Native方法)引用的对象。

*****************************************************************************************************************************

二、你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值

1. JVM参数类型:

  标配参数:

    -version  -help  java -showversion

  x参数(了解):

    -Xint:解释执行  -Xcomp:第一次使用就编译成本地代码  -Xmixed:混合模式

  xx参数

    Boolean类型:

      公式:-XX:+或者-某个属性值(+表示开启,-表示关闭)   

      Case:

        是否打印GC收集细节:  -XX:-PrintGCDetails  -XX:+PrintGCDetails

        是否使用串行垃圾回收器:  -XX:-UseSerialGC  -XX:+UseSerialGC

    KV设值类型:jps -l  jinfo -flag MetaspaceSize 2116

      公式:-XX:属性key=属性值value

      Case:

        -XX:MetaspaceSize=128m:元空间  -XX:MaxTenuringThreshold=15:to-form,最大存活次数

    jinfo举例,如何查看当前运行程序的配置

      公式:jinfo -flag 项目项 进程编号

      Case:  jinfo -flags 5988:全部参数

    题外话(坑题 ):

      有两个经典参数:-Xms和-Xmx,这个你如何解释:

        -Xms:等价于-XX:InitialHeapSize(初始化堆内存)

        -Xmx:等价于-XX:MaxHeapSize(最大堆内存)

2. 盘点家底查看JVM默认值:

  1. 第一种,查看参数盘点家底:

    jps

    jinfo -flag 具体参数  java进程编号

    jinfo -flags        java进程编号

  2. 第二种,查看参数盘点家底:

    -XX:+PrintFlagsInitial:主要查看初始默认

      java -XX:+PrintFlagsInitial -version

      java -XX:+PrintFlagsInitial

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

      java -XX:+PrintFlagsFinal -version   “=”:没修改过 “:=”:是修改过的

    运行java命令的同时打印出参数:java -XX:PrintFlagsFinal -Xss128k T(运行java类名称)

    -XX:+PrintCommandLineFlags:打印命令行参数(可以看垃圾回收器)

      java -XX:+PrintCommandLineFlags -version

-XX:+UseSerialGC:串行垃圾回收器

-XX:+UseParallelGC:并行垃圾回收器

 *****************************************************************************************************************************

三、你平时工作用过的JVM常用基本配置有哪些?

  1. -Xms:初始内存大小,默认为物理内存61/1,等价于-XX:InitialHeapSize

  2. -Xmx:最大分配内存,默认物理内存1/4,等价于-XX:MaxHeapSize

  3. -Xss:设置单个线程栈的大小,一般默认为512k~1024k,等价于-XX:ThreadStackSize

  4. -Xmn:设置年轻代大小

  5. -XX:MetaspaceSize:设置元空间大小

    元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间和永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小受本地内存控制。

    -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal

  6. 典型设置案例:

    -Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC

  7. -XX:+PrintGCDetails:输出详细GC收集日志信息

  

  8. -XX:SurvivorRatio:

    设置新生代中eden和s0/s1空间的比例,默认:-XX:SurvivorRation=8,Eden:S0:S1=8:1:1,假如:-XX:SurvivorRation=4,Eden:S0:S1=4:1:1。SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同。

  9. -XX:NewRatio:

    配置年轻代于老年代在堆结构的占比,默认:-XX:NewRatio=2新生代占1,老年代占2,年轻代占整个堆得1/3,假如:-XX:NewRatio=4新生代占1,老年代占4,年轻代占整个堆的1/5。NewRadio值就是设置老年代的占比,剩下的1交给新生代。

  10. -XX:MaxTenuringThreshold:设置垃圾最大年龄

-Xms与-Xmx(堆内存)配成一样,避免内存上下波动;

*****************************************************************************************************************************

四、强引用、软引用、弱引用、虚引用分别是什么?

*****************************************************************************************************************************

五、谈谈你对OOM的认识

*****************************************************************************************************************************

*****************************************************************************************************************************

*****************************************************************************************************************************

*****************************************************************************************************************************

猜你喜欢

转载自www.cnblogs.com/luliang888/p/12154551.html