JVM面试题及答案

  • JVM运行时内存区域划分
  1. 程序计数器:主要是保存程序执行的下一跳指令的地址
  2. 虚拟机栈:主要是处理java代码中的方法,每个方法的执行都会创建一个对应的栈帧,每个方法从开始执行到执行完毕,对应的就是栈帧的出栈和入栈。包含局部变量表,操作数栈,动态链接,方法出口。局部变量表中主要存储基本数据类型以及对象的引用。局部变量表在代码编译期间大小就已经确定。

   会出现两种异常:内存溢出和栈溢出

当线程请求的栈深度大于虚拟机所容许的最大深度,则会抛出StackOverFlowError异常。如果栈的深度是可以动态变化的,当扩展到无法申请到足够的内存空间时,则抛出OutOfMemeryError

  1. 本地方法栈:Native方法,起作用和java虚拟机栈类似

以上三个都是线程私有的,垃圾回收器不会回收这三个区域

  1. 方法区:主要存放类信息,常量,静态变量,运行池常量池
  2. 堆:存放对象实例;垃圾回收的主要区域
  • 如何判断对象是否可以回收或存活

GCRoots:通过一系列名为“GC ROOTS”对象作为起始节点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC ROOTS没有任何引用链相连时,则证明该对象不可用。

可作为GC ROOTS的对象有一下几种:

  1. java虚拟机栈中的局部变量表中的引用的对象
  2. 方法区的静态属性引用的对象
  3. 方法区的常量引用的对象
  4. 本地方法栈中JNI引用的对象

   但是一次没有引用链相连是不能够确定该对象是一定不可用的,还要看finalize()方法是否有必要执行。该对象没有实现finalize方法或者虚拟机已经调用过该方法,都认为该方法没有必要执行,即回收该对象。如果该对象实现了finalize方法且没使用过,虚拟机则会根据finalize方法中是否有该对象的引用,没有则回收,有了则不回收。(finalize维护一个队列,虚拟机会启动低优先级的线程去执行,但是并不保证该线程能执行完成,目的确保线程的安全)

  • 常见的GC回收算法及其含义
  1. 标记清除:会产生大量的内存碎片
  2. 标记整理:主要用于老年代
  3. 复制算法:内存利用率不高;主要使用在新生代中
  4. 分代算法
  • 常见的JVM性能监控和故障处理工具类:jps、jstat、jmap、jinfo、jconsole等
  •  
  • JVM如何设置参数

-xx

-xss

  • JVM性能调优
  • 类加载器、双亲委派模型、一个类的生命周期、类是如何加载到JVM中的
  • 类加载的过程:加载、验证、准备、解析、初始化
  • 强引用、软引用、弱引用、虚引用
  • Java内存模型JMM

你可能感兴趣的:(java)