2017-05-23 3 views
0

수십만 개의 항목이있는 다차원 배열이 있고 모든 항목이 수명이 긴 (즉, 한 번만 생성되고 응용 프로그램의 전체 기간 동안 살아있는) 클래스 객체 인 경우 필요한 GC 관련 내용이 있습니까? 고려하다? 이것이 GC 완료까지 걸리는 시간에 영향을 줍니까? 이것이 향후 할당/할당 해제에 영향을 줍니까?큰 클래스의 소규모 클래스를 사용하면 GC에 어떤 영향이 있습니까?

문맥을 위해, 나는 많은 클래스의 배열이나 구조체의 큰 배열을 사용하는 것을 결정하려고 노력하고있다.

+0

당신이 무엇을 요구하는지는 분명하지 않습니다. 클래스 대 structs 사용을 고려할 때, 당신의 주장이나 딜레마는 무엇입니까? 미래 할당에 대해 말하고 있지만 수명은 적용 기간이므로 배열의 미래 재 할당은 적용되지 않습니다. – LB2

+0

@ LB2 내 질문의 주요 특징은 작은 클래스의 큰 배열의 GC 의미입니다. 제가 제공 한 컨텍스트는 당신이 정말로 필요하지 않은 부수적 인 정보였습니다. 프로파일 링을 통해 알고리즘이 구조체 대신 클래스의 큰 배열에서 더 잘 작동하고 뭔가를 간과하지 않도록하고 싶습니다. 할당 명세서는 일반적으로 새로운 할당에 적용됩니다. 큰 클래스의 배열에만 해당하는 것이 아닙니다. – Slight

답변

1

작은 클래스가 오래 지속되면 곧 Gen2 개체로 승격되어 Gen0 및 Gen1 컬렉션에 영향을 미치지 않습니다. 할당에 영향을 미치지 않습니다. 그래도 Gen2 컬렉션에 영향을 미치지 만, GC가 Gen2 컬렉션을 수행하는 경우 다른 문제가 발생합니다. 메모리가 부족합니다.

GC에 영향을주는 것 외에도 클래스와 구조체는 개체의 메모리 레이아웃에도 영향을줍니다. 이는 CPU 캐시 성능에 영향을 미치므로 성능에 큰 영향을 미칠 수 있습니다.

+0

감사합니다. 필자는 지금까지 프로파일 링을 통해 클래스의 큰 배열이 사용 사례에서 구조체 복사 오버 헤드를 제거하여 ~ 20 % 빠르게 실행되는 경향이 있음을 발견했습니다. 저는 주로 측정하지 않은 숨겨진 성능에 대해 우려했습니다. 수락하기 전에이 질문을 조금 더 열어 두십시오. – Slight

1

일반 힙 할당과 동일한 방식으로 수집되지 않는 충분히 큰 개체가 Large Object Heap (LOH)에 할당됩니다. LOH의 객체는 정상적으로 압축되지 않으므로 조각난 메모리로 처리하는 것이 훨씬 쉽습니다. 따라서 프로세스가 많은 메모리를 사용하지 않아도 OutOfMemoryException을 얻는 것이 훨씬 쉽습니다 (내 경험은 700MB였습니다). 대형 객체를 많이 다룰 때 32 비트 프로세스에서 이러한 조건을 쉽게 처리 할 수 ​​있습니다.

미래의 할당에 대해 묻는 이유는 이것이 프로그램에서 기대하는 유일한 큰 개체이고 자주 다른 개체와 함께 재 할당되지 않는 경우 하나 또는 그 이상을 갖는 것이 아마도 큰 문제가 아니며 너에게 너무 많은 영향을 미치지 않을거야. 대용량 배열이나 큰 문자열과 같은 큰 개체를 갖는 것이 좋습니다. LOH를 요구하는 할당이 자주 발생하면 문제가 될 수 있습니다.

구조체와 개체. 객체는 분명히 배열의 너비를 포인터와 같은 크기, 즉 32 또는 64 비트로 만듭니다. 구조체는 배열 자체에 값으로 저장 될 수 있으므로 구조체가 더 큰 경우 요소 크기가 같은 동일한 크기의 배열이 바이트 단위로 커집니다. 따라서 요소 수가 적 으면 어레이가 LOH에 할당됩니다.

+0

정보를 제공해 주셔서 감사합니다. 배열은 한 번만 할당되고 다시는 영원히 살 수 없습니다. – Slight