主要方法是否也在堆中分配?

时间:2014-02-03 06:38:41

标签: java memory-management jvm main

我读到“Java中的每个对象都在堆中分配。”

我也知道“每个程序,对象都是由Object类继承的”我虽然不确定类名。

因此,如果包含main方法的程序也由Java虚拟机中的对象类继承,那么它是否也是一个对象?主要方法是否也在堆中分配?如果是,那么它是否意味着Java中的所有内容都在堆中分配?

4 个答案:

答案 0 :(得分:2)

run-time data areas上的JVM规范可能会有所帮助。启动程序时,JVM的引导类加载器会加载具有main方法的类。 Java类加载器将每个类的方法添加到JVM的方法区域中,这是一个共享内存池,其中包含Java类的所有可执行代码。然后它分配一个框架来保存main方法中定义的变量;该帧是在堆栈上还是在堆上分配是依赖于实现的。

答案 1 :(得分:2)

类定义本身(包括main等方法)分配在JVM的特殊区域中。类加载器负责将它放在那里。

加载类时,可以引用它。本地引用(例如在方法中定义的引用)在堆栈上分配为该方法的堆栈帧的一部分。引用指向的实际对象在堆上分配。具有引用字段的对象与对象本身一起分配在堆上。

答案 2 :(得分:0)

在Java中,类的概念有点误导。一方面,它是一个最小的程序,也是复杂程序的一个组成部分。另一方面,它是参考数据类型。当声称“所有类都是从Object继承”时,class被称为数据类型。但只有类的非静态成员才能定义数据类型。像static void main()这样的静态成员是程序的一部分,但不是数据类型的一部分。因此mainObject和堆无关。

答案 3 :(得分:0)

方法不是对象,因此不存储在堆上。但是,JVM中有一个辅助存储区,用于存储常量永久数据。这些是无需收集垃圾的数据,如类文件中的数据。 (但是,有些JVM可能会执行类垃圾回收。)

所以,回到你的问题,当我们有这个:

class X {
   public static void main(String[] args) { .... }
}

调用main时,还没有X的实例。 Java也不需要我们创建X的实例。事实上,许多初学者程序只有一堆静态方法,因此该类简并为一个命名空间。

因此,除了Java运行时自身创建的一些对象(例如,args数组及其中的元素)之外,在main开始时堆中没有任何内容。