Java运行时,对象是怎么存储、内存是怎么分配的

1.堆栈:
RAM的一块存储区域,如果堆栈的指针后移,就会创建一块新的内存、如果前移,则会释放那些内存。这种方式不仅快而且效率也非常高。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便指针的前后移动。这样肯定影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——比如对象的引用,但Java对象并不放到其中。
2.堆:
一种常规用途的内存池(也在RAM区域),其中保存了Java对象。编译器不需要知道要从堆里分配多少存储空间,也不需要知道数据在堆里存放多长时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编写相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。这样提高了保存数据的灵活性,但是,效率上肯定受到影响,会降低的。
3.静态存储:
静态:是指“位于固定位置”(也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的,即:只是将对象的成员变量(属性)设置为static、这样就把它存放在静态存储里面。但Java对象本身永远都不会放在静态存储空间。
4.常数存储空间:
常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
5.简单基本类型数据存储:
由于这些简单基本类型的数据在进行程序设计时要频繁用到它们。之所以要特别对待,是由于用new创建对象(特别是小的、简单的变量)并不是非常有效,因为new将对象置于“堆”里。对于这些类型,Java采纳了与C和C++相同的方法。也就是说,不是用new创建变量,而是创建一个并非引用的“自动”变量。这个变量容纳了具体的值,并置于堆栈中,能够更高效地存取。
Java规定了每种简单数据类型的大小。就象在大多数语言里那样,他们的大小并不随着机器结构的变化而变化。这种大小的不可更改性正是Java程序具有很强移植能力的原因之一。

你可能感兴趣的:(java,数据结构,C++,c,C#)