相关疑难解决方法(0)

1730
推荐指数
11
解决办法
54万
查看次数

垃圾收集孤立对象(树节点)适用于"release-exe",但不适用于VS-debugger

情况

根据这个已接受的答案,如果" GC"看到'2个或更多对象的循环引用,这些对象未被任何其他对象或永久GC句柄引用,则将收集这些对象.

我想知道垃圾收集是否适用于一个甚至没有内容的超级简单树结构,只是带有父级和子级引用的树节点.

想象一下,你创建一个根节点为它添加一个子节点,然后为子节点添加一个子节点等等,所以不是一个树,而是更像一个列表(每个节点最多只有一个子节点和一个父节点).

如果我们理解上面的答案,然后我们删除了root的子节点以及对该子节点子节点的所有引用,则垃圾收集器应该清理子树.

问题描述

如果你看一下下面测试代码中的Main方法,当从Release-directory运行exe时,我得到的行为我希望内存消耗增加到~1GB然后下降到~27MB(在1之后). GC.collect再次向上然后再降低到~27MB(对于2. GC.collect).

现在当它在调试器中运行时,内存消耗达到~1GB并且对于1.GC.collect内存消耗保持精确的地方然后上升到1.6GB,第二个for循环需要很长时间然后我最后在第二个for循环中得到一个OutOfMemoryException.

问题

为什么我在调试器中得到这种行为?
在调试期间不应该进行垃圾收集工作,我是否遗漏了一些关于调试器的信息?

旁注

  • 我正在使用visual studio 2010 Express版
  • 我只在这里调用GC.Collect()用于特定的测试目的,以确保应该进行垃圾收集.(我不打算正常使用它)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    

namespace Tree
{
  class Program
  {
    static void Main(string[] args)
    {

      TreeNode root = new TreeNode(null); // the null-argument is the parent-node

      TreeNode node = root;

      for (int i = 0; i < 15000000; i++)
      {
        TreeNode child = new TreeNode(node); 
        node = child; …
Run Code Online (Sandbox Code Playgroud)

c# tree garbage-collection visual-studio

2
推荐指数
1
解决办法
2000
查看次数