根源是什么?

What are the roots?(根源是什么?)
本文介绍了根源是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

垃圾回收的根源是什么?

What are the roots in garbage collection?

我已将 root 的定义读为您的程序可以访问的任何引用",而 live 的定义是正在使用的对象,可以是局部变量、静态变量.

I have read the definition of root as "any reference that you program can access to" and definition of live is that an object that is being used, which can be a local variable, static variable.

我对区分根对象和活动对象之间的区别有点困惑.

I m little confused with discriminating the difference between root and live objects.

什么是根路径?根对象和活动对象如何工作?

What is path to root? How does root and live objects work?

有人可以详细说明吗?

推荐答案

如果您将内存中的对象视为一棵树,根"将是根节点 - 您的程序可以立即访问的每个对象.

If you think of the objects in memory as a tree, the "roots" would be the root nodes - every object immediately accessible by your program.

Person p = new Person();
p.car = new Car(RED);
p.car.engine = new Engine();
p.car.horn = new AnnoyingHorn();

有四个对象;一个人,一辆红色的汽车,它的引擎和喇叭.绘制参考图:

There are four objects; a person, a red car, its engine and horn. Draw the reference graph:

     Person [p]
        |
     Car (red)
   /           
Engine    AnnoyingHorn

您最终会在树的根"处找到 Person.它是实时的,因为它被一个局部变量 p 引用,程序可以随时使用它来引用 Person 对象.这也适用于其他对象,通过 p.carp.car.engine 等.

And you'll end up with Person at the "root" of the tree. It's live because it's referenced by a local variable, p, which the program might use at any time to refer to the Person object. This also goes for the other objects, through p.car, p.car.engine, etc.

由于 Person 和所有其他递归连接到它的对象都是活动的,如果 GC 收集它们会很麻烦.

Since Person and all other objects recursively connected to it are live, there would be trouble if the GC collected them.

但是,请考虑,如果在一段时间后运行以下命令:

Consider, however, if the following is run after a while:

p.car = new Car(BLUE);

并重新绘制图形:

     Person [p]
        |
     Car (blue)       Car (red)
                    /           
                Engine    AnnoyingHorn

现在 Person 可以通过 p 和蓝色汽车通过 p.car 访问,但是红色汽车或其部分可以再次访问 - 它们没有连接到活动根.可以安全地收集它们.

Now the Person is accessible through p and the blue car through p.car, but there is no way the red car or its parts can ever be accessed again - they are not connected to a live root. They can be safely collected.

因此,这实际上是获取每个起点(每个局部变量、全局变量、静态变量、其他线程和堆栈帧中的所有内容)——每个根节点——并递归地跟踪所有引用以组成所有实时"列表的问题" 对象:正在使用且不适合删除的对象.其他都是垃圾,等待收集.

So it's really a matter of taking every starting point (every local variable, globals, statics, everything in other threads and stack frames) — every root — and recursively following all the references to make up a list of all the "live" objects: objects which are in use and unsuitable for deletion. Everything else is garbage, waiting to be collected.

这篇关于根源是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
quot;Overflowquot; compiler error with -9223372036854775808L(编译器错误-9223372036854775808L(Q;溢出Q))
Visual Studio 2010 ReportViewer Assembly References(Visual Studio 2010 ReportViewer程序集引用)
Weird behaviour when I open a reportviewer in WPF(在WPF中打开报表查看器时出现奇怪的行为)
how do i pass parameters to aspnet reportviewer(如何将参数传递给aspnet report查看器)