DA0022: Gen 2 가비지 컬렉션의 비율이 높습니다.DA0022: High rate of Gen 2 garbage collections

규칙 IDRule Id DA0022DA0022
범주Category .NET Framework 사용.NET Framework Usage
프로파일링 방법Profiling method 모두All
메시지Message Gen 2 가비지 수집의 비율이 상당히 높습니다.There is a fairly high rate of Gen 2 garbage collections occurring. 의도적으로 프로그램의 데이터 구조가 대다수 오랜 시간 동안 할당되고 지속되는 경우 일반적으로 이러한 현상은 문제가 되지 않습니다.If, by design, most of your program's data structures are allocated and persisted for a long time, this is not ordinarily a problem. 하지만 이러한 동작이 의도되지 않은 경우에는 응용 프로그램이 개체를 고정하고 있는 것일 수 있습니다.However, if this behavior is unintended, your application may be pinning objects. 확실하지 않으면 .NET 메모리 할당 데이터 및 개체 수명 정보를 수집하여 응용 프로그램이 사용하는 메모리 할당 패턴을 파악할 수 있습니다.If you are not sure, you can gather .NET memory allocation data and object lifetime information to understand the pattern of memory allocation your application uses.
규칙 유형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

프로파일링 중에 수집된 시스템 성능 데이터는 0세대 및 1세대 가비지 수집에 비해 .NET Framework 개체용 메모리의 상당한 부분이 가비지 수집의 2세대에서 회수되었음을 나타냅니다.System performance data that was collected during profiling indicate that a significant proportion of the memory for.NET Framework objects was reclaimed in generation 2 of garbage collection compared to generation 0 and generation 1 garbage collections.

규칙 설명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.

0세대의 개체는 빈번하게, 보통 매우 효율적으로 수집됩니다.Objects in generation 0 are collected frequently and usually very efficiently. 1세대의 개체는 덜 빈번하게, 덜 효율적으로 수집됩니다.Objects in generation 1 are collected less frequently and less efficiently. 마지막으로 2세대의 장기 유지 개체는 훨씬 덜 빈번하게 수집되어야 합니다.Finally, long-lived objects in generation 2 should be collected even less frequently. 전체 가비지 수집 실행을 나타내는 2세대 수집은 가장 부담이 큰 작업이기도 합니다.Generation 2 collection, which is a full garbage collection run, is also the most expensive operation.

비교적 너무 많은 2세대 수집이 발생한 경우 이 규칙이 실행됩니다.This rule fires when proportionally too many generation 2 garbage collections are occurring. 정상 작동하는 .NET Framework 응용 프로그램에는 1세대 수집이 2세대 수집보다 6배 이상 많이 포함됩니다.Well-behaved .NET Framework applications will have more than 5 times as many generation 1 garbage collections as generation 2 collections. 10배 요소가 이상적일 것입니다.(A 10x factor is probably ideal.)

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

[오류 목록] 창에서 메시지를 두 번 클릭하여 프로파일링 데이터의 표시 뷰로 이동합니다.Double-click the message in the Errors List window to navigate to the Marks View of the profiling data. .NET CLR Memory\# of Gen 0 Collections.NET CLR Memory\# of Gen 1 Collections 열을 찾습니다.Find the .NET CLR Memory\# of Gen 0 Collections and .NET CLR Memory\# of Gen 1 Collections columns. 가비지 수집이 더 빈번히 발생하는 특정 프로그램 실행 단계가 있는지 확인합니다.Determine if there are specific phases of program execution where garbage collection is occurring more frequently. 이러한 값을 % Time in GC 열에 비교하여 관리되는 메모리 할당의 패턴이 과도한 메모리 관리 오버헤드를 일으키는지 확인합니다.Compare these values to the % Time in GC column to see if the pattern of managed memory allocations is causing excessive memory management overhead.

높은 비율의 2세대 가비지 수집이 항상 문제가 되는 것은 아닙니다.A high proportion of Generation 2 garbage collections is not always a problem. 정상적인 현상일 수 있습니다.It might be by design. 실행 중에 장기간 활성 상태를 유지해야 하는 큰 데이터 구조를 할당하는 응용 프로그램이 이 규칙을 트리거할 수 있습니다.An application that allocates large data structures that must remain active for long periods during execution may trigger this rule. 이런 응용 프로그램에 메모리가 부족한 경우 빈번한 가비지 수집이 강제로 수행될 수 있습니다.When such an application is under memory pressure, it may be forced to perform frequent garbage collections. 부담이 적은 0세대 및 1세대 가비지 수집이 관리되는 메모리를 적은 양만 회수할 수 있는 경우에는 더 빈번한 2세대 가비지 수집이 예약됩니다.If the less expensive Generation 0 and Generation 1 garbage collections can reclaim only a small amount managed memory, more frequent Generation 2 garbage collections will be scheduled.

표시 뷰에는 가비지 수집 문제를 확인하도록 도울 수 있는 추가적인 .NET CLR Memory 열이 있습니다.There are additional .NET CLR Memory columns in the Marks View that can help you identify garbage collection issues. % Time in GC 열을 통해 발생하는 메모리 관리 오버헤드의 양을 파악할 수 있습니다.The % Time in GC column helps you understand how much memory management overhead is occurring. 응용 프로그램이 크지만 영구적인 개체를 상당히 적게 사용할 경우 빈번한 2세대 수집이 과도한 CPU 시간을 사용하면 안 됩니다.If your application typically uses a fairly small number of large but persistent objects, then frequent Generation 2 collections should not consume excessive amounts of CPU time. 더 많은 실제 메모리(RAM)가 필요하기 때문에 응용 프로그램에 메모리가 부족할 경우 Memory\Pages/sec 열 값을 평가하는 관련 규칙도 실행될 수 있습니다.If the application is under memory pressure because more Physical Memory (RAM) is required, related rules that evaluate the Memory\Pages/sec column values may also fire.

응용 프로그램의 관리되는 메모리 사용 패턴을 파악하려면 .NET 메모리 할당 프로필을 실행하여 응용 프로그램을 다시 프로파일링하고 개체 수명 프로파일링 옵션을 선택합니다.To understand the application's pattern of managed memory usage, profile it again running a.NET Memory allocation profile and select the Object Lifetime profiling option.

가비지 수집 성능 향상 방법에 대한 자세한 내용은 Microsoft 웹 사이트에서 가비지 수집기 기본 및 성능 힌트를 참조하세요.For information about how to improve garbage collection performance, see Garbage Collector Basics and Performance Hints on the Microsoft Web site. 자동 가비지 수집의 오버헤드에 대한 자세한 내용은 Large Object Heap Uncovered(대형 개체 힙 살펴보기)를 참조하세요.For information about the overhead of automatic garbage collection, see Large Object Heap Uncovered.