-
程序计数器
1、 线程私有。
2、 唯一一个没有OutOfMemoryError异常的区域。 -
虚拟机栈
1、线程私有。
2、包含局部变量表,操作数栈,方法的返回地址,运行时常量池
3、执行一个方法创建一个栈帧,并将建立的栈帧压栈。执行完毕后将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。
4、StackOverflowError异常
线程请求的栈深度大于虚拟机所允许的深度时。
例如:使用递归方法的时候容易导致栈内存溢出异常
5、OutOfMemoryError 异常
如果虚拟机栈可以动态扩展当扩展时无法申请到足够的内存时,就会OutOfMemoryError异常。
6、局部变量表中用“”直接创建出来的字符串可以理解为是在运行时常量池中创建,并且用hashset保存 。下图表示了一个Java栈的模型
- java堆(线程共享)
Java中的堆内存存储对象本身以及数组。
Java堆空间是Java垃圾收集器管理的主要区域。
- 方法区(线程共享)
方法区中,存储了每个类的信息(包括类的名称,方法信息,字段信息)、静态变量、常量以及编译器编译后的代码等。
- 常量池(存在方法区中,线程共享)
在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
但是运行时也可以存放在常量池中,比如 Java String类中的intern()方法
- 局部变量表
用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。
对于基本数据类型的变量,则直接存储它的值,
对于引用类型的变量,则存储对象的引用。局部变量表的大小在编译器就可以确定其大小了,
因此在程序执行期间局部变量表的大小是不会发生改变的。
- 操作数栈
栈最典型的一个应用就是用来对表达式求值。
想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,
程序中的所有计算过程都是借助操作数栈来完成的。
- 指向运行时常量池的引用
因为在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时常量。
- 方法返回地址
当一个方法执行完毕之后,要返回之前调用它的地方,因此栈帧中必须要保存一个方法返回地址。
- 本地方法栈
网友评论