╬左岸の暧昧 发表于 2009-5-23 15:59:00
|
其实要了解对象的释放,需要了解一下对象的存储,即对象是怎么样进行放置安排的呢?特别是内存中究竟是如何进行分配的呢?有五个不同的地方可以用来存储数据:
- 寄存器。这是最快的存储区,因为它位于不同于其它地方的存储区位置——CPU内部。但是寄存器的数量是有限的,所以寄存器会根据需要进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。(C/C++是允许通过编译器建议寄存器的分配方式)
- 栈。位于RAM中,但是通过栈指针可以从处理器那里获得直接的支持。栈指针向下移动,则分配新的存储空间;向上移动,则释放掉那些内存。这是一种快速有效的内存分配方式,仅次于寄存器。创建程序时,JAVA系统必须知道存储在栈所有项的确切的生命时期,以便于向下或者向上移动栈指针。这一约束也就限制了程序的灵活性,所以只有某些JAVA数据存储在栈中——基本数据类型以及对象引用。
- 堆。一种通用的内存池,这个也位于RAM中,用于存放JAVA所有的对象。堆不同于栈的好处是:编译器不需要知道存储的数据在堆内要存活多长的时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象的时候,用new写一行代码,执行代码之后,会自动在堆中进行存储的分配。当然,为这种灵活性必须要付出的代价是:用堆进行存储分配和清理可能比用栈进行存储分配和清理花上的时间要多。堆是线程共同拥有的,但是栈确实线程独有的。
- 常量存储。常量值通常直接存放在程序代码内部。这样做是安全的,因为它们永远都不会被改变有时,在嵌入式系统中,常量本身会和其它部分隔开,所以在这种情况下,可以选择其他存放在ROM中。
- 非RAM存储——持久化数据。如果数据完全存活在程序之外,那么它可以不受程序的控制。在程序没有运行时也可以存在,也就是持久性数据。其中,两个非常基本的例子——“流对象”和“持久化对象”。在流对象中,对象转化成字节流,通常被发送到另一台机器上。而在“持久化对象”中,对象将被存储在磁盘中,比如文件或者数据库。因此,即使程序终止了,他们仍然可以保持自己的数据状态。这种存储方式的技巧在于——把对象转化成可以存放在其他媒介上的事物,在需要的时候可以恢复成常规的、存储在 RAM的对象。JAVA提供了对轻量级持久化的支持,比如JDBC以及Hibernate这样的机制提供了更加复杂的对存储在数据库以及读取对象信息的支持。