jvm面试题解答

  网上找到的一些jvm面试题,现整理并且把答案搞出来。

 

JVM内存模型?

如图所示:

jvm面试题解答_第1张图片

 

 

写一段代码实现堆溢出(heap 对象太大)?栈溢出(死循环,死递归)?常量池溢出(intern)?方法区溢出?

链接说明:http://www.cnblogs.com/ELMND/p/4630070.html

 

类的生命周期?

加载

连接

  • 验证
  • 准备
  • 解析
  • 是否初始化判定 

初始化

  • 一个类被直接引用则初始化,否则就是被动引用,不会初始化

使用

卸载

what?是否被卸载的判定:

  • 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
  • 加载该类的ClassLoader已经被回收。
  • 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

how?在方法区中清空类信息

jvm面试题解答_第2张图片

 

哪四种情况会触发类的初始化(也就是主动引用)?

运行main方法

new对象,对象的静态方法、静态变量

反射获取对象,调用对象的方法、变量属性

实例化子类,引起父类的初始化

http://blog.csdn.net/zhengzhb/article/details/7517213

 

被动引用会触发初始化吗?请举例

不会

初始化某类型的数组

调用类的静态变量

使用父类的静态变量,不引起子类的初始化

 

Class对象在堆中的作用?

创建对象实例

 

 

类加载器(ClassLoader)的类加载模式?为什么要选择这种模式?双亲委托加载模式的代码实现?

1、委托模式

2、节约资源;保证安全。

3、代码如下:

 

protected synchronized Class<?> loadClass(String name, boolean resolve)
 throws ClassNotFoundException
    {
 // First, check if the class has already been loaded
 Class c = findLoadedClass(name);
 if (c == null) {
     try {
  if (parent != null) {
      c = parent.loadClass(name, false);
  } else {
      c = findBootstrapClass0(name);
  }
     } catch (ClassNotFoundException e) {
         // If still not found, then invoke findClass in order
         // to find the class.
         c = findClass(name);
     }
 }
 if (resolve) {
     resolveClass(c);
 }
 return c;
    }

 

代理和委托的理解(23种设计模式中没有委托)
委托:比起代理的意义更加广泛,不知道应该怎么实现,丢给委托人实现。不知道实现逻辑。
代理:有一层‘中介’来,可能是中介来实现,也有可能中介是对实现的封装。知道实现逻辑, 但是增加非主要功能

 

如何实现自定义的ClassLoader?

继承classLoader。(一般是用来实现插件,动态代理等)

 

JDK动态代理的原理?

基于接口的代理

 

虚拟机栈的栈帧包含哪些部分以及各部分功能?

局部变量表、操作数栈、动态链接、方法返回地址--有待补充

 

字节码执行引擎方法调用中静态分派和动态分派区别?重写(覆盖)与重载?(理解多态

静态分派:知道类型。StringBuilder sb = new StringBuilder();

动态分派:不知道类型。根据运行时执行。StringBuilder sb = new Object();

重写:子类和父类的关系

重载:同一个类中,方法之间的关系。

 

JVM为什么选用基于栈的指令集而不是基于二地址指令集?

 基于stack的字节码执行引擎,一般来说指令集有基于寄存器和基于栈的。JVM为了和平台无关性,选用了基于栈的指令集。--有待补充

 

 

动态代理的原理?好处?JDK动态代理与Cglib动态代理的区别?

运行时生成类。

好处是不需要对业务代码进行修改。避免把逻辑改得很乱。(比如说代码中插入访问日志、访问权限控制等)

JDK的动态代理是方法级别的,cglib的动态代理是类级别的。一般来说cglib更好用一些。

 

垃圾收集算法?标记-清除算法缺点?复制算法缺点?标记-整理算法适用区域?解释一下分代收集算法?

算法有:

标记-清除mark-sweep(缺点是整理后内存很零散)

复制copying(缺点是需要两份,浪费空间)

标记-整理mark-compact(缺点是慢,用于老生代)

分代回收(新生代使用复制、老生代使用标记整理)

 

内存分配与回收策略?

新对象放到新生代,大对象,长期存活对象放老年代

 

有哪些垃圾收集器以及各自区别?Serial与ParNew异同点? ParNew与Paralell Scanvenge区别?CMS最大特点及显著缺点?

serial(用于新生代,串行,最早,适用于client的jvm模式,复制算法)

Parallel Scavenge(用于新生代,并行,复制算法)

ParNew(新生代、并行,复制算法,可以和cms一起使用

Serial old(用于老年代,串行,mark-sweep)

Parallel Old(用于老年代,并行,mark-compact)

CMS(用于老年代,并行,mark-sweep到一定程度后,mark-compact。可以收集p区。mark-sweep会产生碎片,会引发full gc

G1(不区分新生代还是老生代的垃圾收集器)

 

哪些对象可归为GC Roots?

 Class - class loaded by system class loader. Such classes can never be unloaded. They can hold objects via static fields. Please note that classes loaded by custom class loaders are not roots, unless corresponding instances ofjava.lang.Class happen to be roots of other kind(s)

Thread - live thread

Stack Local - local variable or parameter of Java method

JNI Local - local variable or parameter of JNI method

  • JNI Global - global JNI reference
  • Monitor Used - objects used as a monitor for synchronization

Held by JVM - objects held from garbage collection by JVM for its purposes. Actually the list of such objects depends on JVM implementation. Possible known cases are: the system class loader, a few important exception classes which the JVM knows about, a few pre-allocated objects for exception handling, and custom class loaders when they are in the process of loading classes. Unfortunately, JVM provides absolutely no additional detail for such objects. Thus it is up to the analyst to decide to which case a certain "Held by JVM" belongs.

 

MinorGC与FullGC区别?

minor gc 只针对新生代;
full gc 是回收heap,non-heap区域。(minor + major)

你可能感兴趣的:(jvm)