2009-11-24 76 views
2

JVM和.NET VM是否在运行时很明显地将对象生存期限制在特定范围内时分配堆栈上的对象?JVM和CLR分配优化

+1

你能详细说明它是什么时候*明显*吗?我不确定它...... – 2009-11-24 16:18:50

+0

好吧来自C,C++世界,看起来很明显... 由于在Java和.NET中,VM知道每个对象的引用。如果你在一个方法中创建一个对象并且永远不会在其他地方传输,那么将它保存在堆栈中是有意义的。无论如何都存在用于传递参数的堆栈,为什么不能从超快(和超级简单)堆栈分配中受益呢? – 2009-11-24 17:18:45

回答

5

JVM执行此操作。在适当的情况下,它实际上可以完全取消分配。

引用此article.

Java语言不提供任何办法明确分配堆栈上的对象,但这一事实并不妨碍JVM中的适当地方仍然使用堆栈分配。 JVM可以使用一种叫做逃逸分析的技术,通过这种技术他们可以知道某些对象在整个生命周期中都被限制在一个线程中,并且该生命周期受到给定栈帧的生命周期的限制。这些对象可以安全地分配到堆栈而不是堆上。更好的是,对于小型对象,JVM可以完全优化分配,并简单地将对象的字段提升到寄存器中。

有关Escape analysis的更多信息源自维基百科。

+0

JVM的哪个版本执行此操作?更重要的是,最新的支持Escape Analysis? – 2011-02-13 20:02:17

+2

Java 6更新14,您必须使用命令行选项启用它。 (-XX:+ DoEscapeAnalysis)。它看起来像在更新18中被删除,然后在更新21中再次添加。我不确定命令行选项是否仍然需要 - 但我会使用它只是安全的。 – 2011-02-14 14:09:40