垃圾收集语言可以在堆栈上内联分配对象吗?
Can a garbage collected language allocate an object inline on the stack?
假设我有一个值类型 Foo
,以及一个接受对 Foo
的引用的方法 Bar
。大多数语言都允许我在堆栈上分配一个新的 Foo
,并在我尝试将其传递给 Bar
时自动将其装箱。但是,据我所知,这涉及将 Foo
值复制到堆上,然后使用该引用。
一种语言是否可以包含一种在堆栈上分配垃圾收集对象的方法?当方法结束时,运行时可以检查对象是否仍在使用中,然后才需要在堆上分配对象并更新引用。
我想这会提高不保留引用的方法的性能,但会降低保留引用的方法的性能。
是的,Graal 的 partial escape analysis 就是这样做的。虽然常规 EA 只能在对象未逃逸时进行堆栈分配(更准确地说:分解为字段,将字段放入堆栈),但部分 EA 可以乐观地在堆栈上分配并且仅在对象不常见的情况下将数据具体化为对象必须存在。
另请注意,垃圾回收不是二选一的选择。您可以拥有混合和匹配垃圾收集、引用计数、竞技场或基于范围的分配器的环境,这些分配器具有自动重新分配和完全手动管理。在这种情况下,堆栈分配也可能是后者之一,而一些堆将被垃圾收集。
假设我有一个值类型 Foo
,以及一个接受对 Foo
的引用的方法 Bar
。大多数语言都允许我在堆栈上分配一个新的 Foo
,并在我尝试将其传递给 Bar
时自动将其装箱。但是,据我所知,这涉及将 Foo
值复制到堆上,然后使用该引用。
一种语言是否可以包含一种在堆栈上分配垃圾收集对象的方法?当方法结束时,运行时可以检查对象是否仍在使用中,然后才需要在堆上分配对象并更新引用。
我想这会提高不保留引用的方法的性能,但会降低保留引用的方法的性能。
是的,Graal 的 partial escape analysis 就是这样做的。虽然常规 EA 只能在对象未逃逸时进行堆栈分配(更准确地说:分解为字段,将字段放入堆栈),但部分 EA 可以乐观地在堆栈上分配并且仅在对象不常见的情况下将数据具体化为对象必须存在。
另请注意,垃圾回收不是二选一的选择。您可以拥有混合和匹配垃圾收集、引用计数、竞技场或基于范围的分配器的环境,这些分配器具有自动重新分配和完全手动管理。在这种情况下,堆栈分配也可能是后者之一,而一些堆将被垃圾收集。