2009-10-27 3 views
11

새 개체가 생성 될 때마다 개체가 힙에 만들어집니다. 각 객체에 할당 된 메모리에는 두 가지 추가 필드가 있습니다. 1) 유형 객체 포인터 2) 동기 블록 인덱스.힙에 할당 된 개체

정확히 두 필드의 용도는 무엇입니까? 아무도 이것에 대해 비추어 줄 수 있습니까?

+0

모든 객체가 특정 유형이라는 점을 감안할 때, howelse는 유형을 어딘가에 기록하지 않는 한 런타임이 알기로되어 있습니다 ...? 그런 종류의 물건을 읽는 것에 대해 걱정할 필요가 없습니다. 자신의 코드에 대해 걱정하십시오. –

+0

@mP 정확히 - 왜 값 유형에 해당 정보가 기록되지 않습니까? 도구가 어떻게 작동하는지 항상 알고 있어야합니다. – TarkaDaal

답변

17

유형 객체 포인터는 객체 유형을 나타내는 데 사용됩니다.

  • 방법 조회합니다 (VTABLE)
  • 검사는 GetType를 호출 할 경우 Type 개체를 찾기
  • 캐스트 : 이것은 필요합니다.

syncblock 필드는 주로 잠금에 사용됩니다. 필요가있을 때만 채워지고 잠금 장치가 항상 논쟁이되지 않으면 CLR은 외부 데이터가 필요없는 "얇은"잠금 장치를 사용합니다. 그렇지 않으면 프로세스 전반의 테이블에있는 항목입니다. 테이블의 내용을 알지 못하지만 객체 모니터에서 대기중인 스레드 목록과 같은 것이라고 생각합니다. 물론 정보의 가장 중요한 비트는 잠금이 현재 보유되고 있는지, 스레드에 의해 보유되었는지, 그리고 그 수를 계산하는지 (.NET 잠금의 재진입 성으로 인해) 여부입니다.

GetHashCode()으로 전화를 걸면 syncblock이 채워지고 오버라이드되지 않습니다. 기본적으로 프로세스 전체 테이블을 사용하여 안정된 번호를 할당합니다. (객체 주소가 시간이 지남에 따라 변경 될 수 있기 때문에 충분히 좋지 않습니다.)

+0

GetHashCode 및 syncblock에 대해 자세히 알지 못했습니까? 더 자세한 정보가 있습니까? 이 http://blogs.msdn.com/brada/archive/2003/09/30/50396.aspx가 발견되었지만 .NET 1.0/1.1 인 것 같습니다 ... – thecoop

+1

@thecoop : 저는 아무 것도 없습니다. 손에 대한 다른 참조, 비록 C#을 통해 CLR에서 언급 될 것으로 기대됩니다. –

+0

Syncblock은 또한 COM interop 메타 데이터와 AppDomainID를 저장하는 데 사용됩니다 (@JonSkeet은 "_process-wide_ table"의 항목이라고 생각합니다). – Sindhudweep

2

동기화 블록 인덱스는 모니터 클래스에 의해 후드 아래에서 사용되므로 lock 문도 사용됩니다.

1

싱크 블록 색인의 일부 비트는 더 이상 참조되지 않을 경우를 대비하여 객체를 가비지로 표시하기 위해 GC에서 사용됩니다.

관련 문제