Java运行时内存区域划分
1.程序计数器:
为线程私有,存储的是当前线程所执行程序的内存地址。
2.Java虚拟机栈:
为线程私有,生命周期与线程相同。Java方法调用的同时会创建一个栈帧用于存放局部变量表等信息。每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表存放的是编译期可知的各种基本数据类型、对象引用类型、returnAddress类型,除double和long占两个空间外,其余类型只占一个局部变量空间。
当线程请求的栈深度大于虚拟机允许的深度,会抛出StackOverflowError;当虚拟机栈动态扩展时申请不到足够的内存,会抛出OutOfMemoryError。
3.本地方法栈:
与Java虚拟机栈作用相似。
4.Java堆:
Java虚拟机管理的最大一块内存,是线程共享的内存区域,它在虚拟机启动时创建,用于存放对象实例。
如果堆中没有内存完成实例分配,并且堆也无法扩展时,会抛出OurOfMemoryError异常。
5.方法区:
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6.运行时常量池:
是方法区的一部分,存放Class文件中的符号引用等。
7.直接内存:
并不是虚拟机内存的一部分。