对象生命周期管理和垃圾回收机制

对象生命周期管理和垃圾回收机制:引擎使用引用计数来管理对象的生命周期。但是引用计数无法处理循环引用的问题,这时就需要使用标记清理方法来进行垃圾回收。

垃圾回收方案:定义全局 gcroot,存储所有的 root object,定义GCPtr 封装类,和 smartptr 类似,在增加、减少引用计数时根据对象是否被其他对象引用而采用不同的回收方案:

  • 没有对象引用,在增加引用计数时 attach gcroot 中,在减少计数时从 gcroot detach,在 gc 函数里使用标准回收方法,先标记、再回收,即使对象的引用计数不为0也回收,这就解决了引用计数无法处理的循环引用的问题。
  • 有对象引用使用引用计数来控制对象生命周期。

 

判断对象是否被其他对象引用:需要记录对象之间引用关系,也就是形成对象关系图,每个对象可以有多个引用者,在 GCObject中提供设置关系的接口(AttachTo\Detach)。设置对象关系可以有多种渠道,一种是通过对象系统的反射机制来设置,通过 SetProperty 等方法,(组件对象无需使用垃圾回收?),一种是手工调用关系设置接口。

优化:扫描的过程还是很耗费时间,同时有些对象一直存在于系统之中,生命周期很长,垃圾回收时就不需要处理这些对象。当使用 GCPtr 来访问对象时,对象处于垃圾回收的机制下,当直接使用对象原生指针时,垃圾回收不会处理这个对象。创建对象时也可以指定对象标志,这样即使使用 GCPtr 访问对象,对象也不会被垃圾回收,但是可能存在循环引用问题。

另一个问题是扫描过程会遍历整个系统中所有对象,这会导致频繁的内存页交换,可以考虑将对象标记数据、对象关系数据以及 gc root 数据放置在一个单独连续的内存区域,这样就避免了访问对象造成的页交换,提高GC 性能。

Advertisements
此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

w

Connecting to %s