声明对象时堆上到底发生了什么?

时间:2017-01-26 22:06:26

标签: java memory heap

参加大学的操作系统课程,深入学习内存管理。我的教科书似乎没有回答我的问题。当我宣布一个对象时,到底发生了什么?例如,如果我这样做:

String one;
String two;

堆上的内存究竟是如何分配的?或者它尚未分配,因为编译器不知道该对象的大小是多少?我真正想从中弄清楚的是,如果在堆上声明两个对象彼此相对接近,然后在实例化时,第一个太大并且重叠到第二个的内存空间?

这在不同的语言中可能会有不同的处理方式,所以我最好用Java来解释。谢谢!

1 个答案:

答案 0 :(得分:1)

您的声明将导致无法在堆上分配任何内容。如果不初始化它们,则两个字符串都为空。在该方法运行的堆栈帧中,将在堆栈上分配两个字符串“指针”。

至于你的其他问题,对象(包括字符串)永远不会在堆上相互重叠。所有内存都用Java管理以保证。无法保证一个对象相对于另一个存储的位置,并且实际上可以在程序的生命周期内更改,因为垃圾收集器会重组您的堆。