2013-04-16 35 views
4

關於內存效率,我有以下問題:變量聲明時的Java內存使用情況?

正確的數據類型用於相應的變量勢在必行。代表的1數值爲byte需要記憶的第八長(但請糾正我,如果我錯了)。我的問題是,如果內存分配/扣除發生在定義變量類型或初始化時?這可能看起來很奇怪,但我要求關於不需要初始化的全局變量,因爲它們具有與局部變量相同的默認值。我也想知道對象數據類型是否有默認大小?我認爲這是基於JVM(32位和64位)?

+1

http:// stackoverflow。com/questions/12051047/memory-allocation-for-primitive-and-reference-variables – Raghunandan

回答

1

正確的數據類型用於相應的變量勢在必行。

當然。 Java是一種強類型語言。你的觀點?

將數值1表示爲字節需要八分之一的內存很長(但請糾正我,如果我錯了)。

你錯了。根據其他變量和類型相鄰聲明,可能需要4或甚至8個字節,具體取決於JVM使用的填充。

我的問題是,如果內存分配/扣除發生在定義變量類型或初始化時?

都不是。它發生在分配時間,即在new時間,而不是在例如構造函數期間。

似乎有些奇怪,但我就該不需要初始化,因爲他們有默認

所有變量都需要初始化的全局變量問。在靜態或實例變量的情況下,您不必編寫初始化程序代碼。關於Java的'全球'一詞沒有意義。

與本地變量相反。

它沒有什麼區別。變量仍然必須分配空間和存儲在其中的值,無論是靜態,實例還是方法本地。

我也想知道是否有對象數據類型的默認大小?我認爲這是基於JVM(32位和64位)?

這個問題是沒有意義的。類Object的實例始終具有相同的大小,這些實例在任何地方都沒有記錄或指定,因此可以隨JVM而變化。其他類的實例同上。在我看不到的任何有用的意義上,沒有任何「默認」。

+0

我知道Java是強類型的,我特指具有記錄差異的原語的上下文,因此「選擇「正確的數據類型沒有?我的cprimitive類變量似乎不需要初始化!你能解釋爲什麼嗎?你能澄清一下什麼時候是準確的嗎?文字沒有「新」可以過去,所以當關於文字的記憶被扣除時? – thejartender

+0

@thejartender無論如何,正確選擇數據類型至關重要。我不明白你的意思。所有的靜態和成員變量都被初始化,無論是你的值還是默認值。基元類型默認爲零或假。當類加載時,類的內存被分配:對於一個實例,當你'新建'實例時。包括原始成員。如果您的代碼行爲異常,則應將其編輯到您的代碼中。 – EJP

+0

@EJP所以當'new'關鍵字被實際調用時,內存被分配,而不是被聲明的。但是當一個對象變量被聲明爲'Object r;'時,後臺發生了什麼? – Abdul