DA0018: 프로세스 관리 메모리 한도로 실행 중인 32비트 응용 프로그램DA0018: 32-bit Application running at process managed memory limits

규칙 IDRule Id DA0018DA0018
범주Category 프로파일링 도구 사용Profiling Tools Usage
프로파일링 방법Profiling method 샘플링Sampling
메시지Message 관리되는 메모리 할당이 32비트 프로세스의 기본 한도에 근접하고 있습니다.Managed memory allocations approaching the default limit for a 32-bit process. 응용 프로그램이 메모리 바인딩될 수 있습니다.Your application could be memory-bound.
규칙 유형Rule type 경고Warning

샘플링, .NET 메모리 또는 리소스 경합 방법을 사용하여 프로파일링할 경우 이 규칙을 트리거하려면 10개 이상의 샘플을 수집해야 합니다.When you profile by using the sampling, .NET memory, or resource contention methods, you must collect at least 10 samples to trigger this rule.

원인Cause

프로파일링 실행 동안 수집된 시스템 데이터가 .NET Framework 메모리 힙이 32비트 프로세스에서 관리되는 힙이 도달할 수 있는 최대 크기에 도달했음을 나타냅니다.System data collected during the profiling run indicates the .NET Framework memory heaps approached the maximum size that the managed heaps can reach in a 32-bit process. 이 최대 크기가 기본값입니다.This maximum size is a default value. 이 크기는 전용 바이트에 할당될 수 있는 프로세스 주소 공간의 전체 크기를 기초로 합니다.It is based on the total amount of the process address space that can be allocated for private bytes. 보고된 값은 프로파일링된 프로세스가 활성화된 동안 관찰된 힙의 최대값입니다.The value reported is the maximum observed value of the heaps while the profiled process was active. .NET 메모리 프로파일링 방법을 사용하고 응용 프로그램의 관리되는 리소스 사용을 최적화하여 다시 프로파일링해 보세요.Consider profiling again using the .NET memory profiling method and optimizing the use of managed resources by the application.

관리되는 힙 크기가 기본 한도에 도달하면 자동 가비지 수집 프로세스를 더 빈번히 호출해야 할 수 있습니다.When the size of the managed Heaps approach the default limit, the automatic garbage collection process might have to be invoked more frequently. 이로 인해 메모리 관리의 오버헤드가 증가합니다.This increases the overhead of memory management.

규칙은 32비트 컴퓨터에서 실행되는 32비트 응용 프로그램에 대해서만 실행됩니다.The Rule only fires for 32-bit applications running on 32-bit machines.

규칙 설명Rule Description

Microsoft .NET CLR(공용 언어 런타임)는 가비지 수집을 사용하여 응용 프로그램에 더 이상 사용되지 않는 개체에서 메모리를 회수하는 자동 메모리 관리 메커니즘을 제공합니다.The Microsoft .NET common language run-time (CLR) provides an automatic memory management mechanism that uses a garbage collector to reclaim memory from objects that the application no longer uses. 가비지 수집기는 많은 할당이 단기 유지된다는 가정 하에 세대를 기준으로 합니다.The garbage collector is generation-oriented, based on the assumption that many allocations are short-lived. 예를 들어 로컬 변수는 단기 유지되어야 합니다.Local variables, for example, should be short-lived. 새로 만들어진 개체는 0세대(gen 0)에서 시작되고, 가비지 수집 실행에서 생존하면 1세대로 이동하고, 응용 프로그램에 계속 사용될 경우 마지막으로 2세대로 전환됩니다.Newly created objects start in generation 0 (gen 0), and then they progress to generation 1 when they survive a garbage collection run, and finally transition to generation 2 if the application still uses them.

85KB를 초과하는 관리되는 개체는 큰 개체 힙에 할당되며, 여기에서 이러한 개체는 작은 개체들보다 가비지 수집 및 압축이 덜 수행됩니다.Managed objects that are larger than 85 KB are allocated on the Large Object Heap, where they are subject to less frequent garbage collection and compaction than smaller objects. 큰 개체는 보다 지속적인 것으로 간주될 뿐만 아니라, 지속적인 대형 개체를 자주 할당되는 작은 개체와 함께 관리하면 힙이 최악의 상태로 단편화될 수 있으므로 별도로 관리됩니다.large objects are managed separately because it is assumed that they are more persistent and because mixing persistent and large objects with frequently allocated smaller objects can produce worst-cast fragmentation of the heap.

관리되는 힙의 전체 크기가 기본 한도에 도달하면, 메모리 관리의 오버헤드가 증가하여 응용 프로그램의 응답성과 확장성에 영향을 주기 시작합니다.As the total size of the managed heaps approach the default limit, the overhead of memory management usually increases to the point where it can start to impact the responsiveness and scalability of the application.

경고를 조사하는 방법How to Investigate a Warning

[오류 목록] 창에서 메시지를 두 번 클릭하여 표시 뷰로 이동합니다.Double-click the message in the Error List window to navigate to the Marks view. .NET CLR Memory\# Bytes in all Heaps# Total committed bytes 열을 찾습니다.Find the .NET CLR Memory\# Bytes in all Heaps and # Total committed bytes columns. 다른 단계보다 관리되는 메모리 활동이 더 빈번한 특정 프로그램 실행 단계가 있는지 확인합니다.Determine if there are specific phases of program execution where managed memory allocation is heavier than other phases. # Bytes in all Heaps 열 값을 .NET CLR Memory\# of Gen 0 Collections, .NET CLR Memory\# of Gen 1 Collections.NET CLR Memory\# of Gen 2 Collections 열에서 보고된 가비지 수집 비율에 비교하여 관리되는 메모리 할당의 패턴이 가비지 수집 비율에 영향을 미치는지 확인합니다.Compare the values of the # Bytes in all Heaps column to the rate of garbage collection reported in the .NET CLR Memory\# of Gen 0 Collections, .NET CLR Memory\# of Gen 1 Collections, and .NET CLR Memory\# of Gen 2 Collections columns to determine if the pattern of managed memory allocations is affecting the rate of garbage collection.

.NET Framework 응용 프로그램에서 공용 언어 런타임은 관리되는 힙의 전체 크기를 프로세스 주소 공간의 최대 전용 영역 크기의 절반보다 약간 작은 크기로 제한합니다.In a .NET Framework application, the common language runtime limits the total size of the managed heaps to slightly less than one-half of the maximum size of the private area portion of a process address space. 32비트 컴퓨터에서 실행되는 32비트 프로세스의 경우 프로세스 주소 공간 중 전용 부분의 상한은 2GB입니다.For a 32-bit processes running on a 32-bit machine, 2 GB represents the upper limit of the private portion of the process address space. 관리되는 힙의 전체 크기가 기본 한도에 도달하면 관리 메모리의 오버헤드가 증가할 수 있고 응용 프로그램 성능이 저하될 수 있습니다.As the total size of the managed Heaps begins to approach its default limit, the overhead of managing memory might increase and application performance can decrease.

관리되는 메모리의 과도한 오버헤드가 문제인 경우 다음 옵션 중 하나를 고려하세요.If excessive managed memory overhead is a problem, consider either of these options:

  • 응용 프로그램의 관리되는 메모리 리소스 사용 최적화optimizing the application's usage of managed memory resources

    또는-or-

  • 32비트 프로세스의 최대 가상 메모리 크기에 대한 아키텍처 제약 조건을 완화하는 단계 수행taking steps to relieve the architectural constraints on the maximum size of virtual memory for a 32-bit process

    응용 프로그램의 관리되는 메모리 리소스 사용을 최적화하려면 .NET 메모리 할당 프로파일링 실행에서 관리되는 메모리 할당 데이터를 수집합니다.To optimize the application's usage of managed memory resources, gather managed memory allocation data in a .NET Memory Allocation profiling run. .NET 메모리 데이터 뷰 보고서를 검토하여 응용 프로그램의 메모리 할당 패턴을 파악합니다.Review the .NET Memory Data Views reports to understand the application's pattern of memory allocation.

    개체 수명 뷰를 사용하여 프로그램의 어떤 데이터 개체가 세대로 생존하고 세대에서 회수되는지 확인합니다.Use the Object Lifetime View to determine which of the program's data objects are surviving into generation and then being reclaimed from there.

    할당 뷰를 사용하여 이러한 할당이 시작된 실행 경로를 확인합니다.Use the Allocations View to determine the execution path that resulted in these allocations.

    가비지 수집 성능을 향상시키는 방법에 대한 자세한 내용은 MSDN 웹 사이트에서 .NET Framework 기술 문서, 가비지 수집기 기본 및 성능 힌트를 참조하세요.For more information about how to improve garbage collection performance, see .NET Framework technical article, Garbage Collector Basics and Performance Hints on the MSDN Web site.

    프로세스 주소 공간 중 전용 부분 크기에 대한 가상 메모리 제약 조건을 구조적으로 완화하려면 64비트 컴퓨터에서 이 32비트 프로세스를 실행해 보세요.To gain architectural relief from the virtual memory constraints on the size of the private portion of a process address space, try running this 32-bit process on a 64-bit machine. 64비트 컴퓨터에서 32비트 프로세스를 실행하면 전용 가상 메모리를 4GB까지 확보할 수 있습니다.A 32-bit process on a 64-bit machine can acquire up to 4 GB of private virtual memory.

    64비트 컴퓨터에서 64비트 프로세스를 실행하면 가상 메모리를 8TB까지 확보할 수 있습니다.A 64-bit process running on a 64-bit machine can acquire up to 8 TB of virtual memory. 네이티브 64비트 응용 프로그램으로 실행되도록 응용 프로그램을 다시 컴파일해 보세요.Consider re-compiling the application to execute as a native 64-bit application. 이 규칙은 참고용으로만 제공되며 정정 작업이 필요하지 않습니다.This rule is for information only, and might not require corrective action.