垃圾收集语言可以在堆栈中内联分配对象吗?

时间:2017-11-10 23:59:16

标签: reference garbage-collection language-agnostic

假设我有一个值类型Foo,以及一个方法Bar,它接受​​对Foo的引用。大多数语言都允许我在堆栈上分配一个新的Foo,并在我尝试将其传递给Bar时自动将其封装。但是,据我所知,这涉及将Foo值复制到堆上,然后使用该引用。

语言是否可以包含在堆栈上分配垃圾收集对象的方法?当方法结束时,运行时可以检查对象是否仍在使用中,然后才需要在堆上分配对象,并更新引用。

我想这可以提高不保留引用的方法的性能,并且会妨碍那些方法的性能。

1 个答案:

答案 0 :(得分:1)

是的,Graal的partial escape analysis就是这么做的。虽然常规EA只能进行堆栈分配(更确切地说:分解为字段,将字段放入堆栈),但是当对象无法转义时,EA可以在堆栈上乐观地分配,并且只在不常见的情况下将数据重新生成对象对象必须存在。

另请注意,垃圾收集不是二元选择。您可以拥有混合和匹配垃圾收集,引用计数,竞技场或基于范围的分配器的环境,具有自动释放和完全手动管理。在这种情况下,堆栈分配也可能是后者之一,而某些堆将被垃圾收集。