2013-08-20 1 views
4

동일한 오브젝트에 대한 참조를 가지고있는 대형 노드 네트워크가 메모리에 있습니다.오브젝트에 대한 참조가 모두 동일한 대규모 네트워크 오브젝트

예로서. 네트워크의 각 노드가이 클래스라고 가정 해 봅시다.

public class Node 
{ 
    /** This is the shared object **/ 
    public Context context { get; private set; } 

    public Node Parent { get; private set; } 

    public List<Node> Children { get; private set; } 

    public Node(Context pContext, Node pParent, List<Node> pChildren) 
    { 
     this.context = pContext; 
     this.Parent = pParent; 
     this.Children = pChildren; 
    } 
} 

속성 context는 네트워크에서 모든 노드에 대해 생성자에 전달되는 객체입니다.

네트워크가 매우 크기 때문에 (수천 개의 노드) 트리 구조를 형성한다고 가정합니다. 이 공통 공유 참조가 메모리 누수로 이어질 것입니까?

ParentNull으로 설정하여 트리에서 분기를 분리하는 경우. context이이 공유 객체에 대한 참조로 남아 있더라도 해당 분기가 정확하게 C#에 의한 가비지 수집이됩니까?

제대로 작동하려면 어떤 코딩 방법을 사용해야합니다.

답변

6

네트워크가 매우 크기 때문에 (수천 개의 노드) 트리 구조를 형성한다고 가정합니다. 이 공통 공유 참조가 메모리 누수로 이어질 것입니까?

아니요.

부모를 Null로 설정하여 트리에서 분기를 분리하면 어떻게됩니까? 컨텍스트가이 공유 객체에 대한 참조로 남아있는 경우에도 해당 분기가 C#에 의한 가비지 수집을 올바르게 수행합니까?

예. 그렇습니다. 이벤트 구독이 ~ 레퍼런스를 생성하므로 잠재적으로 문제가되는 유일한 경우입니다. 더 긴 수명의 개체에 대한 이벤트를 구독하는 경우입니다. context에 대한 참조 만 보유해도 수업을 수락하는 데 아무런 영향을 미치지 않습니다.

주요 문제는 참조를 통해 개체에 "도달"할 수 없으면 개체가 가비지 수집됩니다. 귀하의 개체는 여전히 다른 개체에 대한 참조를 보유 할 수 있습니다.

3

노드가 컨텍스트를 참조하므로 노드에서 컨텍스트가 가비지 수집되지 않습니다. 다른 방법은 아닙니다.

설정 Parent에서 null으로 설정하면 해당 노드가 가비지 수집되지 않습니다. 노드가 다른 클래스에서 참조되는 한 메모리에 남아 있습니다.
코드에서 가비지 수집을 위해 부모 노드에서 노드를 제거해야합니다.

관련 문제