0

저는 4 개의 블록 (하나의 선택적 블록 포함)으로 구성된 응용 프로그램에서 HTTP를 통해 쿼리 개체를 받고 데이터베이스에서 정보를 검색하고 선택적인 작업을 수행하는 Dataflow 파이프 라인을 만들었습니다 해당 데이터를 변환 한 다음 HTTP 응답에 정보를 다시 쓰십시오.데이터 흐름 파이프 라인이 메모리를 유지합니다.

일부 테스트에서는 데이터베이스 (570,000 행)의 상당량의 데이터를 가져 와서 List 개체에 저장하고 다른 블록간에 전달했으며 이후에도 최종 블록이 완료되면 메모리가 해제되지 않습니다. 작업 관리자의 RAM 사용량은 최대 2GB까지 증가하며 List가 각 블록에 도달 할 때 여러 개의 큰 스파이크를 볼 수 있습니다. 내 블록에 대한

서명은 다음과 같이 다음과 같이

private TransformBlock<HttpListenerContext, Tuple<HttpListenerContext, QueryObject>> m_ParseHttpRequest; 
private TransformBlock<Tuple<HttpListenerContext, QueryObject>, Tuple<HttpListenerContext, QueryObject, List<string>>> m_RetrieveDatabaseResults; 
private TransformBlock<Tuple<HttpListenerContext, QueryObject, List<string>>, Tuple<HttpListenerContext, QueryObject, List<string>>> m_ConvertResults; 
private ActionBlock<Tuple<HttpListenerContext, QueryObject, List<string>>> m_ReturnHttpResponse; 

그들은 연결되어 있습니다 :

m_ParseHttpRequest.LinkTo(m_RetrieveDatabaseResults); 
m_RetrieveDatabaseResults.LinkTo(m_ConvertResults, tuple => tuple.Item2 is QueryObjectA); 
m_RetrieveDatabaseResults.LinkTo(m_ReturnHttpResponse, tuple => tuple.Item2 is QueryObjectB);   
m_ConvertResults.LinkTo(m_ReturnHttpResponse); 

내가 같은 파이프 라인을 설정할 수 있습니다 가능성이 각 블록이 완료되면 그 목록에 더 이상 저장할 필요가 없으며 전체 파이프 라인이 완료되면 메모리가 해제됩니다.

답변

1
  1. 데이터 흐름 블록이 이미 처리 된 메시지에 대한 참조를 보유해야하는 이유는 없습니다. 그 때문에, 나는 그들이 그렇게하지 않는다고 생각한다. 그들이 실제로한다면, 나는 그것이 당신이보고해야하는 버그라고 생각합니다.

  2. 작업 관리자에서 큰 RAM 사용이보고되었다고해서 반드시 개체가 수집되지 않았다는 의미는 아닙니다. 또한 프레임 워크가 아직 GCed 메모리를 OS로 반환하지 않았다는 것을 의미 할 수도 있습니다. 충분한 여유 메모리가있을 때 프레임 워크는 메모리를 반환하는 것을 매우 게으른 것으로 생각합니다. 그렇게 할 이유가 없기 때문입니다.

    대신해야 할 일은보다 적절한 도구를 사용하는 것입니다. 예를 들어 .Net 성능 카운터를 사용하여 GC를 매우 면밀히 모니터링 할 수 있습니다. 또한 메모리 프로파일 러를 사용하여 메모리 사용에 대한 자세한 정보를 볼 수 있으며 실제로 메모리 누수가있는 경우 그 원인이 무엇인지 알 수 있습니다.

관련 문제