对象可以被强制存储在堆中吗?

3

我只是想了解一下。作为类成员的对象会进入堆中,而局部变量和值类型则进入栈中。是否有使用情况和可能性可以强制将对象推入堆栈?

4个回答

5

不,Java不允许直接访问内存。我认为这没有用例。即使在C++中也不可能实现,因为特定的规则适用于对象保存的位置。您需要实现自己的内存管理程序来实现这一点,而这将是繁琐且依赖于平台的。


1
这方面并没有“使用案例”,因为这不是必需的。请查看我下面的回答。关于C++的评论也是不正确的——你可以专门在堆栈上分配一个对象,我已经编写了整个应用程序来完成这项工作。 - user207421

2

是和不是 - 我认为这里存在一个概念上的误解。

如果通过将对象强制放在堆中,你的意思是希望它在创建它的方法调用后仍然“存活”,那么是的。你只需要保留对它的引用即可。

如果通过将对象强制放在堆中,你的意思是想指定该对象的内存分配位置,那么不行(除非使用一些jni花哨的东西)。


2
在Java中,使用new关键字分配的所有内容都是从堆中分配的。原始类型的局部变量则是从栈中分配的。

1
这些是旧规则。逃逸分析改变了这一点。“对象”可以在堆栈上。 - Thomas Jung
然而,除了性能方面,您不应该注意到任何差异。 - Tobias Langner
@Thomas 谢谢!很高兴看到你每天都能学到新东西... 似乎逃逸分析仍处于实验状态,需要在启动虚拟机时显式启用,我说得对吗? - Lauri

2

类成员的对象存储在堆中。

不对。所有对象都存储在堆中。

... 而本地变量和值类型存储在栈中。

不对。所有本地变量都分配在栈上。如果它们是对象的引用,那么如果对象存在,则相关对象存储在堆中。

是否有使用情况和可能将对象强制推入栈或堆?

不需要。所有对象都分配在堆上。


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