这只是出于好奇而提出的一个简单的理论问题。我一直都是一个java迷。但有一件事让我想知道为什么java不提供在堆栈上创建对象的机制?如果我可以在堆栈上创建小 Point(int x,int y ) 对象而不是像在 C# 上创建结构体那样在堆上创建,那不是更高效吗? java 中的此限制背后是否有任何特殊的安全原因? :)
这里的策略是,Java 不会将此决定泄露给语言,而是让 JVM/Hotspot/JIT/运行时决定在何处以及如何分配内存。
正在研究使用“逃逸分析”来找出哪些对象实际上不需要进入堆并进行堆栈分配。我不确定这是否已经成为主流 JVM。但如果确实如此,它将由运行时(thing -XX:something)控制,而不是开发人员。
这样做的好处是,即使是旧代码也可以从这些未来的增强功能中受益,而无需对其进行更新。
如果您想手动管理它(但仍然让编译器检查它是否保持“安全”),请看看 Rust。
这将暂时出现在 Java 中,目前还没有真正的预计到达时间,所以你只能希望它会出现在 Java 10 中。
该提案称为“值类型”,您可以在 Valhalla 项目的邮件列表中关注它。
我不知道是否有任何先前的原因来解释为什么它首先没有用语言编写,也许最初它被认为是不需要的,或者根本没有时间来实现它。
一个常见的问题是使用在堆栈上创建的对象来初始化一些全局引用。当创建对象的方法退出时你指向什么?
也就是说,对象是在 Java 中的堆栈上创建的,它只是在您背后使用 逃逸分析 完成的,这确保了上述情况不会发生。