GC가 참조 유형과 값 유형을 다르게 처리 할 수 있다고 생각합니다.GC 정리 방법은 무엇입니까?
아무에게도 참조가없는 경우 GC에서 참조 유형을 수집합니다. GC가 struct와 같은 값 유형을 수집 할 때? 제 구조체가 작지 않습니다. 나는 그것이 가능한 한 빨리 수집되기를 바랍니다. 프로파일 러 소프트웨어를 사용하여 struct가 큰 누적을 가지며 중요한 메모리를 소비한다는 것을 알았습니다.
GC가 참조 유형과 값 유형을 다르게 처리 할 수 있다고 생각합니다.GC 정리 방법은 무엇입니까?
아무에게도 참조가없는 경우 GC에서 참조 유형을 수집합니다. GC가 struct와 같은 값 유형을 수집 할 때? 제 구조체가 작지 않습니다. 나는 그것이 가능한 한 빨리 수집되기를 바랍니다. 프로파일 러 소프트웨어를 사용하여 struct가 큰 누적을 가지며 중요한 메모리를 소비한다는 것을 알았습니다.
구조체는 인스턴스/정적 필드이거나 다른 객체 또는 상자의 일부이거나 배열 인 경우 관리되는 힙 (가비지 수집 할 수있는 위치)에만 있습니다. 관리되는 힙에서는 "알몸"적이 아닙니다. 가장 가까운 값은 박스형 값입니다.
구조체가 큰 경우 가장 먼저 문제가 발생합니다. 왜 그런 것을 만들었습니까? 구조체는 메소드 인수로 사용하거나 다른 변수에 할당 할 때마다 구조체가 거의 항상 작아야합니다 (일반적으로 32 바이트입니다). 그렇지 않으면 결국 복사됩니다.
수업을 대신 사용 하시겠습니까? 에릭 Lippert의로
1 는 the stack is an implementation detail을 지적를 좋아합니다. 게다가 어떤 경우 로컬 변수는 자동 생성 클래스의 필드로 끝납니다 ...하지만이 질문에 대해서는 다소 관련이 없습니다.
구조체 형식은 값 형식이며 System.ValueType에서 상속됩니다. 값 유형 변수는 현재 스레드의 스택 (힙이 아닌)에 할당됩니다. 관리 힙에는 메모리가 할당되지 않습니다. 스택에 할당되며 값 유형 변수가 범위를 벗어날 때 자동으로 해제됩니다. 그러나 값 유형 변수의 복싱을 수행하는 경우 메모리는 변수의 래퍼에 대해 힙에 할당되고 변수의 필드는 래퍼에 복사됩니다. 값 유형 변수가 85KB보다 크면 래퍼가 LOH (Large Object Heap)에 배치됩니다. LOH 객체는 오래 살며 Gen2에 속합니다.
우리는 struct \ data를 tcp/ip를 통해 한 시스템에서 다른 시스템으로 전송해야하기 때문에 struct를 사용합니다. – 5YrsLaterDBA
@ 5YrsLaterDBA : 그건 별거 아니에요. 구조체 * 또는 * 클래스를 사용하여 모든 종류의 방법으로 한 컴퓨터에서 다른 컴퓨터로 데이터를 보낼 수 있습니다. 데이터를 어떤 식 으로든 직렬화 할 수 있어야합니다. 다시 한 번 그곳에는 많은 가능성이 있습니다. –
@JonSkeet 필자는 매개 변수 복사로 인해 구조체에 대한 엄지 손가락 규칙이 존재한다는 것을 결코 깨닫지 못했습니다. 그래도 많은 의미가 있습니다. 감사! –