1
10
多迷人的虫子啊。 我手头没有vbscript引擎的调试版本。(我放在上面的那张10年前的硬盘,从我最后一次看它开始,在两年的时间里显然已经坏了。)不过,我可以很容易地猜出这是怎么回事。我的怀疑是,我没有将与“end with”相对应的指令标记为语句已结束且收集器必须运行的点。 让我们考虑一下这个假设。 在第一个示例中,GC何时运行?程序结束时。此时,终止符按创建对象的顺序运行。(这是不应依赖的实现细节。) 在第二个和第三个示例中,对nop的调用结束会触发一个gc,而这恰好发生在end with旁边。(我不太清楚为什么第二个示例在对象符合收集条件时触发GC;我不记得codegen的确切语义,它将对象引用从WITH块范围中弹出。) 在第四个示例中,GC是在内部with之前触发的,什么也不做。 因为我编写了终止逻辑和相当数量的“with”处理代码,所以我毫无疑问地导致了这个错误,非常抱歉。显然,在过去的11年或12年里,我们都没有遇到任何大问题,而且由于它只影响没有内容的“with”块,所以我不认为它会被修复。 无论如何,你不应该依赖终止订单。这是一个糟糕的编程实践。 有关vbscript终止逻辑迷人主题的更多信息,请参见: |
codeforester · 测量GC暂停时间的最佳方法是什么? 6 年前 |
Venki WAR · 需要解释G1的并行完整GC 6 年前 |
Stephan_Berlin · 为什么CMS系列中的初始标记阶段 6 年前 |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 6 年前 |
goks · 如何清除熊猫的数据帧内存? 6 年前 |