2011-06-14 4 views
1

This article은 XMLReader를 사용하면 문자열 메모리 누수가 발생할 수 있다고 말합니다. 단락을 찾으려면 "메모리 누수"를 검색하십시오. 그것은 완화 중 하나가 말한다 : 이것에 대한XmlReader 메모리 누수를 줄이기 위해 NameTable 클래스에서 파생되는 방법은 무엇입니까?

한 완화는 NameTable 클래스에서 을 유도하고 최대 크기 할당량을 적용하는 것입니다.

같은 문제 (거기가 가득 때 NameTable을 전환 할 NameTable의 사용을 방지하는 방법 , 또는 없음)과 완화는 here 언급된다. 내 질문은 기사에서 제안하는대로 "NameTable 클래스에서 파생되고 최대 크기 할당량을 적용하는 방법"입니다.

+0

메모리 누수가 C#입니까? – paercebal

+0

더 심각하게 : 나는 NameTable을 없애고 가능한 한 빨리 XMLReader를 제거하는 것이 좋은 생각이라고 생각합니다.이렇게하면 GC가 "가상으로 누출 된 데이터"를 모두 수집합니다. – paercebal

답변

-1

이 질문에 대한 대답은 아니지만 "C# 메모리 누수 문제"를 완화하는 데 도움이 될 수 있습니다.

C#에 RAII 패턴을 사용하면 관리되지 않는 리소스를 모두 처분 할 수 있으며 (개체가 범위를 벗어남에 따라) GC에서 관리되는 리소스를 줄일 수 있습니다.

내가 직장에서 사용하는 코드는 같은 것입니다 :

void ParseXmlString(string p_xmlString) 
{ 
    using (var stringReader = new StringReader(p_xmlString)) 
    using (var xmlReader = XmlReader.Create(stringReader)) 
    { 
     while (xmlReader.Read()) 
     { 
     // etc. 
     } 
    } 
} 

당신이 THER 볼 수 있듯이, XmlReader를 (와 StringReader를) 변수가 각 분석의 시도에 대해 생성 로컬 하나입니다 (*) .

의미 (**), 따라서 가상 메모리 누수가 발생하지 않습니다.

XmlReader 클래스를 보면 NameTable을 재정의 할 방법이 없으므로 대체 구현을 제공 할 방법이 없습니다.

죄송합니다. ...

(*) 이 프로젝트에 적합하지 수 있지만 내에 맞는, 그래서

(**) 나는 ... 당신은 결코 GC로 알지 희망하지만, 당신은 할 수 여전히 시스템의 서브 클래스를 만들려면이 그렇게 할 수있는 유일한 방법이지만, (당신이 이미 할당량, MaxNameTableCharCount있는 경우) 무슨 일이 WCF에서 수행되는 경우 내가 모르는

0

에 대한 System.GC.Collect()입니다 시도 .Xml.XmlReader를 사용하고 독자 함수를 직접 구현하거나 재미있는 내부 리더를 위임하여 구현할 수 있습니다. 가상 NameTable 속성을 재정 의하여 자신의 구현 인 XmlNameTable을 반환 할 수 있습니다. 이 구현은 원래 이름 테이블에 호출을 위임 할 수 있지만 크기에 대한 일부 할당량을 적용합니다.

구문 분석해야하는 XML이 WCF 판독기에서 지원하는 하위 집합 (즉, 처리 명령, 엔터티 참조, DTD 없음)과 일치하면 WCF 판독기를 직접 사용할 수 있습니다. 서비스). XmlDictionaryReader.CreateTextReader은 독자에게 시행 할 할당량이 포함 된 매개 변수를 사용하며 그 중 하나는 이름 테이블을 정확하게 처리합니다.

+0

WCF의 XmlReader/NameTable 사용으로 인해 문제가 발생하면 어떻게해야합니까? Memory Profiler로 확인한 결과 NameTable 인스턴스는 System.ServiceModel 클래스에 근본적으로 뿌리 내린 것처럼 보입니다. –

+0

이상하게도, WCF의 XmlNameTable 구현은 System.Runtime.Serialization 어셈블리에 있으며 XmlBaseReader 클래스에서 리플렉터 분석에만 사용됩니다. System.ServiceModel의 어떤 클래스가 이름 테이블을 보유하고 있습니까? – carlosfigueira

관련 문제