简单通俗的讲,一个完整的Java程序运行过程会涉及如下内存区域:html
(1) 寄存器:它直接位于处理器内部 Java中不能直接控制寄存器 java
这是最快的保存区域,由于它位于和其余全部保存方式不一样的地方:处理器内部。然而,寄存器的数量十分有限,因此寄存器是根据须要由编译器分配。咱们对此没有直接的控制权,也不可能在本身的程序里找到寄存器存在的任何踪影。面试
(2) 堆栈:位于通用RAM中,经过堆栈的指针从处理器得到直接支持,堆栈指针向下移动,则分配新的内存,向上移动则释放内存,这样作十分高效。可是建立过程当中,java系统必须知道堆栈中全部项的确切生命周期,这一约束限制了程序的灵活性。基本类型和对象引用就存在其中,可是java对象除外。数据库
驻留于常规RAM(随机访问存储器)区域,但可经过它的“堆栈指针”得到处理的直接支持。堆栈指针若向下移,会建立新的内存;若向上移,则回什邡那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。建立程序时,java编译器必须准确的知道堆栈内保存的全部数据的“长度”以及“存在时间”。这些因为他必须生成相应的代码,以便于向上和向下移动指针。这一限制无疑影响了程序的灵活性,因此尽管有些java数据要保存在堆栈里-特别是对象的句柄,可是java对象并不放到其中。安全
(3) 堆:一种通用的内存池,用于存放全部的java对象。缺点就是为了灵活性而增长了时间。jvm
一种常规用途的内存池,其中保存了java对象。和堆栈不一样,“内存堆”或“堆”最吸引人的地方在于编译器没必要知道要分配多少存储空间,也不知道存储的数据要在堆里停留多长时间。所以,用堆保存数据时会获得更大的灵活性。要求建立一个对象时,只须要new命令编制相关的代码便可。执行这些代码时,会在堆里自动进行数据的保存。固然,为了达到这种灵活性,必然会付出必定的代价:在堆里分配存储空间会花掉更长的时间。.net
(4) 静态存储指针
这儿的“静态”(static)是指“位于固定位置”(也放在RAM里)。程序运行期间,静态存储的数据将随时等待调用。可用static关键字之处一个对象的特定元素是静态的。但Java对象自己永远都不会置入静态存储空间。htm
(5) 常数存储对象
常数值一般直接置于程序代码内部。这样作是安全的,由于他们永远都不会改变。有的常数须要严格的保护,因此可考虑将他们置入只读存储器(ROM)
(6) 非RAM存储:两个基本的例子就是流对象和持久化对象。流对象中,对象将被转化成字节流;持久化对象中,对象被存在于磁盘上,如数据库。
若数据彻底独立于一个程序以外,则程序不运行时奶可存在,并在程序的控制范围以外。其中两种最主要的例子即是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,一般会发给另外一台机器。而对于固定对象、对象保存在磁盘中。即使程序停止运行,他们仍可保持本身的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是他们可以存在于其余媒体中,一旦须要,设置能将他们回复成普通的、基于RAM的对象。
以上都是概念性的东西,能够参考下列博客中,有实践反应的每一步,更加理解这些内存分配。
Java内存分配全面浅析:http://blog.csdn.net/yangyuankp/article/details/7651251
java内存分配研究:http://www.blogjava.net/Jack2007/archive/2008/05/21/202018.html
Java常量池详解之一道比较蛋疼的面试题:http://www.cnblogs.com/DreamSea/archive/2011/11/20/2256396.html
jvm常量池:http://www.cnblogs.com/wenfeng762/archive/2011/08/14/2137820.html
深刻Java核心 Java内存分配原理精讲:http://developer.51cto.com/art/201009/225071.htm