存储在堆栈或堆中的对象方法?

Posted

技术标签:

【中文标题】存储在堆栈或堆中的对象方法?【英文标题】:Object methods stored in stack or heap? 【发布时间】:2021-01-19 09:41:39 【问题描述】:

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

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

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

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

我看到的文章或教程视频只给出了主类中的方法示例。

谁能回答这个问题?

【问题讨论】:

【参考方案1】:

将根据它在 Java 中的工作原理进行解释。

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

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

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

行为存储在称为方法区域的区域中。您可以参考Java Spec了解更多详情。

根据规范,

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

方法区所在的位置留给JVM实现。 像 HotSpot VM 这样的实现,在 Java 7 之前,用于将方法区域存储为堆的一部分。但是从 Java 8 开始,它被移出堆,分配给堆的空间不会被方法区占用。

例如构造函数会发生什么?

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

【讨论】:

以上是关于存储在堆栈或堆中的对象方法?的主要内容,如果未能解决你的问题,请参考以下文章

方法的代码块在执行时是不是存在于堆栈或堆中?

对象中的值类型也存储在堆中?

闭包中的变量存储在哪里 - 堆栈或堆?

Java中的堆栈方法区

如何确定 Rust 中的 new() 何时在堆栈或堆上分配

java---堆栈常量池的存储数据