写着 GC 的时候遇到一个问题,伪代码如下:
A a = new A();
B b = new B();
a.SomeProp = b;
Console.WriteLine("Dummy");
a.SomeProp = null;
C c = new C();
a.SomeProp = b;
假设在执行 c = new C()
时 GC 工作,回收内存。那么对象 b
是否应该被回收?
执行 a.SomeProp = null
时已经解除了 a
和 b
的联系,此时 b
应该是没有被引用的;但是,接下来的 a.SomeProp = b
就重新建立了二者的联系。
去看 SGen 的代码,想看他们是怎么考虑此类问题的。核心数据结构是 GCObject
(MonoObject
)和 GCVTable
(MonoVTable
),前推到 MonoClass
的时候 GitHub 的搜索就不太灵光了。真不想 clone 下整个 repo……
最近的关于组织的文档也是2001年的,很难获知 MonoClass
的细节,除非 clone 下来搜索。这里是 MonoVTable
的定义和 MonoObject
的定义。可以看出后者和最初相比并没有多大变化。
SGen 虽然名为“Simple Generational Garbage Collector”,但还是很复杂……毕竟 Mono 都可以承担服务器的压力了……
为了准备网站转型,在他们维护的同时我要设计 API v1。我就是应该去冲锋陷阵的嘛。Swagger Editor 是个相当不错的工具。安装的时候失败了2次,第一次 Failed: npm install xxxxxx
(一个包,忘了是什么),第二次 Failed: bower install
。看错误信息好像总是版本解析错误,但是每次都会解析到新的版本,所以就不断试了。然后 npm install
,完成;npm start
,就开始在8080端口使用了。
7小时通关了 Half-Life 2 Episode 2。结果:蚁狮幼虫成就329/333(幼虫有抱团的特性,所以剩下4只应该是在一起的),补给网成就8/9,资源定位点成就4/5(缺的那个还关联别的成就)。除了以上和火箭人成就其他都获得了。这是何等的糟糕,总是“少那最后一个”。最失望的是火箭人成就居然没给!通关后我加载了存档看,我确实是将地精(gnome)放到了火箭舱室里啊……哎我7小时通关就是为了照顾那个地精雕像,特别是在开车被武装直升机追逐、和阿狗赛跑的时候雕像特别容易掉,前者重试的次数都快赶上了我为了达成发射基地无损伤成就重试的次数了。与阿狗赛跑,由于地精在车后窗的卡位很好,而且驾驶平稳,一次就获得了竞速胜利(成就:Metal Pedal)。