一、内存模型以及分区,需要详细到每个区放什么
JVM 分为堆区、栈区、方法区、本地方法栈、程序计数器
方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据
堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要在堆上分配
栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个引用类型,所以还是一个指向地址的指针。
本地方法栈:主要为 Native 方法服务
程序计数器:记录当前线程执行的行号
二、GC 的两种判定方法
引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就会回收,但是JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)的情况。
可达性算法(引用链法):通过一种 GC ROOT 的对象来判断,如果有一条链能够到达 GC ROOT 就说明不需要回收,不能到达 GC ROOT 就说明可以回收。
三、简述 Java 垃圾回收机制
在 Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。