Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中的堆栈内存上创建对象?_Java_Value Type_Stack Memory - Fatal编程技术网

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

在java中的堆栈内存上创建对象?,java,value-type,stack-memory,Java,Value Type,Stack Memory,出于好奇,这只是一个简单的理论问题。我一直像一个爪哇粉丝。但有一件事让我想知道为什么java不提供在堆栈上创建对象的机制?如果我可以在堆栈上创建小点(intx,inty)对象,而不是像在C#上创建结构那样在堆上创建,这不是更有效吗。在java中,此限制背后是否有任何特殊的安全原因?:) 这里的策略是,Java让JVM/Hotspot/JIT/runtime决定在何处以及如何分配内存,而不是将此决定泄露到语言中 有研究正在使用“转义分析”来找出哪些对象实际上不需要进入堆,而是通过堆栈来分配它们。我

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

这里的策略是,Java让JVM/Hotspot/JIT/runtime决定在何处以及如何分配内存,而不是将此决定泄露到语言中

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

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


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

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


所说的对象是在Java中的堆栈上创建的,它只是在您背后使用,以确保上述场景不会发生。

这将暂时出现在Java中,没有真正的ETA设置,因此您只能希望Java 10会出现

该建议称为值类型,您可以遵循它


我不知道之前是否有任何原因解释它为什么不在语言中,可能最初被认为是不需要的,或者根本没有时间实现它。

如果将它放在不在堆栈上的容器中,会发生什么?返回时,容器现在有一个对释放内存的引用。@Max:可能,该语言还需要包含允许编译器对此进行检查的结构。@Max:容器没有对原始内存的引用,它有一个副本或一个装箱副本。NET/C#在过去15年中一直有这种情况。在6u23和later@jtahlborn: +1. 不过,我认为目前的优化工作并没有达到在堆栈上实际分配对象的程度。从发行说明来看,这听起来像是消除了现有对象的锁和冗余副本。+1来自jtahlborn发布的链接:“它不会将堆分配替换为非全局转义对象的堆栈分配。”这意味着ArgEscape和NoEscape将在堆栈上分配。但话说回来,它并没有被明确提及…@阿尔法辛:是的,不太清楚。我将其理解为“将堆分配替换为完全没有分配的冗余防御副本”(而是重新使用现有对象),这在他们给出的示例中似乎就是这样。如何确保我的对象通过堆栈传递?适用哪些规则?好的!Java将“暂时”赶上C#?“某时”(tm)@skiwi你能简单解释一下什么是值类型吗?