在java中的堆栈内存上创建对象?

问题描述 投票:0回答:4

这只是出于好奇而提出的一个简单的理论问题。我一直都是一个java迷。但有一件事让我想知道为什么java不提供在堆栈上创建对象的机制?如果我可以在堆栈上创建小 Point(int x,int y ) 对象而不是像在 C# 上创建结构体那样在堆上创建,那不是更高效吗? java 中的此限制背后是否有任何特殊的安全原因? :)

java value-type stack-memory
4个回答
19
投票

这里的策略是,Java 不会将此决定泄露给语言,而是让 JVM/Hotspot/JIT/运行时决定在何处以及如何分配内存。

正在研究使用“逃逸分析”来找出哪些对象实际上不需要进入堆并进行堆栈分配。我不确定这是否已经成为主流 JVM。但如果确实如此,它将由运行时(thing -XX:something)控制,而不是开发人员。

这样做的好处是,即使是旧代码也可以从这些未来的增强功能中受益,而无需对其进行更新。

如果您想手动管理它(但仍然让编译器检查它是否保持“安全”),请看看 Rust。


6
投票

这将暂时出现在 Java 中,目前还没有真正的预计到达时间,所以你只能希望它会出现在 Java 10 中。

该提案称为“值类型”,您可以在 Valhalla 项目的邮件列表中关注它

我不知道是否有任何先前的原因来解释为什么它首先没有用语言编写,也许最初它被认为是不需要的,或者根本没有时间来实现它。


3
投票

一个常见的问题是使用在堆栈上创建的对象来初始化一些全局引用。当创建对象的方法退出时你指向什么?

也就是说,对象是在 Java 中的堆栈上创建的,它只是在您背后使用 逃逸分析 完成的,这确保了上述情况不会发生。


0
投票

JVM 进行标量替换

它不是在堆栈上分配对象,而是将对象分解为基元,消除未使用的对象,并使用 CPU 寄存器和堆栈来存储和操作有用的对象。

这种优化比简单的堆栈分配强大得多,并且是自动执行的。

参见 -XX:-消除分配

© www.soinside.com 2019 - 2024. All rights reserved.