Java对象内存分配

简单通俗的讲,一个完整的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  

相关文章
相关标签/搜索