2012-09-21 67 views
4

我在讀一本書「在Java編程思想」,這說 對象存儲在堆和對存儲在某個固定位置靜態變量說靜態存儲,這樣他們可以適用於整個時間程序正在運行。其中靜態對象存儲在Java

class Myclass{ 

static int x =0;  //stored on static storage 
Myclass obj = new Myclass(); //stored on heap 

} 

雖然製作一個對象,但就OOPS而言靜態不是一個好主意。把它擱置一會兒。有我的問題

  1. 在哪裏存儲聲明爲靜態的對象。
  2. JVM如何在這種情況下進行實例化。
    class Myclass { static Myclass obj = new Myclass(); //no man's land }

回答

4

所有靜態內容將在類負載/啓動被創建並存儲在特殊的地理位置(最有可能燙髮根的一部分,而不同基礎上實現)。

對於第二個例子,當你的Myclass被加載,它的靜態內容將被創建/實例化。

tutorial可以給你高層次的概述。

+0

確定,這意味着堆不會發揮作用。 – navyad

1

靜是一個特殊的內存位置的程序。所以該程序可以輕鬆訪問它。只有一個這樣的位置可供程序運行。這是創建靜態內容的地方。 JVM在堆上實例化對象。但是,如果您對對象進行靜態引用,那麼它將放置在靜態內存位置。

0

靜態變量存儲在方法區域。
方法面積爲非堆內存一部分。它存儲每類結構,方法和構造函數的代碼。按類結構意味着運行時常量和靜態字段
heap memory, non-heap memory and method area are the main jargon when it comes to memory and JVM.

+0

我認爲這是一個欺騙性的答案。如果將此靜態字段設置爲對象,則靜態字段(在java中只是一個指針)將駐留在此方法區域內存中,但它將指向堆上的對象。所以,即使字段本身駐留在內存的方法區域,它的值也會駐留在堆上,我猜測OP在問什麼。 – compman2408

0

這取決於JVM的實現。在你的例子中,變量被初始化爲一個原始值,所以它將被存儲在元空間(native memnory,offheap)中。如果你用新的ObjectClassSmthng()初始化它,對象將被存儲在堆中,x變量(這是一個引用)將被存儲在元空間中。

這對於熱點JDK是真正的8