JVM运行时数据区
其中 方法区 和 java堆 为多线程共用区域
其余为现成私有区域
程序计数器:
- 当前线程执行的字节码的行号的存放空间,字节码解释器通过改变这个值来获取下一条执行字节码,各条线程都独立,互不影响;
- 如果正在执行的是Java方法,则在计数器中记录的是虚拟机字节码指令的地址;
- 若是Native方法,则记录的值为Undefined;
- 此区域没有规定OutOfMemoryError
Java虚拟机栈:
- 用于存放局部变量
- 虚拟机栈用于存储编译期可知的基本类型(int、long等)、对象的引用(实例在java堆中地址)和一条字节码指令的地址
- 栈帧:每个方法执行时会把方法的局部变量、操作数栈、方法出口等信息存到一个栈帧中,即一个方法的执行就是一个栈帧从入栈到出栈的过程
- 每个方法在编译期会把方法中局部变量所占用的空间进行分配,即在方法执行可以得到的局部变量空间是完全确定的
本地方法栈:
- 用于存放本地方法(即用native关键字修饰的方法)
- 虚拟机对于方法的语言、使用方式和数据结构都没有特殊的规定,可有虚拟机自己实现
Java堆:
- JVM内存管理中最大的一块
- 用于存放对象实例和数组
- 垃圾回收的主要区域
方法区(有些地方叫 -- 非堆):
- 用于存放已经被虚拟机加载的类信息、常量、静态变量等数据
- 常量池:类信息中的一部分,用于存放字面量(final修饰的常量)和符号引用(方法签名等)
- 运行时常量池:方法区的一部分,在虚拟机加载Class后将常量池中数据放入运行时常量池中
- 运行时常量池支持动态常量,即在程序运行时将新的常量放入运行时常量池中
其中除了程序计数器,其他区域均可以通过虚拟机参数设置为动态扩展空间或者指定大小的空间,若空间不足均会报出 OutOfMemoryError 异常
如果栈的请求深度超过虚拟机允许的深度,则会报出StackOverflowError异常
来源:oschina
链接:https://my.oschina.net/u/3001485/blog/787241