2011-11-22 3 views
4

주기적으로 가비지 컬렉터의 2 세대 또는 대형 객체 힙에 어떤 객체가 매달려 있는지 스캔 할 수 있다면 재미 있을지도 모른다는 생각에 시달렸습니다. 오랜 시간/영원히. 배후에있는 일반적인 생각은 동일한 컬렉션이 여러 컬렉션에 대해 존재할 경우 앱이 리소스 누출이 될 가능성이있는 객체를 결정할 수 있다는 것입니다 (약한 참조로이를 추적하여 프로파일 링하는 행위가 주위를 지키지 못하게 함). 특정 객체가 어떤 세대에 있는지 묻는 방법을 찾을 수 있습니다. 관리되지 않는 코드 또는 관리되는 힙을 조사하기위한 디버깅 도구에 대한 API를 찾을 수 있습니다.하지만 실제로 원하는 것은 모든 데이터 구조를 제공하는 관리되는 호출입니다. 지정된 세대의 객체.세대 가비지 수집기의 모든 개체를 찾을 수 있습니까?

나는 그런 것을 찾을 수있는 희망이 있거나 존재하지 않는 것을 찾고 있습니까?

이론적으로 디버거 앱의 인스턴스를 쉘 아웃하여 결과 나 구문을 파싱하는 것이 가능할 수 있지만 부하가 적은 시간에는 라이브 웹 서버에서 실행하고 싶습니다. ops가 가능한 경우에도 디버거를 첨부하고 싶습니다.

답변

2

최근에 Objective-C 영역에서 유사한 도구로 작업 한 결과 힙샷 도구를 찾아 볼 수 있습니다. 힙 샷 도구는 힙의 스냅 샷을 가져 와서 메모리 그래프를 작성하고 어떤 메모리가 뿌리를두고 어디에 있는지 찾아냅니다. 이 중 많은 부분이 가비지 수집기가 수집 할 개체를 찾는 방식과 비슷합니다.

일반적으로 힙샷 도구를 사용하면 다른 시간에 힙의 스냅 샷을 찍고 메모리가 뿌리가 맞고 어떤 개체가 해당 공간을 차지하는지 비교할 수 있습니다. Mono Heapshot https://github.com/mono/heap-shot은 좋은 출발점으로 보이지만 개인적으로 사용하지는 않습니다. JetBrains dotTrace Memory로 좋은 결과를 얻었습니다. 불행하게도이 두 도구는 객체가 존재하는 세대를 알려주지 않지만 개체 식별을 추적 할 수 있습니다. 때로는 스냅 샷 전체 ​​에서조차도 추적 할 수 있습니다. 개체가 여러 컬렉션에서 살아남는다면 더 높은 세대에 살게 될 것입니다. 정확한 생성은 구현, 런타임 및 환경에 따라 다릅니다.

다른 메모리 프로파일 러는 분명 존재합니다. Microsoft CLR에서 WinDbg 및 SOS 확장 기능을 사용하면 매우 좋습니다. Theres 여기 그것에 관하여 좋은 msdn 잡지 기사 : http://msdn.microsoft.com/en-us/magazine/cc163528.aspx 및 나는 (경이롭게 지명 된)에서 Tess를 "깨달은 경우에, 그것을 고쳐야한다"블로그에는 중대한 내용이 역시다는 것을 찾아 냈다. http://blogs.msdn.com/b/tess/

에 설명 된 성능 카운터 집합을 통해 힙 구조 및 GC 생성에 대한 몇 가지 일반 정보를 검색 할 수 있습니다.

+0

감사합니다. 나는 힙합을 통해 트롤 할 시간을 갖도록 노력해야한다. 그것은보고있는 응용 프로그램과 별개로 사용되기를 원합니다. (명령 행 : mono --profile = heap-shot MyProgram.exe 참조)하지만 사용할 수있는 트릭이있을 수 있습니다. windbg 물건과 겹침 선반 내가 지금까지 본 적이 있고, 확실히 실행중인 응용 프로그램의 외부입니다 : ( – eviltobz

관련 문제