8道 JVM ⾯试题–内存区域划分
Q1:运⾏时数据区是什么?
虚拟机在执⾏ Java 程序的过程中会把它所管理的内存划分为若⼲不同的数据区,这些区域有各⾃的⽤途、创建和销毁时间。
线程私有:程序计数器、Java 虚拟机栈、本地⽅法栈。线程共享:Java 堆、⽅法区。
Q2:程序计数器是什么?
程序计数器是⼀块较⼩的内存空间,可以看作当前线程所执⾏字节码的⾏号指示器。字节码解释器⼯作 时通过改变计数器的值选取下⼀条执⾏指令。分⽀、循环、跳转、线程恢复等功能都需要依赖计数器完 成。是唯⼀在虚拟机规范中没有规定内存溢出情况的区域。
如果线程正在执⾏ Java ⽅法,计数器记录正在执⾏的虚拟机字节码指令地址。如果是本地⽅法,计数器值为 Undefined。
Q3:Java虚拟机栈的作用?
Java 虚拟机栈来描述 Java ⽅法的内存模型。每当有新线程创建时就会分配⼀个栈空间,线程结束后栈空间被回收,栈与线程拥有相同的⽣命周期。
栈中元素⽤于⽀持虚拟机进⾏⽅法调⽤,每个⽅法在执⾏ 时都会创建⼀个栈帧存储⽅法的局部变量表、操作栈、动态链接和⽅法出⼝等信息。
每个⽅法从调⽤到执⾏完成,就是栈帧从⼊栈到出栈的过程。
有两类异常:① 线程请求的栈深度⼤于虚拟机允许的深度抛出 StackOverflowError。② 如果 JVM 栈容量可以动态扩展,栈扩展⽆法申请⾜够内存抛出 OutOfMemoryError(HotSpot 不可动态扩展,不存在此问题)。
Q4:本地方法栈的作用?
本地⽅法栈与虚拟机栈作⽤