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

时间:2014-09-18 02:37:36

标签: java value-type stack-memory

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

3 个答案:

答案 0 :(得分:15)

这里的策略是,不要将这个决定泄露到语言中,而是让JVM / Hotspot / JIT / runtime决定它想要分配内存的位置和方式。

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

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

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

答案 1 :(得分:4)

这暂时会来到Java,没有真正的ETA设置,所以你只能希望它将来自Java 10.

该提案称为价值类型,您可以按照in the mailing list of Project Valhalla进行操作。

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

答案 2 :(得分:2)

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

所说的对象是在Java中的堆栈上创建的,它只是使用escape analysis在你背后完成,这确保了上述情况不会发生。