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

adn*_*911 14 java value-type stack-memory

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

Thi*_*ilo 15

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

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

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

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

  • 在6u23及更高版本中启用http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html (4认同)
  • @jtahlborn:+1。不过,我认为当前的优化并没有真正在堆栈上分配对象。从发行说明来看,这听起来像是消除现有对象的锁和冗余副本。 (2认同)

ski*_*iwi 6

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

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

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