-1

以下语句中的数据将存储为自动内存分配,还是动态内存分配,或两者兼而有之

myFunction(new MyClass());

谢谢你!

4

4 回答 4

4

术语“自动内存分配”和“动态内存分配”在 Java 上下文中没有意义。在 Java 中,所有内存都由执行环境管理。

在其他编程语言中,术语“自动存储”和“动态存储”用于区分超出范围时自动释放的存储和需要应用程序执行显式释放操作的存储。在 Java 中,根本没有显式的释放。你会发现人们和文学继续区分堆栈和堆,其中只有后者包含对象,其生命周期可能超过创建它们的方法的执行时间。然而,这只是一种逻辑分离,可能无法反映特定 JVM 实现的实际工作方式。

Java® 语言规范没有强制要求有关其工作的太多细节。根本只有两个地方:

15.12.4.5。创建帧、同步、传输控制

m某个类中的方法S已被标识为要调用的方法。

现在创建了一个新的激活框架,其中包含目标引用(如果有)和参数值(如果有),以及用于局部变量和堆栈的足够空间以供调用的方法以及任何其他可能的簿记信息实现所需的(堆栈指针、程序计数器、对先前激活帧的引用等)。如果没有足够的可用内存来创建这样的激活帧,StackOverflowError则抛出 a。

 

17.4.1. 共享变量

可以在线程之间共享的内存称为共享内存堆内存

所有实例字段、static字段和数组元素都存储在堆内存中。在本章中,我们使用术语变量来指代字段和数组元素。

局部变量(第 14.4 节)、形式方法参数(第 8.4.1 节)和异常处理程序参数(第 14.20 节)永远不会在线程之间共享,并且不受内存模型的影响。

请注意,这是唯一将“堆”一词用作内存类型的地方,以及它在此处的实际定义方式……</sup>

15.9.4 节。类实例创建表达式的运行时评估§15.10.2。数组创建表达式的运行时评估更加模糊,说“空间已分配”,OutOfMemoryError如果没有足够的可用空间则抛出一个,仅此而已。

因此,如果您走区分堆栈和堆的路线,您可以说您的代码myFunction(new MyClass());将导致为 的实例分配堆MyClass,然后为方法的实际实现的激活帧分配堆栈myFunction。并不是说它对任何实际目的都很重要。


如果您想深入了解这种方式,JVM 可能会实现它,您可以参考Java® 虚拟机规范

2.5.2. Java 虚拟机堆栈

每个Java 虚拟机线程都有一个私有的 Java 虚拟机堆栈,与线程同时创建。Java 虚拟机堆栈存储帧(第 2.6 节)。Java 虚拟机堆栈类似于 C 等传统语言的堆栈:它保存局部变量和部分结果,并在方法调用和返回中发挥作用。因为除了推送和弹出帧外,Java 虚拟机堆栈永远不会被直接操作,因此帧可能是堆分配的。Java 虚拟机堆栈的内存不需要是连续的。

 

2.5.3. 堆

Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的堆。堆是为所有类实例和数组分配内存的运行时数据区域。

堆是在虚拟机启动时创建的。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收;对象永远不会被显式释放。Java虚拟机假设没有特定类型的自动存储管理系统,存储管理技术可以根据实现者的系统要求来选择。堆可以是固定大小的,也可以根据计算的需要进行扩展,如果不需要更大的堆,则可以收缩。堆的内存不需要是连续的

请注意,这些定义如何仅在其目的上有所不同,而在其约束方面没有显着差异,即可能是固定大小或可调整大小并且可能是连续的或不连续的,更不用说明确提到在堆。

于 2016-09-07T17:52:58.943 回答
1

Java中有三组内存

  1. - 这是您调用 new MyClass() 时创建和定位对象的位置;
  2. 堆栈- 堆栈包含堆栈帧,并且堆栈帧具有为堆中的基元和指向对象的指针分配的空间。堆栈帧在方法调用时分配,在方法返回时释放
  3. 字符串常量:在编译时定义的字符串文字将被添加到字符串常量池中。在运行时,可以使用 String.intern() 将字符串添加到池中

就是这样

于 2016-09-07T13:31:10.050 回答
1

在您的示例中分配了两件事;

  1. 表达式在对象堆上new MyClass()分配一个实例。MyClass

  2. new表达式的结果是一个对象引用。对象引用保存在调用的激活记录myFunction()中。激活记录分配在调用线程的调用堆栈上。

于 2016-09-07T13:31:36.220 回答
1

当您创建一个新对象时,它通常分配在堆上,但是通过逃逸分析,它可以像本地变量一样被解包到堆栈上。

唯一的分配是通过new或捕获 lambda(或在极少数情况下的某些本机方法)分配对象的不同方式之间没有任何明确的区别。

于 2016-09-07T18:58:04.690 回答