Skip to main content

Command Palette

Search for a command to run...

힙 할당을 감지하는 방법 | Bart Wullems

Updated
2 min read

Bart Wullems님의 How to detect heap allocations을 번역하였습니다.


몇 주 전에 정적 익명 함수와 람다를 사용할 때 힙 할당 횟수를 제한하는 데 도움이 되는 방법에 대해 이야기한 적이 있습니다. 이 포스팅 이후 한 동료로부터 이러한 할당을 감지하는 방법에 대한 질문이 있었습니다.

좋은 질문입니다! 몇 가지 방법을 알려드리겠습니다.

먼저 일반적인 답변을 드리고 두 가지 구체적인 도구에 대해 자세히 살펴보겠습니다.

람다를 사용할 때 과도한 할당을 발견하려면 메모리 프로파일러 도구를 사용하여 *_DisplayClass* 또는 다양한 Action*Func*의 변종 할당을 찾을 수 있습니다.

이 정보를 통해 무엇을 찾아야 하는지 이미 알고 계실 것입니다.

Visual Studio 성능 프로파일러

가장 먼저 도움이 되는 옵션은 Visual Studio의 성능 프로파일러입니다.

  • 빌드 유형을 릴리스로 변경합니다.

  • 이제 디버그 -> 성능 프로파일러...로 이동합니다. 여러 프로파일링 대상을 사용할 수 있지만 .NET 개체 할당 추적 옵션을 사용하고자 하므로 이 확인란을 선택합니다.

  • 시작 버튼을 클릭하여 도구를 실행합니다.

  • 시작 버튼을 클릭하여 도구를 실행합니다.

  • 프로파일링된 애플리케이션을 닫거나 수집 중지를 클릭하면 할당 탭에서 모든 할당을 볼 수 있습니다.

자세한 정보 .NET 개체의 메모리 사용량 분석 - Visual Studio(Windows) | Microsoft Learn

Roslyn Clr 힙 할당 분석기

또 다른 옵션은 명시적 할당과 박싱, 디스플레이 클래스(클로저라고도 함), 암시적 델리게이트 생성 등과 같은 많은 암시적 할당을 감지할 수 있는 Roslyn 기반 C# 힙 할당 진단 분석기입니다.

프로젝트에 NuGet 패키지로 직접 설치할 수 있습니다:

dotnet add package ClrHeapAllocationAnalyzer

다른 분석기와 마찬가지로 인라인 힌트를 제공합니다:

관련 경고 확인:

실제로 작동하는 모습을 보고 싶으시다면 다음 동영상을 참조하세요:

참고: JetBrains Rider를 사용하는 경우, 힙 할당 뷰어 플러그인을 사용하여 동일한 작업을 수행할 수 있습니다.


More from this blog

개발, 테스트, 운영에서의 도커 활용

핵심 원칙: "한 번 빌드하고, 어디서든 실행한다 (Build once, run anywhere)" 도커의 가장 큰 장점은 환경 일관성입니다. 동일한 도커 이미지를 사용하여 개발, 테스트, 운영 환경을 구성함으로써 "제 PC에서는 됐는데..." 하는 문제를 최소화할 수 있습니다. 1. 개발 단계 (Development) 목표: 빠른 코드 변경 반영, 쉬운 디버깅, 실제 운영 환경과 유사한 환경 구성. Docker 사용 방안: Dockerf...

May 9, 20256 min read15

[EF Core] 데이터 삭제 시 소프트 삭제 적용

DB에서 데이터를 삭제하면 일반적으로 복구할 수 없습니다. 또한 관계에 따라 영구 삭제 자체가 어려울 수도 있습니다. 그래서 데이터를 영구 삭제하는 대신 IsDeleted 속성을 true로 주고 IsDeleted 속성을 필터링해서 조회하는 방법을 사용하기도 합니다. 이를 소프트 삭제라고 합니다. 그런데 EF에서 알아서 데이터 삭제 시 소프트 삭제를 하고 쿼리시 IsDeleted 속성을 체크해서 삭제한 데이터를 제외한 데이터만 쿼리하게 하는 ...

Mar 18, 20243 min read19

[EF Core] ValueConverter를 이용해서 엔터티 속성의 도메인 관리

EF Core를 사용하면서 문자열 길이 등의 특성을 일일이 지정하는 것은 번거롭습니다. ... [MaxLength(32)] public string? 제목 { get; set; } 엔터티가 한 개일 때는 상관이 없으나 제목 유형이 여러 엔터티에 사용될 경우 유형을 지정하기 번거롭습니다. 속성 유형을 도메인으로 관리하면 참 편할텐데요, ValueConverter를 이용할 수 있습니다. 그런데 이것을 인터페이스 정적 추상를 사용해서 다음처럼 ...

Mar 16, 20242 min read8

디모이 블로그

154 posts

.NET 관련 기술을 선호하고 새로운 언어를 배우는데 관심이 있습니다.