Java的内存区域主要分为5个部分:

1程序计数器

2虚拟机栈

3本地方法栈

4java堆内存

5方法区

---------------

程序计数器 : 和pc电脑端的cpu相似,而cpu寄存器中存储的一个程序计数器,存放的是执行程序的下一条指令地址,在程序执行前,讲程序指令序列的起始地址,程序的第一天指令所在的内存单元地址送到pc,cpu根据pc的地址从内存中读取第一条指令,每一条指令执行时,cpu会自动修改pc的量至下一条指令的地址,指令之间的跳转离不开pc,

jvm内存中的程序计数器也是这样的作用,他存储kvm当前执行的字节码的地址

java虚拟机中允许多个线程同时执行指令.如果多个线程执行指令,那么每个线程都会有一个程序计数器,它是线程私有的,一个线程只允许执行一个方法的代码,每当执行到java方法的指令时,程序计数器保存当前执行字节码的地址,

--------------------

java虚拟机栈 : 也是线程私有的,每一条线程都拥有自己私有的java虚拟机栈,它与线程同时创建,

它描述了java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,

每一个方法从调用至完成的过程,都对应一个站帧从入栈到出站的过程,

------------------------

本地方法栈 : 和java虚拟机栈的作用相似,java虚拟机执行的是字节码,而本地方法栈执行的是native和方法.

本地方法栈使用传统的栈来支持native方法,在HotSot JVM中java虚拟机栈和本地方法栈合二为一

-----------------------------

java堆 : 

在jvm中,java堆是可供各线程共享的运行时内存区域,是java虚拟机所管理的内存区域中最大的一块, 

几乎所有的对象实例和数组的实例都要在java堆上分配,同时java堆也是发生gc收集的主要区域 ,

从内存回收 的角度来看,它可以分为新生代和老年代,

java堆得容量是固定的,也可以随着需要来扩展,并且在用不到的时候自动收缩.

-0---------------------------

方法区  

方法区也是线程共享的,它存储了每一个类的结构信息,比如 : 运行时常量池,字段和方法为数据,构造函数和普通方法的字节码内容,海包括一些初始化的时候用到的特俗方法,方法区是堆得逻辑部分

 

MichaelZhao