假设我有一个值类型Foo
,以及一个方法Bar
,它接受对Foo
的引用。大多数语言都允许我在堆栈上分配一个新的Foo
,并在我尝试将其传递给Bar
时自动将其封装。但是,据我所知,这涉及将Foo
值复制到堆上,然后使用该引用。
语言是否可以包含在堆栈上分配垃圾收集对象的方法?当方法结束时,运行时可以检查对象是否仍在使用中,然后才需要在堆上分配对象,并更新引用。
我想这可以提高不保留引用的方法的性能,并且会妨碍那些方法的性能。
答案 0 :(得分:1)
是的,Graal的partial escape analysis就是这么做的。虽然常规EA只能进行堆栈分配(更确切地说:分解为字段,将字段放入堆栈),但是当对象无法转义时,EA可以在堆栈上乐观地分配,并且只在不常见的情况下将数据重新生成对象对象必须存在。
另请注意,垃圾收集不是二元选择。您可以拥有混合和匹配垃圾收集,引用计数,竞技场或基于范围的分配器的环境,具有自动释放和完全手动管理。在这种情况下,堆栈分配也可能是后者之一,而某些堆将被垃圾收集。