1. 介绍JVM的内存区域(运行时数据区)
JVM 中内存分为若干部分: 堆,方法区,虚拟机栈,本地方法栈,程序计数器。其中方法区和堆是线程共享的部分,其他是线程隔离的。
1. 堆是用来存放实例对象和数组对象的。 Java堆还可以细分为新生代和老年代,Java堆在物理上不连续,只要在逻辑上连续。
2.方法区用来存储已被虚拟机加载的类信息,常量,静态变量
3. 虚拟机栈式java方法执行的内存模型
4. 本地方法栈,Java调用本地方法。
5. 程序计数器,,记录当前线程执行到的字节码的行号。
2. 如何判断对象已经死亡
1. 引用计数法
每当一个地方引用它,计数器就会+1,当引用失效时,计数器会减1,当为0时,对象不在使用,无法解决循环引用问题。
2. 可达性分析
这个算法的基本思想是通过一系列称为"GC Roots"的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到CG Roots没有任何引用链相连的话,证明此对象是不可用的。
3. 简述强,软,弱,虚引用
1. 强引用
如果一个对象具有强引用,垃圾回收器绝不会回收它,当内存不足时,Java宁愿抛出OutOfMemoryError错误,使程序异常终止。
2. 软引用
如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足,就会回收这些对象的内存,只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的告诉缓存。
3. 弱引用
相对于软引用,弱引用关联的对象只能生存到下一次垃圾回收之前。
4. 虚引用
4. 简述垃圾收集算法以及各自的特点
1. 标记-清除算法
1. 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象, 它是最基础的收集算法,会带来两个明显的问题;1: 效率问题和2 内存碎片
2. 复制算法
将内存分为大小相同的两块, 每次使用其中的一块,当这一块内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次性清除掉。这样就使每次的内存回收都是对内存空间一半进行回收。但是,为了收集垃圾,将内存使用量降低为一半,成本比较高。所以,一般不会1:1划分空间。
3. 标记-整理算法
标记过程与标记-清楚算法一致,但后续操作不是直接对可回收对象进行回收,而是让所有存活的对象像一段移动,然后直接清理掉边界以外的内存。
4. 分代收集算法
一般Java堆分为新生代和老年代。
比如新生代,每次收集都会有大量对象死去,所以可以选择复制算法,老年代对象存活率高,可以选择标记清楚,标记整理算法。