Java 当您声明一个对象时,堆上到底发生了什么?

Java 当您声明一个对象时,堆上到底发生了什么?,java,memory,heap,Java,Memory,Heap,在大学里学习操作系统课程,更深入地学习内存管理。我有一个问题,我的课本似乎没有回答。当我声明一个对象时,到底发生了什么?例如,如果我这样做: String one; String two; 堆上到底是如何分配内存的?还是因为编译器不知道该对象的大小,所以它还没有被分配?我真正想从中弄明白的是,如果两个对象在堆上声明为彼此相对接近,然后在实例化时,第一个对象太大,并且重叠到第二个对象的内存空间中,会怎么样 这在不同的语言中可能会有不同的处理方式,因此我希望最好用Java来解释。谢谢 您的声明将不

在大学里学习操作系统课程,更深入地学习内存管理。我有一个问题,我的课本似乎没有回答。当我声明一个对象时,到底发生了什么?例如,如果我这样做:

String one;
String two;
堆上到底是如何分配内存的?还是因为编译器不知道该对象的大小,所以它还没有被分配?我真正想从中弄明白的是,如果两个对象在堆上声明为彼此相对接近,然后在实例化时,第一个对象太大,并且重叠到第二个对象的内存空间中,会怎么样


这在不同的语言中可能会有不同的处理方式,因此我希望最好用Java来解释。谢谢

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


至于您的其他问题,对象(包括字符串)在堆上永远不能相互重叠。所有内存都是用Java管理的,以保证这一点。当垃圾收集器重新组织堆时,一个对象相对于另一个对象存储的位置是不确定的,事实上在程序的生命周期内可能会发生变化。

您不声明对象。你声明了变量。谢谢,我想这是我误解的。回答很好,谢谢!是否说C++具有相同的垃圾收集类型,以确保堆上不发生重叠?堆管理不只是垃圾收集…当你在C++中分配两个对象时,内存将是分开的。但是C++没有GC(或者至少是我多年前使用的C++最后的味道)。“如果不初始化它们,两个字符串都是空的。”如果它们是局部变量,则不。那么它们就没有任何价值了。因为你指的是堆栈帧,你也假设它们是局部变量,所以。。。。