【发布时间】:2020-05-31 23:29:55
【问题描述】:
我知道如何找到根,但问题是,(AFAIK)必须在运行时找到它们。为此,您需要一个可能溢出的固定大小的容器或一个可调整大小的容器。我不想使用固定大小的容器,因为很难判断要保留多少空间(而且可能很浪费)。可调整大小的容器似乎最好,但问题是,GC 在空间不足时运行,因此可调整大小的容器将无法存储它需要的内容。那么在这些条件下,GC root 是如何存储的呢?
【问题讨论】:
-
为什么要存储它们?这不是一个滑稽的问题。例如,堆栈上的每个引用都是一个根,但它们都位于堆栈上,并且它们不会去任何地方(只要您正在执行 stop-the-world 集合)。
-
@rici -- 你在说什么堆栈?栈和堆栈?
-
您确实知道每次 GC 调用都会发现 GC 根,对吗? GC 结构也位于堆外部,而 GC 操作 on 堆。
-
@Eugene -- 请原谅我的无知,但是您所说的 GC 根在每次 GC 调用时都会被发现 是什么意思?你的意思是每次分配?
-
最明显的一个是:堆栈引用。如果堆栈上有东西,它显然正在使用中。因此,这是根的完美候选者。为了找到这些,当然需要扫描线程堆栈。为了准确起见,这些文件会在您的应用程序冻结时进行扫描。
标签: memory compiler-construction garbage-collection containers gc-roots