2010-07-21 9 views
1

GC가 참조 유형과 값 유형을 다르게 처리 할 수 ​​있다고 생각합니다.GC 정리 방법은 무엇입니까?

아무에게도 참조가없는 경우 GC에서 참조 유형을 수집합니다. GC가 struct와 같은 값 유형을 수집 할 때? 제 구조체가 작지 않습니다. 나는 그것이 가능한 한 빨리 수집되기를 바랍니다. 프로파일 러 소프트웨어를 사용하여 struct가 큰 누적을 가지며 중요한 메모리를 소비한다는 것을 알았습니다.

답변

6

구조체는 인스턴스/정적 필드이거나 다른 객체 또는 상자의 일부이거나 배열 인 경우 관리되는 힙 (가비지 수집 할 수있는 위치)에만 있습니다. 관리되는 힙에서는 "알몸"적이 아닙니다. 가장 가까운 값은 박스형 값입니다.

구조체가 큰 경우 가장 먼저 문제가 발생합니다. 왜 그런 것을 만들었습니까? 구조체는 메소드 인수로 사용하거나 다른 변수에 할당 할 때마다 구조체가 거의 항상 작아야합니다 (일반적으로 32 바이트입니다). 그렇지 않으면 결국 복사됩니다.

수업을 대신 사용 하시겠습니까? 에릭 Lippert의로


1the stack is an implementation detail을 지적를 좋아합니다. 게다가 어떤 경우 로컬 변수는 자동 생성 클래스의 필드로 끝납니다 ...하지만이 질문에 대해서는 다소 관련이 없습니다.

+0

우리는 struct \ data를 tcp/ip를 통해 한 시스템에서 다른 시스템으로 전송해야하기 때문에 struct를 사용합니다. – 5YrsLaterDBA

+0

@ 5YrsLaterDBA : 그건 별거 아니에요. 구조체 * 또는 * 클래스를 사용하여 모든 종류의 방법으로 한 컴퓨터에서 다른 컴퓨터로 데이터를 보낼 수 있습니다. 데이터를 어떤 식 으로든 직렬화 할 수 있어야합니다. 다시 한 번 그곳에는 많은 가능성이 있습니다. –

+0

@JonSkeet 필자는 매개 변수 복사로 인해 구조체에 대한 엄지 손가락 규칙이 존재한다는 것을 결코 깨닫지 못했습니다. 그래도 많은 의미가 있습니다. 감사! –

1

구조체 형식은 값 형식이며 System.ValueType에서 상속됩니다. 값 유형 변수는 현재 스레드의 스택 (힙이 아닌)에 할당됩니다. 관리 힙에는 메모리가 할당되지 않습니다. 스택에 할당되며 값 유형 변수가 범위를 벗어날 때 자동으로 해제됩니다. 그러나 값 유형 변수의 복싱을 수행하는 경우 메모리는 변수의 래퍼에 대해 힙에 할당되고 변수의 필드는 래퍼에 복사됩니다. 값 유형 변수가 85KB보다 크면 래퍼가 LOH (Large Object Heap)에 배치됩니다. LOH 객체는 오래 살며 Gen2에 속합니다.

관련 문제