java运行时数据区有哪些,面试常被问

如果写的有任何问题,请各位指出,这篇文章只是简单介绍运行时数据区,里面涉及的详细信息,会在随后的文章中解释,如果有需要知道的地方,麻烦留言,会写文章详细说明~~

废话不多说,下面是一张运行时数据区的简单图片:

java运行时数据区有哪些,面试常被问

运行时数据区

1. 程序计数器

它可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等功能都需要它来完成。

由于Java多线程在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令,因此为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,这个区域是唯一一个在java虚拟机规范中没有任何OutOfMemoryError情况的区域。

2. 栈

java虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行结束的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。

如果线程请求的栈深度大于虚拟机所容许的深度,将抛出StackOverflowError异常,如果虚拟机栈可以动态扩展,扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。会有单独的一章来介绍一个栈的具体执行情况,请关注哦~

3. 本地方法栈

本地方法栈为虚拟机使用到的Native方法方法服务。会抛出StackOverflowError和OutOfMemoryError异常。虚拟机栈为执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。

4. 堆

Java堆是虚拟机管理内存中最大的一块,是被所有线程共享的一块内存区域。在虚拟机启动时创建。Java堆可以细分为:新生代和老年代;再细致一点的有Eden空间,From Survivor空间,To Survivor空间等。

Java堆是垃圾回收的主要区域,此篇文章不详细讲解垃圾回收,以后会有一篇详细的介绍。

如果堆中没有内存完成实例分配,并且堆也无法在扩展时,将会抛出OutOfMemoryError异常。

5. 方法区

方法区和堆一样,是各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息,常量,静态变量(Java7中被移动到了堆中),即时编译器编译后的代码等数据。运行时常量池中的String类型数据在Java7中也被移动到了堆中,HotSpot 虚拟机使用永久代来实现方法区,java8之后对方法区的实现有个新的改变,JVM不再有PermGen,开始使用Metaspace元数据来实现方法区。

当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

java运行时数据区有哪些,面试常被问

异常和参数总结

猜你喜欢

转载自blog.csdn.net/Java___Architect/article/details/89376593