我读到“Java中的每个对象都在堆中分配。”
我也知道“每个程序,对象都是由Object类继承的”我虽然不确定类名。
因此,如果包含main方法的程序也由Java虚拟机中的对象类继承,那么它是否也是一个对象?主要方法是否也在堆中分配?如果是,那么它是否意味着Java中的所有内容都在堆中分配?
答案 0 :(得分:2)
run-time data areas上的JVM规范可能会有所帮助。启动程序时,JVM的引导类加载器会加载具有main
方法的类。 Java类加载器将每个类的方法添加到JVM的方法区域中,这是一个共享内存池,其中包含Java类的所有可执行代码。然后它分配一个框架来保存main
方法中定义的变量;该帧是在堆栈上还是在堆上分配是依赖于实现的。
答案 1 :(得分:2)
类定义本身(包括main等方法)分配在JVM的特殊区域中。类加载器负责将它放在那里。
加载类时,可以引用它。本地引用(例如在方法中定义的引用)在堆栈上分配为该方法的堆栈帧的一部分。引用指向的实际对象在堆上分配。具有引用字段的对象与对象本身一起分配在堆上。
答案 2 :(得分:0)
static void main()
这样的静态成员是程序的一部分,但不是数据类型的一部分。因此main
与Object
和堆无关。
答案 3 :(得分:0)
方法不是对象,因此不存储在堆上。但是,JVM中有一个辅助存储区,用于存储常量永久数据。这些是无需收集垃圾的数据,如类文件中的数据。 (但是,有些JVM可能会执行类垃圾回收。)
所以,回到你的问题,当我们有这个:
class X {
public static void main(String[] args) { .... }
}
调用main
时,还没有X的实例。 Java也不需要我们创建X的实例。事实上,许多初学者程序只有一堆静态方法,因此该类简并为一个命名空间。
因此,除了Java运行时自身创建的一些对象(例如,args
数组及其中的元素)之外,在main
开始时堆中没有任何内容。