1.说一下方法区和永久代的关系。
《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 方法区和永久代的关系很像 Java 中接口和类的关系,类实现了接口,而永久代就是 HotSpot 虚拟机对虚拟机规范中方法区的一种实现方式。 也就是说,永久代是 HotSpot 的概念,方法区是 Java 虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久代这一说法。
2.Java 创建一个对象的过程
在 Java 堆中进行对象分配、布局和访问
Java 内存区域详解 | JavaGuide
3.对象的访问定位的两种方式
句柄和直接指针两种方式
Java 内存区域详解 | JavaGuide
4.你了解分代理论吗?讲一下 Minor GC、还有 Full GC。
1、大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC。
2、执行GC后,将存活的对象分配到Survivor空间
3、无法放到Survivor空间的对象,分配到老年代
4、分配到Survivor的对象,经过多次Minor GC后,进入老年代
新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC,Major GC的速度一般会比Minor GC慢10倍以上。
Eden区空间不足,触发MinorGC;老年代空间不足,触发Full GC
5.Java 用什么方法确定哪些对象该被清理?讲一下可达性分析算法的流程。
6.如何回收方法区
方法区主要回收的是无用的类,那么如何判断一个类是无用的类的呢?
判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面 3 个条件才能算是 “无用的类” :
该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。加载该类的 ClassLoader 已经被回收。该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样不使用了就会必然被回收。
7.新生代垃圾收集器有哪些?老年代垃圾收集器有哪些?哪些是单线程垃圾收集器,哪些是多线程垃圾收集器?各有什么特点?各基于哪一种垃圾收集算法?
新生代垃圾收集器:Serial(串行)收集器,ParNew 收集器,Parallel Scavenge 收集器
老年代垃圾收集器:Serial Old 收集器,Parallel Old 收集器,CMS 收集器
G1 收集器(新生代 + 老年代) G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。
使用复制 + 标记 - 整理算法收集新生代和老年代垃圾。
G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。
8.讲一下 CMS 垃圾收集器的四个步骤。CMS 有什么缺点?
整个过程分为四个步骤:
初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;并发标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。
有下面三个明显的缺点:
对 CPU 资源敏感;无法处理浮动垃圾;它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。
9.G1 垃圾收集器的步骤。有什么缺点?
初始标记并发标记最终标记筛选回收
10.讲一下内存分配策略?
对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代