jvm将其运行时所管理的内存分为了几个区域,根据《java虚拟机规范(第二版)》规定,jvm所管理的内存主要包括五块区域:堆(Heap)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)、程序计数器(Program Counter Register)以及方法区(Method Area).如下图:
①堆(Heap):对于大部分人来说最熟悉的就是堆了,也就是存放对象的实例的区域.堆是垃圾回收器管理的主要区域,因此也被称为GC堆,各条线程共享的运行时数据区域.
②虚拟机栈(VM栈):这个虚拟机栈就是书中常提到的栈,每一条虚拟机线程都有自己的虚拟机栈,即线程私有,正因为如此局部变量是不存在线程安全的问题的.虚拟机栈主要用于存储栈帧,什么是栈帧?目前就先简单理解为运行一个方法的一部分上下文吧,存储着局部变量表、操作数栈等信息.以后我会专门写一篇关于栈帧的文章,因为这个概念不仅存在与jvm中.
③本地方法栈(Native Method栈):与虚拟机栈类似,区别在于虚拟机栈为java方法服务,而本地方法栈则是为native方法服务
④程序计数器(Program Counter Register):保存着jvm某一线程将要执行的jvm字节码指令的地址(如果是native方法,则为空),线程私有.
⑤方法区(Method Area):顾名思义,方法区必然保存着方法,与.text段(以后解释)有点类似.但它保存了更多数据:每一个类的结构信息、常量池、方法的字节码内容(包括构造器以及类初始化代码)等等.该区域线程共享
推荐一篇博文:http://hxraid.iteye.com/blog/676235