MOSS 2007 Performance Tuning Part2 - Object Dispose

Sharepoint 2007 성능 튜닝 두 번째 Part 입니다.  이번 주제는 Sharepoint 관련 Code Tuning에 관련된 내용입니다. 
2007 대상이라고 말씀드렸지만, Sharepoint 2010에도 동일하게 적용되는 내용입니다.

이번에 다룰 내용은 Sharepoint에서 객체 Dispose에 대한 내용입니다.  
Sharepoint 뿐 아니라 일반적인 Application개발 시에도 object를 사용 후에는 적절한 해제 로직을 통해서 자원을
반납해야 합니다.  Garbage Collector가 자동으로 해주지 않을까.. 라고 생각할 수도 있지만, GC가 동작하는 것은
.NET 쪽의 메모리 부족을 감지해서 동작하며 또한 GC가 메모리를 회수하게 되면 많은 CPU자원이 사용되어 성능
저하됩니다.
또한 GC가 감지하지 못하는 메모리 이외의 자원의 경우 메모리와 상관이 없다면 누수가 발생할 수 있겠지요.
대표적인 경우가 ADO.NET을 통해서 SQL 서버의 연결을 사용하는 SQL Connection 개체가 있습니다.

Sharepoint를 Object Model을 사용해서 접근할 때 사용되는 대표적인 리소스가 SPWeb,SPSite 등이 있고, 이
객체들은 모두 IDisposable이라는 인터페이스로 부터 상속을 받아 Dispose 메서드를 구현하고 있습니다.

문제는 위에서 SQL Connection의 예와 같이 Sharepoint 객체들은 SPWeb,SPSite로 접근하지만 이와 연관된
COM Object(UnManaged Code)들이 존재하며 이 객체들은 Dispose가 호출되어야 정상적으로 해제된다는
점이고, 객체 당 약 1~2MB정도의 메모리 영역을 차지합니다.

대표적으로 객체 Dispose가 안되는 패턴을 살펴보면

첫 번째 Using을 사용하여 호출된 siteCollectionOuter의 경우에는 명시적으로 Dispose를 호출하지 않아도
자동해제 됩니다.
내부에서 생성한 siteCollectionInner의 경우에는 Dispose가 호출되지 않아 Leak이 발생되게 됩니다.  

좀 더 자세한 내용과 예제는 아래 링크를 통해서 확인하실 수 있습니다.
https://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

그렇다면 정상적으로 객체들이 해제되었는지를 확인하기 위해서는 소스 리뷰를 해야 하는데, 소스 코드를
찾아서 하나씩 찾아내야 할까요?  이 작업을 자동으로 해주는 툴이 있습니다. ^^
아래 사이트에서 제공하는 SPDisposeCheck이라는 툴을 사용하면 모든 작업이 편해집니다.

https://archive.msdn.microsoft.com/SPDisposeCheck

사용 방법은 매우 간단합니다. 사이트를 접속한 후 "here"를 클릭하여 툴을 다운로드 받습니다. 
이 툴은 .NET Reflection을 사용해서 개발된 DLL의 위치를 지정해 주면 해당 소스의 어느 함수에서 어떤
패턴으로 Dispose되지 않았는지 찾아줍니다.
Syntax는 아래와 같이 개발된 DLL의 위치를 지정한 후 "> result.txt" 를 지정하여 결과 파일을 명시합니다.

 SPDisposeCheck Sample.dll > result.txt

결과는 위와 같이 Module명(DLL)과 함수명, 실제 Dispose가 되지 않은 소스(Statement)까지 출력해 줍니다.
(실제 함수명 등은 특정 고객 사의 정보가 들어 있어서 그림에서는 지웠습니다. ^^)
툴의 실행은 Sharepoint 서버에서 실행하실 필요는 없고, 서버에서 DLL을 복사 후 Client 에서 돌려주셔도 됩니다.
단 툴을 실행하기 위해서는 Sharepoint가 Client에 설치되어 있어야 합니다. Reflection하는 과정에서 Sharepoint관련
DLL들이 필요하기 때문이지요..

happy Sharepoint!!