乐趣区

关于jvm:面试题JVM

什么状况下会产生栈内存溢出

形容栈定义,再形容为什么会溢出,再阐明一下相干配置参数,OK 的话能够给面试官手写是一个栈溢出的 demo。

  1. 栈是线程公有的,他的生命周期与线程雷同,每个办法在执行的时候都会创立一个栈帧,用来存储局部变量表,操作数栈,动静链接,办法进口等信息。局部变量表又蕴含根本数据类型,对象援用类型
  2. 如果线程申请的栈深度大于虚拟机所容许的最大深度,将抛出 StackOverflowError 异样,办法递归调用产生这种后果
  3. 如果 Java 虚拟机栈能够动静扩大,并且扩大的动作曾经尝试过,然而无奈申请到足够的内存去实现扩大,或者在新建设线程的时候没有足够的内存去创立对应的虚拟机栈,那么 Java 虚拟机将抛出一个 OutOfMemory 异样。(线程启动过多)
  4. 参数 -Xss 去调整 JVM 栈的大小

详解 JVM 内存模型

思路:给面试官画一下 JVM 内存模型图,并形容每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。

  1. 程序计数器:以后线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程公有。
  2. Java 虚构栈:寄存根本数据类型、对象的援用、办法进口等,线程公有。
  3. Native 办法栈:和虚构栈类似,只不过它服务于 Native 办法,线程公有。
  4. Java 堆:java 内存最大的一块,所有对象实例、数组都寄存在 java 堆,GC 回收的中央,线程共享。
  5. 办法区:寄存已被加载的类信息、常量、动态变量、即时编译器编译后的代码数据等。(即永恒带),回收指标次要是常量池的回收和类型的卸载,各线程共享

JVM 内存为什么要分成新生代,老年代,长久代。新生代中为什么要分为 Eden 和 Survivor。

思路:先讲一下 JAVA 堆,新生代的划分,再谈谈它们之间的转化,相互之间一些参数的配置(如:–XX:NewRatio,–XX:SurvivorRatio 等),再解释为什么要这样划分,最好加一点本人的了解

共享内存区划分

  1. 共享内存区 = 长久带 + 堆
  2. 长久带 = 办法区 + 其余
  3. Java 堆 = 老年代 + 新生代
  4. 新生代 = Eden + S0 + S1

一些参数的配置

  • 默认,新生代与老年代的比例的值是 1:2,能够通过参数 -XX:NewRatio 配置。
  • 默认,Edem:from:to=8:1:1(能够通过参数 -XX:SurvivorRatio 来设定)
  • Survivor 区中的对象被复制次数(对应虚拟机参数 -XX:+MaxTenuringThreshold)

为什么要分为 Eden 和 Survivor? 为什么要设置两个 Survivor 区?

  1. 如果没有 Survivor,Eden 区每进行一次 Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发 Major GC. 老年代的内存空间远大于新生代,进行一次 Full GC 耗费的工夫比 Minor GC 长得多, 所以须要分为 Eden 和 Survivor。
  2. Survivor 的存在意义,就是缩小被送到老年代的对象,进而缩小 Full GC 的产生,Survivor 的预筛选保障,只有尽力了 16 次 Minor GC 还能在新生代中存活的对象,才会被送到老年代。
  3. 设置两个 Survior 区最大的益处就是解决了碎片化,刚刚新建的对象在 Eden 中,经验一次 Minor GC,Eden 中的存活对象就会被移到到第一块 survivor space S0,Eden 被清空;等 Eden 区在满了,就再触发一次 Minor GC,Eden 和 S0 中的存活对象又被复制送入第二块 survivor space S1(这个过程十分重要,因为这种复制算法保障了 s1 中来自 S0 和 Eden 两局部的存活对象占有间断的内存空间,防止了碎片化的产生。)

JVM 中一次残缺的 GC 流程是怎么的,对象如何降职到老年代

思路:先形容一下 Java 堆内存划分,再解释 Minor GC、Major GC、full GC、以及他们之间的转化流程

  1. Java 堆 = 老年代 + 新生代
  2. 新生代 = Eden + S0 + S1
  3. 当 Eden 区的空间满了,Java 虚构机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor 区。
  4. 大对象(须要大量间断内存空间的 Java 对象,如那种很长的字符串)则间接进入老年态。
  5. 如果对象在 Eden 出世,并通过第一次 Minor GC 后依然存活,并且被 Survivor 包容的话,年龄设为 1,每熬过一次 Minor GC,年龄 +1,若年龄超过肯定限度(15),则被降职到老年态。即上期存活的指向进入老年态。
  6. 老年代满了而无奈包容更多的对象,Minor GC 之后通常就进行 Full GC,Full GC 清理整个内存堆 - 包含年老代和年轻代。
  7. Major Gc 产生在老年代的 GC,清理老年区,常常会随同至多一次 Minor GC,比 Minor GC 慢 10 倍以上。

你晓得哪几种垃圾收集器,各自的优缺点,重点讲下 CMS 和 G1,包含原理,流程,优缺点

思路:肯定要记住典型的垃圾收集器,尤其 cms 和 G1,它们的原理与区别,波及的垃圾回收算法。

几种垃圾收集器

  1. Serial 收集器:单线程的收集器,收集垃圾时,必须 stop the world,应用复制算法。
  2. ParNew 收集器:Serial 收集器的多线程版本,也须要 stop the world,复制算法
  3. Parallel Scavenge 收集器:新生代收集器,复制算法的收集器,并发的多线程收集器,指标是达到一个可控的吞吐量。如果虚拟机总共运行 100 分钟,其中垃圾花掉 1 分钟,吞吐量就是 99%。
退出移动版