답변

17

LOH (큰 개체 힙)는 큰 개체가 직접 할당되고 수집 될 때까지 거기에 머물러있는 단일 힙입니다. 객체들은 그 크기에 기초하여 LOH에 직접 할당된다. 85000 바이트 이상입니다.

세대 개체는 단일 힙인 SOH (Small Object Heap)에 할당 된 "작은"개체입니다. SOH 내의 객체는 최대 세대까지 살아남은 콜렉션의 수를 나타내는 연관된 세대를 갖는다. 2. 세대 번호가 0에서 시작하므로 세대 2의 오브젝트는 최소 3 개의 콜렉션, 즉 세대 0,1,2에서 살아 남았으므로 3 세대로 기술 할 수 있습니다.

생성은 가비지 검색을 최적화하는 데 도움이됩니다. 수명이 긴 오브젝트는 콜렉션에서 살아남으므로 세대 번호가 증가하고 숫자가 많은 세대는 스캔 빈도가 낮아집니다. 이 메커니즘을 사용하면 수명이 짧지 않은 개체를 자주 검색하지 않아 불필요하게 검색 할 수 있습니다. generational scheme은 많은 객체가있는 곳의 힙을위한 좋은 최적화로 보았 듯이 SOH에 적용됩니다.

업데이트

지금까지 내가 LOH 개체가 최대 세대에있는 것으로보고 이해하지만, 나는이 그냥 기본값이라고 생각한다. 그것들은 실제로 어떤 세대, 즉 2 세대 SOH 객체가 아니며 LOH 객체는 동일한 "목록"에 없습니다. 그러나 @Henk이 지적한 것처럼 2 세대 컬렉션을 수행 할 때 LOH 객체도이 시점에서 수집됩니다. 그래서 개념적으로 2 세대와 LOH 사이에는 관계가 있습니다. 이것은 닷넷 2.0으로 올바른 :

참조 : 그들은 세대 2 모음이있는 경우에만 수집되기 때문에 Large Object Heap Uncovered보기의 세대의 관점에서

이 큰 개체가 2 세대에 속한다.

그러나 수집 관계는 분명하지만 생성되지 않은 예제는 생성 압축입니다. 세대가 수집되면 압축 될 수도 있습니다. 그러나 LOH는 압축되어 있지 않으므로 2 객체를 생성하는 모든 일이 LOH의 객체에서 발생한다고 할 수는 없습니다.

[Test] 
public void large_object_heap_objects_are_reported_as_max_generation() 
{ 
    int[] bling = new int[85000/4]; 

    int maxGen = GC.MaxGeneration; 
    int objectGen = GC.GetGeneration(bling); 

    Assert.AreEqual(maxGen, objectGen, "Large object is at max generation."); 
} 
+0

그래서 85kb보다 큰 오브젝트는 항상 LOH로 이동하고 SOH로 이동하지 않습니다. 규칙이 있습니까? –

+0

나는 LOH 객체도 100 % 확실하지는 않지만 한 세대에 속한다고 생각했다. 그러나 그 (것)들이 표를하고 동일 물을 쓸어내는 동안, 그들은 압축되지 않는다. –

+0

그리고 LOH에는 세대가 없습니다. –