Java虚拟机内存管理
本篇文章将对Java虚拟机的内存模型进行总结,各个部分的详细内容在后边也会逐步扩展说明。
从上图中我们可以看出,在虚拟机运行时的数据内存可分为线程共享区和线程独占区。顾名思议,线程共享区代表每个线程都可以共享的内存区,线程独占区,即每一个线程都独有的内存区。
下面分别进行详细介绍:
(1)程序计数器
从上图中也对程序计数器也简单的做了介绍,但要注意的是程序计数器是Java虚拟机中唯一的一块不会出错error的内存区域。
(2)Java虚拟机栈
栈帧:当每个方法执行的时候都会创建一个栈帧,Java虚拟机栈就是用来存放栈帧的容器。
下面先来看一个图来进行介绍。
从图中我们可以看出,Java虚拟机栈的容量大小也是有限的,当创建的栈帧超出了他的容量大小,将会报StackOverFlow异常,即栈溢出异常。常见的如 无止境的递归调用,即会出现这个错误。
与此同时,Java虚拟机栈也会报OutOfMemory异常,当向堆申请内存超出堆本身内存的大小时,将会发生这个错误。
(3)本地方法栈
(4)方法区
(5)Java堆
需要说明的是-Xmx -Xms虚拟机参数时为了对虚拟机堆内存进行控制大小的参数。