gpt4 book ai didi

java - 混淆 Java 内存管理(栈和堆)

转载 作者:搜寻专家 更新时间:2023-11-01 01:36:47 24 4
gpt4 key购买 nike

这听起来可能很愚蠢,但我仍然不清楚 Java 堆栈和内存堆。我通过学习了解到的内容如下:

1) 所有的方法调用都入栈。

2)本地分配的所有内存都在内存堆上(这点不是很清楚)

3) new 运算符分配的所有内存(无论是在方法中还是在类中)都在内存堆上。

我担心以下情况:

1) 如果我在方法中创建一个 int 变量并返回它,它会去哪里(我相信它会进入堆栈,但需要澄清)。

2) 如果我在一个方法中创建一个新对象,它会进入堆内存,即使在方法执行结束后它仍然存在(我理解发生这种情况是因为当我分配这个时,java 创建的对象的哈希码保持不可变对象(immutable对象)到一些外部引用变量或者我返回这个对象)。

3) 我的问题是如果我没有将第 2 点中提到的对象分配给任何引用或者我没有返回它会发生什么。它仍然是在堆上创建的吗?逻辑上应该是,但请赐教。

最佳答案

所有方法参数都进入堆栈。所有局部变量都进入堆栈。堆中唯一的东西是使用 new 显式分配的东西(或通过自动装箱或可变参数隐式分配。)

另一种思考方式是原始值和对象/数组引用可以进入堆栈,但实际对象不能1

所以:

1) - 你返回一个原始值(不是变量!),它进入堆栈。 (您不能“返回”变量。变量是堆栈帧的一部分,不能从中分离。)

2) 是的。

3) 是的,至少现在1。在某些时候,GC 可能会运行,注意到应用程序不再有对该对象的引用,并回收它。


1 - 实际上,最新的 Hotspot 编译器能够检测到对象的引用永远不会从创建它的方法中“逃逸”,并且对象可以在堆栈上分配。 IIRC,这种优化 - 称为逃逸分析 - 需要使用 JVM 命令行标志启用。

关于java - 混淆 Java 内存管理(栈和堆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com