程序执行时如何放置对象?内存布局方式如何?
1、寄存器(Registers):速度最快的存储场所、位于处理器内部。JVM设置了4个常用的寄存器。
2、Stack(栈):位于一般的RAM,处理器经由其指针提供直接支持。当程序分配一块新的内存时,stack指针往后移;释放内存时,指针往前移。这种方式不仅很快,效率也高,仅次于寄存器。由于编译器有责任产生“将stack指针前后移动”的程序代码,所以它必须能够完全掌握它所编译的程序中“存在stack里头的所有数据的实际大小和存活时间”。如此一来便会限制程序的弹性。由于这个限制,我们可以把对象的reference(指针)存储在stack内,却不能将一般的Java对象存储在里面。
3、Heap(堆):Heap是一种通用性质的内存存储空间(也存在RAM中),用来存储所有Java对象。Heap胜于stack之处在于,编译器不需知道从heap中分配多少空间,也不许知道从heap分配的空间究竟需要存在多久。因此,自heap分配存储空间可以获得高度的弹性。每当你需要产生对象,只需要在程序中使用new,那么当它执行的时候,便会从heap分配空间。从heap分配空间比stack分配耗费时间多了不少。
4、静态存储空间:也在RAM中,你可以使用关键字static,将对象内的特定成员设为静态,但Java对象本身绝无可能置于静态存储中。
5、常量存储空间:常量值常常被置于程序代码里头。也可以放在ROM中。
6、Non-RAM存储空间
基本数据类型是直接存放数据值,而不是通过new。存放在stack中的。
书山有路勤为径,学海无涯苦作舟