다음을 통해 공유


메모리 및 디스크 공간 사용을 줄여 앱 성능 향상

이 가이드에서는 다음 두 가지 기본 방법으로 Windows 애플리케이션의 성능을 향상시키는 방법을 보여 줍니다.

메모리 사용 최소화

Windows 앱에서 사용하는 메모리 양을 최소화하는 다양한 방법이 있습니다. 다음을 수행할 수 있습니다.

  • 포그라운드 메모리 사용량 감소
  • 백그라운드 작업 최소화
  • 백그라운드 모드에서 리소스를 해제
  • 애플리케이션이 메모리를 누수하지 않는지 확인

메모리 사용량을 적절하게 최소화하려면 먼저 다음을 이해하는 것이 중요합니다.

분석할 시스템 추적이 있으면 메모리 사용량을 줄이기 위해 추적 분석을 적용하기 위한 지침을 권장합니다.

작업 집합, 동적 메모리 및 가상 할당

현재 메모리에 상주하는 가상 주소 공간의 페이지 집합인 애플리케이션의 작업 집합 은 앱의 메모리 사용량 측정값 중 하나입니다.

애플리케이션에서 사용하는 메모리 양은 시스템 전체의 응답성뿐만 아니라 런타임 성능에도 영향을 줍니다. 메모리 사용을 최소화하면 더 많은 메모리 액세스와 관련된 CPU 비용을 줄여 앱의 성능이 향상됩니다. 메모리 사용량을 줄이면 애플리케이션이 다른 메모리 콘텐츠를 대체하지 않으므로 시스템 응답성 및 일반적으로 앱 사용자의 환경에 도움이 됩니다.

메모리 변위는 시스템이 최근에 액세스한 메모리 내 콘텐츠를 유지하려고 할 때 발생할 수 있으며, 필요한 경우 이전에 사용된 콘텐츠를 트리밍하고 페이지 아웃합니다. 사용자가 셸 또는 다른 애플리케이션으로 다시 전환하고 필요한 데이터가 메모리에 상주하지 않는 경우 디스크에서 데이터를 읽어야 합니다. 사용자는 이 프로세스로 인해 속도가 느려질 수 있습니다.

애플리케이션에서 사용하는 메모리에는 1) 동적 메모리와 2) 파일 지원 메모리의 두 가지 주요 부분이 있습니다. 파일 기반 메모리 사용량은 애플리케이션에서 사용하는 데이터베이스와 같은 이진 파일 및 데이터 파일에서 유래합니다. 이것은 일반적으로 애플리케이션 메모리 사용량의 중요한 부분이 아니며, 종종 고정적입니다. (예외는 데이터 처리 애플리케이션, 코드 컴파일 등입니다.) 메모리 사용량 및 누수 매니페스트의 더 중요한 원본은 동적 메모리입니다.

동적 메모리는 메모리 할당 루틴을 사용하여 애플리케이션에서 할당한 가상 메모리에 해당합니다. 시스템 재부팅에서 유지되는 파일 지원 메모리와 달리 동적 메모리는 애플리케이션의 수명 동안만 존재합니다. 동적 메모리는 일반적으로 메모리 사용량의 주요 원천이며 메모리 누수가 발생하는 장소입니다.

가상 할당 루틴 (VirtualAlloc)은 메모리 할당에 사용되는 애플리케이션 계층 루틴과 관계없이 Windows 애플리케이션의 메모리 할당 요청을 처리합니다. 애플리케이션에서 할당한 모든 메모리가 항상 메모리에 상주하는 것은 아니지만 이러한 할당을 분석하면 애플리케이션의 메모리 사용량을 이해하는 일관된 방법이 제공됩니다.

애플리케이션의 메모리 사용량을 이해하고 개선할 장소를 찾으려면 아래 설명된 대로 VirtualAllocation 추적을 캡처하는 것이 좋습니다.

시스템 추적을 캡처하여 메모리 사용량 분석

일정 기간 동안 디바이스 활동을 기록하는 것을 시스템 추적 이라고 합니다. 시스템 추적은 보고서를 생성하는 데 사용할 수 있는 추적 파일을 생성하고 앱의 성능을 개선하는 방법을 식별하는 데 도움이 됩니다.

추적의 길이는 다양할 수 있습니다.

  • 짧은 실행 추적을 사용하여 애플리케이션의 시작을 캡처할 수 있습니다. 여기에는 애플리케이션 창이 최소화되거나 애플리케이션 프로세스가 지속되는 동안 애플리케이션 창이 닫혀 있는 비활성 상태로 앱의 전환이 포함될 수 있습니다.
  • 장시간 실행되는 추적은 일반적으로 몇 분 동안 지속되며 메모리 누수를 진단하는 데 유용합니다. 메모리 사용량이 시간이 지남에 따라 계속 추세를 유지하면 일반적으로 누수가 발생합니다.

다음을 포함하여 메모리 사용을 모니터링하는 데 사용할 수 있는 여러 도구가 있습니다.

이 문서의 목적을 위해 Windows 성능 분석기를 사용하는 데 중점을 두겠습니다. 애플리케이션의 성능을 프로파일링하기 위한 도구를 선택하는 방법에 대한 자세한 내용은 Visual Studio 성능 프로파일러, Windows 성능 도구 키트 및 PerfView 중에서 선택 항목을 참조하세요.

추적을 캡처하려면 다음을 수행합니다.

  1. 관리자 모드에서 명령줄(PowerShell 또는 명령 프롬프트)을 엽니다. (관리 모드에서 실행되지 않으면 0xc5585011 오류 코드, "정책에서 시스템 성능을 프로파일하는 데 실패했습니다."가 표시될 수 있습니다.)

  2. 다음 명령을 입력합니다. wpr -start VirtualAllocation -filemode

  3. 조사 중인 시나리오를 실행합니다. (예를 들어 애플리케이션을 시작합니다.)

  4. 다음 명령을 입력합니다. wpr -stop Trace.etl

시스템 추적 분석

줄일 수 있는 메모리를 할당한 앱 함수를 찾으려면 캡처된 시스템 추적을 분석해야 합니다. 추적을 분석하려면 다음을 수행합니다.

  1. 다음 명령을 입력하여 Windows Performance Analyzer를 사용하여 추적을 엽니다. wpa.exe Trace.etl

  2. 그래프 탐색기 창에서 메모리 섹션을 확장하고 총 커밋 그래프를 마우스 오른쪽 단추로 클릭한 다음 새 분석 보기에 그래프 추가를 선택합니다.

  3. 설정 기어를 클릭하고 프로세스, 커밋 유형, 커밋 스택크기 열 정렬을 선택하여 보기 편집기를 엽니다.

  4. 결과가 내림차순으로 정렬되도록 크기 열 머리글을 클릭합니다. 커밋 스택에는 할당되는 메모리로 이어지는 코드 경로가 표시됩니다. 이러한 결과는 할당 이유를 이해하는 데 도움이 될 수 있습니다. 크기별로 정렬하면 더 큰 할당에 집중하고 최적화할 기회가 있는지 여부를 조사할 수 있습니다.

  5. 프로세스를 마우스 오른쪽 버튼으로 클릭한 후 선택 항목으로 필터링을 선택하여 분석하려는 프로세스로 필터링합니다.

  6. 뷰포트에서 관심 있는 지역을 확대하려면 범위를 선택하고 그래프를 마우스 오른쪽 단추로 클릭한 다음 확대/축소를 선택합니다.

  7. 커밋 스택을 탐색하여 메모리를 할당한 함수를 이해합니다. 커밋 스택에는 로드된 기호가 필요합니다. 기호를 로드하려면 위쪽 탐색 메뉴 모음에서 추적>로드 기호 를 선택합니다.

    Windows Performance Analyzer 메모리 추적 스크린샷

메모리 사용량을 줄이기 위해 추적 분석 적용

할당된 메모리를 분석할 때 메모리 사용량을 최소화할 수 있는 위치를 결정하는 데 도움이 되는 단서를 찾을 수 있습니다.

메모리 사용량을 줄이기 위해 코드를 업데이트하는 데 추적 분석을 적용하는 것과 관련하여 고려해야 할 몇 가지 영역은 다음과 같습니다.

  • 전경에서 메모리 사용량 감소: 메모리 추적을 분석하면 전경에서 불필요한 메모리 사용을 식별하고 코드를 업데이트하여 해당 사용량을 줄이거나 제거하는 데 도움이 될 수 있습니다.

  • 백그라운드에서 작업 진행 최소화: 시스템에는 프로세스 작업 집합에서 페이지를 자동 해제하는 정책이 있습니다. 백그라운드에서 메모리를 적게 사용하면 애플리케이션 메모리를 적게 유지하여 시스템의 효율성을 높일 수 있습니다. 백그라운드 작업을 최소화하여 전력 소비 및 배터리 수명을 개선하는 방법에 대해 자세히 알아봅니다. 백그라운드에서 메모리 사용량을 줄이는 것으로 변환됩니다.

  • 백그라운드에서 리소스 해제: 런타임 시 애플리케이션은 일부 메모리 캐시를 만들 수 있을 뿐만 아니라 UI를 지원하는 그래픽 할당을 만들 수 있습니다. 애플리케이션이 최소화되거나 표시되지 않을 때 이러한 할당을 해제할 수 있습니다. 애플리케이션은 이러한 작업을 수행하도록 메모리 부족 알림을 등록할 수 있지만, 애플리케이션이 비활성 상태라고 결론을 내릴 때 사용되지 않는 기간 후에 메모리를 해제하는 것이 더 나은 전략일 수 있습니다. 이 사용 기간은 애플리케이션에 따라 달라질 수 있으므로 비활성 사용의 가능한 지표는 몇 분에서 1/2시간 이상까지 다양할 수 있습니다. 이러한 종류의 메모리 절약과 응답성의 균형을 맞추기 위해 주의해야 합니다. 캐시를 다시 빌드하는 데 비용이 많이 드는 경우 애플리케이션은 애플리케이션의 수명 동안 캐시를 유지하도록 선택할 수 있습니다.

  • 애플리케이션이 메모리를 누수하지 않도록 합니다. 메모리 누수 여부를 확인하려면 먼저 애플리케이션 메모리 사용량이 특정 값 이상으로 증가하지 않는 안정적인 상태 벤치마크를 설정합니다. 애플리케이션을 지속적으로 사용하거나 백그라운드에서 유휴 상태로 두어 이 안정적인 상태를 설정할 수 있습니다. 캡처한 추적을 사용하여 가능한 메모리 누수를 식별하면 해당 메모리가 코드에 할당되는 위치와 해당 용도를 제공한 후 사용 해제할 수 있는 방법을 찾을 수 있습니다. 애플리케이션이 실행될 때 메모리가 계속 증가하는 경우 이는 메모리 누수의 표시일 수 있습니다. 추적 내의 증가에 해당하는 지역을 확대하고 커밋 스택을 신중하게 분석합니다.

디스크 공간 효율적으로 사용

디스크 공간 은 비활성 상태로 저장될 때(코드를 실행하지 않음) 애플리케이션의 크기를 나타냅니다. 애플리케이션이 디스크 공간을 많이 차지하는 경우 최적화할 수 있는 기회가 될 수 있습니다.

앱의 디스크 공간을 줄이면 성능이 향상될 수 있는 여러 가지 방법이 있습니다.

  • 디스크가 가득 차면 파일 시스템은 더 이상 연속적인 방식으로 새 콘텐츠를 저장할 수 없습니다. 전체 디스크가 조각화되어 연속되지 않는 섹터에 새 콘텐츠를 저장합니다. 이렇게 하면 디스크에서 해당 콘텐츠에 액세스할 때 대기 시간이 길어집니다. IO 시스템은 콘텐츠가 연속적이고 순차적으로 또는 더 큰 IO를 사용하여 액세스할 수 있는 경우 훨씬 더 나은 디스크 처리량을 제공합니다.

  • 전체 디스크는 SSD 기반 시스템의 쓰기 대기 시간이 길어질 수 있습니다. 쓰기를 흡수할 빈 셀이 적으면 쓰기에 읽기-수정-쓰기 작업이 발생하여 성능이 저하될 수 있습니다.

  • 전체 디스크는 애플리케이션을 업데이트하는 기능을 방해할 수 있습니다. OS는 복원력이 강하여 사용 가능한 디스크 공간이 적어도 시스템을 최신 상태로 안전하게 유지할 수 있습니다. 하지만 앱 업데이트를 위한 콘텐츠를 준비하기 위해 충분한 디스크 공간을 확보하면, 업데이트 과정을 더욱 빠르고 원활하게 진행할 수 있습니다.

  • 런타임에 액세스하기 위해 상당한 양의 큰 디스크 공간을 요구하면 메모리 사용으로도 변환됩니다. 이는 일반적으로 애플리케이션 및 시스템의 응답성에 영향을 줍니다. 또한 런타임에 디스크 공간의 작은 비율이 필요한 경우 애플리케이션에서 디스크 공간을 비효율적으로 사용할 수 있습니다.

디스크 공간을 줄이거나 더 효율적으로 만드는 몇 가지 방법은 다음과 같습니다.

  • 디스크 공간(필요한 항목만 다운로드)에 "플레이에 대한 지불" 원칙 적용: 애플리케이션에는 모든 사용자에게 적용되는 기능이 아닌 광범위한 기능이 포함될 수 있습니다. 디스크 공간이 큰 이유 중 하나일 수 있습니다. "유료 플레이" 원칙을 적용하면 사용자에게 필요한 기능만 다운로드하도록 선택하여 앱을 다운로드할 때 더 작은 디스크 공간으로 변환하도록 요청할 수 있습니다. 추가 콘텐츠는 사용자에게 더 풍부한 기능이 필요한 경우에만 다운로드에 선택적으로 적용됩니다. 기능 외에도 언어 지원에 동일한 "유료 플레이" 원칙을 적용할 수 있습니다. 애플리케이션에는 기본적으로 자주 사용되는 언어 선택 항목의 하위 집합이 포함될 수 있으며, 필요에 따라 추가 언어가 포함되거나 사용자 시스템에 설정된 위치에 종속됩니다.

  • 효율적인 캐시 크기 조정 적용: 경우에 따라 애플리케이션에서 디스크 캐시를 사용하여 사용자 환경의 응답성을 높일 수 있습니다. 애플리케이션에서 캐시를 관리하는 방법에 대한 정책을 설정할 수 있으며, 디스크 용량에 따라 캐시 크기에 대한 상한이 설정되고 디스크의 사용 가능한 공간이 낮을 때 캐시 크기를 조정할 수 있습니다.

  • 자산의 효율적인 사용 적용: 애플리케이션에는 이미지 자산이 포함되는 경우가 많으며 여러 해상도를 지원하는 다양한 이미지 크기로 구성될 수 있습니다. 해상도의 하위 집합에 대한 이미지 크기, 차원, 형식 및 압축을 최적화하고, 나머지 해상도를 지원하기 위해 크기 조정을 활용하면 디스크 공간을 크게 줄일 수 있습니다.

  • 이진 최적화 기회 조사: SizeBench와 같은 도구를 사용하면 애플리케이션 작성자가 이진 공간의 원인을 조사하고 사용된 디스크 공간을 줄일 기회를 찾을 수 있습니다.

추가 리소스