Orcas 3월 CTP 버전과 함께 다양한 기능들이 소개되고 있습니다. 이번에는 Garbage Collector의 변화된 점들을 소개해 드리겠습니다.
미리 말씀드리자면, 다음 토픽이 원본입니다.
New In Orcas Part 1: What we’ve been doing
; https://learn.microsoft.com/en-us/archive/blogs/clyon/new-in-orcas-part-1-what-weve-been-doing
첫 번째로, 버그 수정을 예로 드는군요. OOM(Out-of-memory) 버그 및 성능 향상이 있다고 합니다. 이거야 뭐... 우리가 굳이 ^^ 신경 쓸 필요는 없을 것 같고.
두 번째로, ... 이 부분부터가 개발자들에게는 재미있을 것 같습니다. GC.Collect 메서드에 또 다른 System.GCCollectionMode 열거형 인자가 추가되었습니다. 함수 원형이 다음과 같습니다.
// Summary:
// Forces a garbage collection from generation zero through a specified generation,
// at a time specified by a System.GCCollectionMode value.
//
// Parameters:
// mode:
// One of the System.GCCollectionMode values.
//
// generation:
// The number of the oldest generation on which garbage collection can be performed.
public static void Collect(int generation, GCCollectionMode mode);
// Summary:
// Specifies the behavior for a forced garbage collection.
[Serializable]
public enum GCCollectionMode
{
// Summary:
// The default setting for this enumeration, which is currently System.GCCollectionMode.Forced.
Default = 0,
//
// Summary:
// Forces the garbage collection to occur immediately.
Forced = 1,
//
// Summary:
// Allows the garbage collector to determine whether the current time is optimal
// to reclaim objects.
Optimized = 2,
}
말 그대로, GCCollectionMode.Optimized 인자를 지정하게 되면 GC로 하여금 효율을 판단해서 필요한 경우에만 수집을 할 수 있도록 명령을 내릴 수 있습니다. 아마도 응용 프로그램 개발자들을 위해서 ".NET" 팀이 내부 GC 동작을 방해하지 않는 범위 내에서 마음껏 Collect 메서드를 부를 수 있도록 "Optimized" 값을 제공해 주는 의도가 있는 듯합니다.
세 번째로, ... 이것도 재미있을 것 같습니다. ^^ 그동안은, GC가 수집 작업이 필요하다고 판단이 되면 무조건 사용자 코드의 상황을 고려하지 않고 구동이 되는 구조였을 텐데요. .NET 3.5에서는 이 부분을, 사용자가 직접 코드 구역을 지정할 수 있도록 해주고 있습니다. 따라서, 급하게 끝내야 할 코드가 있는 경우, 그 시점에 GC의 동작을 최대한 지연시킬 수 있도록 해주는 방편을 제공해 줍니다.(물론, 관리 힙의 메모리가 완전히 소진되는 상황을 GC가 가만히 앉아서 지켜보진 않을 것이므로, 완벽한 지연을 기대해서는 안될 것입니다.)
관련 코드는 다음과 같습니다.
// Summary:
// Specifies the garbage collection settings for the current process.
public static class GCSettings
{
// Summary:
// Gets a value indicating whether server garbage collection is enabled.
//
// Returns:
// true if server garbage collection is enabled; otherwise, false.
public static bool IsServerGC { get; }
//
// Summary:
// Gets or sets the current latency mode for garbage collection.
//
// Returns:
// One of the System.Runtime.GCLatencyMode values. The default mode in workstation
// applications is System.Runtime.GCLatencyMode.Interactive, and the default
// mode in server applications is System.Runtime.GCLatencyMode.Interactive.
public static GCLatencyMode LatencyMode { get; set; }
}
// Summary:
// Adjusts the time that the garbage collector intrudes in your application.
[Serializable]
public enum GCLatencyMode
{
// Summary:
// Disables garbage collection concurrency and reclaims objects in a batch call.
// This is the most intrusive mode.
Batch = 0,
//
// Summary:
// Enables garbage collection concurrency and reclaims objects while the application
// is running. This is the default mode for Workstation GC and is less intrusive.
Interactive = 1,
//
// Summary:
// Enables garbage collection that is more conservative in reclaiming objects.
// Collections occur less frequently. This is the least intrusive mode.
LowLatency = 2,
}
자주 사용할 만한 것들은 아니지만. ^^
참고로 GCLatencyMode에 관련해서 좀 더 자세한 설명은 다음에서 제공되고 있습니다.
New In Orcas Part 3: GC Latency Modes
; https://learn.microsoft.com/en-us/archive/blogs/clyon/new-in-orcas-part-3-gc-latency-modes
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]