JVM之Java内存结构
Java内存结构的几大部分如下图: 接下来,会对上面每部分区域的功能一一解释。 1、程序计数器:是线程私有区,是内存中一块较小的区域,是当前线程执行的字节码指令的行号指示器,如果线程执行的是Java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是native方法,程序计数器存储的是undefined,此区域是内存中唯一一块没有规定任何OutOfMemoryError(内存溢出)情况的区域,为什么?因为我们不需要操作该区域,该区域是内部维护的。 2、虚拟机栈:是线程私有的,该区域所描述的是Java方法执行的动态内存模型,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息,局部变量表存放的是编译期可知的基本数据类型,引用类型,returnAddress等,局部变量表的内存在编译期完成分配,进入方法后,这个方法需在帧中分配多少内存是固定的,在方法运行期间不会改变局部变量表的大小。如果说栈帧堆满了整个栈,会出现StackOverflowError(栈溢出)异常,栈也可以申请更大的内存,如果申请不到,会抛出OutOfMemoryError异常。 3、本地方法栈:是为本地的native方法服务的,其他的都和虚拟机栈一样。 4、堆:线程共享的一块区域,用来存放对象实例的(由于现在有了逃逸分析技术,也可以将对象分配在栈上)