
程序计数器
每个线程私有,记录程序执行到哪一步。通过这个计数器的值来选取下一条需要执行的字节码指令。因为所存的只是下一条指令的地址,就算死循环也不会让内存溢出,所以不存在OutOfMemoryError(内存溢出) 异常。
虚拟机栈
每个线程私有,每个 Java 方法执行的时候都会创建一个方法栈帧,并从虚拟机栈的顶部入栈(压栈),执行完成后从虚拟机栈出栈(弹栈)。会抛出 StackOverflowError(堆栈溢出,线程请求的栈深度大于虚拟机所允许的深度) 和 OutOfMemoryError(内存溢出,如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存) 异常。
本地方法栈
区别于 Java 虚拟机栈的是,本地方法栈为虚拟机执行的是Native方法,Native方法指的是 Java 通过 JNI 直接调用本地 C/C++ 库。本地方法栈也会抛出 StackOverflowError(堆栈溢出,线程请求的栈深度大于虚拟机所允许的深度) 和 OutOfMemoryError(内存溢出,如果本地方法栈可以动态扩展,而扩展时无法申请到足够的内存) 异常。
堆
线程共享,堆可能是JVM所管理的内存中最大的一块,主要是存放对象实例和数组。会抛出OutOfMemoryError(内存溢出) 异常。
方法区
属于线程共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。
1180

被折叠的 条评论
为什么被折叠?



