2017-01-26 122 views
-3

參加大學的操作系統課程並深入瞭解內存管理。我有一個問題似乎沒有被我的教科書解答。當我聲明一個對象時,究竟發生了什麼?例如,如果我這樣做:當你聲明一個對象時堆上發生了什麼?

String one; 
String two; 

在堆上分配的內存究竟是多少?或者它還沒有被分配,因爲編譯器不知道該對象的大小是多少?我真正想從中得出的結論是,如果在堆上聲明兩個對象相對接近,然後在實例化時,第一個對象太大並且與第二個內存空間重疊?

這可能在不同的語言中有不同的處理方式,所以我希望我的解釋是用Java來解釋。謝謝!

+0

您不聲明對象。你聲明_variables_。 –

+0

謝謝,我想這就是我誤解。 –

回答

1

您的聲明將不會在堆上分配任何內容。如果你不初始化它們,那麼這兩個字符串都是null。在該方法運行的堆棧幀中,將在堆棧上分配兩個字符串「指針」。

至於你的其他問題,對象(包括字符串)永遠不能在堆上相互重疊。所有的內存都在Java中進行管理以保證這一點。如果一個對象相對於另一個對象存儲不能保證,並且實際上可能會在程序生命週期中更改,因爲垃圾回收器會重新組織堆。

+0

非常感謝,謝謝!是否說C++具有相同類型的垃圾回收以確保重疊不會發生在堆上? –

+0

堆管理不僅僅是垃圾回收......當你在C++中分配兩個對象時,內存將是分開的。但是C++沒有gc(或者至少是我多年前使用的C++的最後一種風格)。 –

+0

*「如果您不初始化它們,則兩個字符串都爲空。」*如果它們是局部變量,則不是。那麼他們就沒有任何價值。而且由於你指的是堆棧幀,你也假定它們是局部變量,所以.... – Andreas

相關問題