Java虚拟机在运行Java程序时会将
内存划分以下区域进行管理.有些区域随着Java虚拟机的启动而创建,有的会随着用户
线程的启动和结束而创建和销毁.
他们主要是:程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native Method Stack),Java堆(Heap),方法区域(Method Area),如下图所示:
如上图所示,程序计数器(Program Counter Register),虚拟机栈(VM Stack)和本地方法栈(Native Method Stack)是归单个线程所有,而Java堆和方法区域由所有的线程共享.
1.程序计数器(Program Counter Register)
程序计数器是一个很小的内存.他是当前线程执行字节码的行号指示器.字节码解释器就是通过程序计数器的值来确定下一条需要执行代码的字节码指令.分支,
循环,跳转,
异常处理,线程恢复等基础功能都需要依赖这个计数器来完成.另外在java的多线程是通过线程轮流切换并分配
处理器执行时间的方式来实现的.为了线程切换后能恢复到正确的执行位置,每条线程都需要独立的程序计数器,各线程之间的计数互不影响,独立存储.如果线程执行的是Java方法,那么计数器记录的是该方法的字节码指令地址,如果执行的本地方法则这个计数器为空(undefined)
2.虚拟机栈(VM Stack)
虚拟机栈描述的是Java方法执行的内容模型:每个方法执行时都会同时创建一个栈帧(Stack Frame)用于保存变量表,操作栈,动态链接,方法出口等信息.每个方法被调用直至执行完成的过程,就对于着一个栈帧在虚拟机中从入栈到出栈的过程.
局部变量表存放了编译期可知的各种基本类型数据类型(boolean,byte,char,short,int,float,long,double),对象引用和returnAddress类型(指向下一条字节码指令的地址)
3.本地方法栈(Native Stack)
本地方法栈的作用和虚拟机栈的作用基本一致,他们的区别在于本地方法栈是执行的Native方法.
4.Java堆(Heap)
堆的是所有线程共享的一大块内存.几乎所有的对象实例以及数组都是在这里分配内存.
5.方法区(Method Area)
方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息,常量,静态变量等数据.很多人愿意把方法区称为"永久代"(Permanent Generation).
6.运行时常量池(Runtime Constant Pool)
运行时常量池是方法区的一部分.Class文件中除了有类的
版本,字段,方法,
接口等描述信息外,还有一项信息就是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用.
- class='magplus' title='点击查看原始大小图片' />
- 大小: 42.7 KB