对象方法存储在堆栈还是堆中?

问题描述

堆对象内部的方法会发生什么?

所以我一直在阅读有关堆栈和堆内存管理的信息。

  • 方法和变量(内部方法)存储在堆栈中。
  • 对象和实例变量存储在堆内部。
  • 在堆栈方法调用对象时,它具有指向堆对象的指针。

我会假设这些方法存储在堆栈中,因为“ 方法存储在堆栈中”。但是我找不到关于此的确认。例如构造函数会发生什么?

我看过的文章或教程视频只提供了主类中方法的示例。

任何人都可以回答这个问题吗?

解决方法

将根据其在Java中的工作方式进行解释。

方法和变量(内部方法)存储在堆栈中。

局部变量(方法内的变量)存储在堆栈中。但不是方法本身。

通过方法,我们引用行为或需要执行的指令列表。这不会改变每个方法调用,甚至不会改变创建的每个对象实例。在班级的行为保持不变。

该行为存储在一个称为“方法”区域的区域中。您可以参考Java Spec了解更多详细信息。

按照规范,

方法区域是在虚拟机启动时创建的。尽管方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不进行垃圾回收或压缩。此版本的Java虚拟机规范没有规定方法区域或用于管理已编译代码的策略的位置。

留给方法区域所在的JVM实现。
直到Java 7之类的HotSpot VM之类的实现都用于将方法区域存储为堆的一部分。但是从Java 8开始,它被移出堆,并且分配给堆的空间未被方法区域占用。

例如构造函数会怎样?

构造是具有特殊名称<init>1的方法。它们的存储方式与其他方法相同。
附带说明一下,有一个名为<clint>的类初始化方法,该方法处理类中的静态块。2