Memory management JVM和CLR分配优化

Memory management JVM和CLR分配优化,memory-management,jvm,stack,allocation,Memory Management,Jvm,Stack,Allocation,当运行时发现对象的生存期被限制在某个范围内时,JVM和.NET VM是否会在堆栈上分配对象?JVM会这样做。在适当的情况下,它实际上可以完全取消分配 引用这个 Java语言不提供在堆栈上显式分配对象的任何方法,但这一事实并不妨碍JVM在适当的情况下仍然使用堆栈分配。JVM可以使用一种称为转义分析(escape analysis)的技术,通过这种技术,JVM可以判断某些对象在其整个生命周期内都被限制在单个线程中,并且生命周期受给定堆栈帧的生命周期的限制。这样的对象可以在堆栈而不是堆上安全地分配。更

当运行时发现对象的生存期被限制在某个范围内时,JVM和.NET VM是否会在堆栈上分配对象?

JVM会这样做。在适当的情况下,它实际上可以完全取消分配

引用这个

Java语言不提供在堆栈上显式分配对象的任何方法,但这一事实并不妨碍JVM在适当的情况下仍然使用堆栈分配。JVM可以使用一种称为转义分析(escape analysis)的技术,通过这种技术,JVM可以判断某些对象在其整个生命周期内都被限制在单个线程中,并且生命周期受给定堆栈帧的生命周期的限制。这样的对象可以在堆栈而不是堆上安全地分配。更好的是,对于小对象,JVM可以完全优化分配,只需将对象的字段提升到寄存器中


更多关于维基百科的信息。

你能详细说明什么时候是显而易见的吗?我不确定……从C,C++世界来看,这是很明显的…因为在Java和.NET中,VM知道对对象的每个引用。如果您在一个方法中创建了一个对象,并且从未将其传输到任何其他地方,那么将其保留在堆栈上是有意义的。反正存在一个用于传递参数的堆栈,所以为什么不从超快速和超简单的堆栈分配中获益呢?JVM的哪个版本可以做到这一点?更重要的是,最新版本支持转义分析吗?Java 6更新14,您必须使用命令行选项启用它-XX:+doescape分析。它看起来像是在更新18中删除的,然后在更新21中重新添加。我不确定命令行选项是否仍然是必需的,但为了安全起见,我会使用它。