静态方法内存分配

14

我们有两种分类,堆和栈。当创建一个对象时,对象的内存存储在堆中。如果类具有静态方法,则可以使用类名称调用该方法。如果没有创建对象,它将如何分配内存,如果它这样做,它将在哪里分配内存?

当类具有静态方法时,它们不需要对象实例就可以调用,它们存储在类本身的内存中,而不是堆或栈中。因此,不需要为静态方法分配内存。相反,它们在加载类时被加载到内存中,在整个程序执行过程中一直存在。

2
这个分配的内存是用来做什么的? - Jon Skeet
从他下面的评论中可以明确知道是Java,因此我已经添加了一个Java标签。 - Ernest Friedman-Hill
3个回答

3

这取决于JVM,但是静态字段通常存储在堆上的一个特殊对象中。您可以在堆转储中看到它。当类加载器被卸载时,其类及其静态“对象”/字段也会被清除。

唯一与静态“对象”不同的是您无法获取对其的引用。(但您可以使用反射访问字段)


1

方法(即代码)不会存储在对象中;类的所有对象将共享方法的代码。无论是Java、C++还是几乎任何其他语言,任何方法的代码都只有一个副本,无论是静态的还是非静态的。通常有一个特定的内存区域——例如C++这样的本地语言中的CODE段或Java中的特殊堆区域——用于加载代码。


对象的内存是随类一起创建的。也就是说,只有类的内存在堆中被创建。(Java)只有当我们使用new运算符时才能创建内存。但对于像Math这样的类,我们无法实例化...在这种情况下,内存创建在哪里? - Harini
就像我之前所说的(但我不确定你是否理解),代码并没有存储在对象中,因此这根本不是问题。实际上,它并没有存储在任何可以访问到的地方。它存储在堆的特殊部分中。JVM从类文件中加载字节码,以某种实现相关的方式进行转换,并使方法可用于您的程序。 - Ernest Friedman-Hill
@user980918 java.lang.Math在运行时不需要太多内存 - 我能想到的唯一一件事就是保存“Random”对象的静态变量。类的静态变量与“Class”对象一起存储在堆中。(方法中的局部变量在堆栈中,与方法的静态性无关。) - Paŭlo Ebermann

-1
  • 堆的永久代空间(PermGen)包含永久类元数据和描述符信息。

  • 永久代空间总是保留给类和与类相关的内容(静态成员、静态函数等)。

  • 静态函数属于类,因此可以在不创建类对象的情况下调用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接