Reference 垃圾收集语言能否在堆栈上内联分配对象?

Reference 垃圾收集语言能否在堆栈上内联分配对象?,reference,garbage-collection,language-agnostic,Reference,Garbage Collection,Language Agnostic,假设我有一个值类型Foo,还有一个方法Bar,它接受对Foo的引用。大多数语言都允许我在堆栈上分配一个新的Foo,并在我尝试将其传递到Bar时自动将其装箱。然而,据我所知,这涉及到将Foo值复制到堆上,然后使用该引用 一种语言是否可能包含在堆栈上分配垃圾收集对象的方法?当方法结束时,运行时可以检查对象是否仍在使用中,只有这样,它才需要在堆上分配对象,并更新引用 我想这会提高不保留引用的方法的性能,并且会阻碍保留引用的方法的性能。是的,Graal的方法就是这样做的。当对象没有逃逸时,常规EA只能进

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

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

我想这会提高不保留引用的方法的性能,并且会阻碍保留引用的方法的性能。

是的,Graal的方法就是这样做的。当对象没有逃逸时,常规EA只能进行堆栈分配(更准确地说:分解为字段,将字段放入堆栈),而局部EA可以在堆栈上进行优化分配,并且仅在对象必须存在的不常见情况下将数据具体化为对象


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

阅读Java中使用的示例。请参阅,可能值得注意的是,TLAB分配已经和堆栈分配一样有效,在最佳情况下只需要一个指针碰撞,同时已经比OP描述的工作得更好,因为将
Foo
传递给方法实际上不需要复制对象,即使将对该对象的引用存储到堆变量中,也不需要这样的复制。只有当对象在下一次gc中幸存时,才会复制它。在EA之后分解为字段效果更好,因为它支持后续优化,将这些字段视为局部变量。