5

我正在读一本书“Thinking in 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

4 回答 4

3

所有静态内容将在类加载/启动时创建 并存储在特殊位置(很可能是 perm gen 的一部分,根据实现而有所不同)。

第二个例子,当你Myclass被加载时,它的静态内容将被创建/实例化。

教程可能会为您提供高级别的概述。

于 2012-09-21T17:42:14.023 回答
1

静态是程序的特殊内存位置。所以程序可以很容易地访问它。只有一个这样的位置可供程序运行。它是创建静态内容的地方。JVM 在堆上实例化对象。但是,如果您对对象进行静态引用,那么它将放置在静态内存位置。

于 2012-09-21T17:52:54.943 回答
0

静态变量存储在方法区。
方法区是非堆内存的一部分。它存储每个类的结构、方法和构造函数的代码。每类结构意味着运行时常量和静态字段
堆内存、非堆内存和方法区是内存和 JVM 的主要术语。

于 2012-09-21T18:07:18.730 回答
0

这取决于JVM的实现。在您的示例中,变量被初始化为原始值,因此它将存储在元空间(本机内存,堆外)中。如果您使用对象对其进行初始化,则new ObjectClassSmthng()该对象将存储在堆中,而x变量(这是一个引用)将存储在元空间中。

HotSpot JDK 8 也是如此。

于 2017-01-25T14:26:08.890 回答