Programing

메모리에서 객체 크기를 얻는 방법?

lottogame 2020. 5. 13. 07:58
반응형

메모리에서 객체 크기를 얻는 방법? [복제]


이 질문에는 이미 답변이 있습니다.

객체가 C #에서 메모리에서 소비하는 바이트 수를 알아야합니다. 예를 얼마나 내을 위해 Hashtable, 또는 SortedListList<String>.


이것은 정확하지는 않지만 저에게는 충분합니다.

long size = 0;
object o = new object();
using (Stream s = new MemoryStream()) {
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, o);
    size = s.Length;
}

직접 얻을 수는 없다고 생각하지만 간접적으로 찾을 수있는 몇 가지 방법이 있습니다.

한 가지 방법은이 GC.GetTotalMemory방법을 사용하여 객체 생성 전후에 사용 된 메모리 양을 측정하는 것입니다. 이것은 완벽하지는 않지만 나머지 응용 프로그램을 제어하는 ​​한 관심있는 정보를 얻을 수 있습니다.

그 외에도 프로파일 러를 사용하여 정보를 얻거나 프로파일 링 API사용 하여 정보를 코드로 가져올 수 있습니다. 그러나 그것은 사용하기 쉽지 않을 것이라고 생각합니다.

C #의 개체에서 사용중인 메모리 양을 확인하십시오를 참조하십시오 . 비슷한 질문에.


관리되지 않는 개체 :

  • Marshal.SizeOf(object yourObj);

가치 유형 :

  • sizeof(object val)

관리 대상 개체 :


좋아요,이 질문에 대한 답변을 받았으며 답변을 수락했지만 누군가 저에게 답변을 요청했습니다.

우선, 확실하게 말할 수는 없습니다. 내부 구현 세부 사항이며 문서화되어 있지 않습니다. 그러나 다른 객체에 포함 된 객체를 기준으로합니다. 이제 캐시 된 객체의 메모리 요구 사항을 어떻게 계산합니까?

이전에이 기사 에서이 주제를 다루었습니다 .

이제 캐시 된 객체의 메모리 요구 사항을 어떻게 계산합니까? 대부분의 아시다시피 Int32와 float는 4 바이트, double 및 DateTime 8 바이트, char은 실제로 2 바이트 (1 바이트 아님) 등입니다. 문자열은 조금 더 복잡합니다. 2 * (n + 1). 여기서 n은 문자열의 길이입니다. 객체의 경우 멤버에 따라 다릅니다. 모든 멤버의 메모리 요구 사항을 요약하면 32 비트 상자의 모든 객체 참조가 4 바이트 포인터임을 기억하십시오. 사실 이것은 사실이 아니며 힙에있는 각 객체의 오버 헤드를 처리하지 않았습니다. 나는 당신이 이것에 대해 걱정할 필요가 있는지 확실하지 않지만, 만약 당신이 많은 작은 물체를 사용한다면 오버 헤드를 고려해야한다고 생각합니다. 각 힙 객체는 기본 유형만큼 비용이 많이 듭니다. 32 비트 시스템에서 32 비트 시스템에서 개체 참조에 4 바이트를 더하고 64 비트 시스템에서도 32 비트를 실행하지만 유형 개체 포인터에 4 바이트를 추가하면 동기 블록 인덱스에 4 바이트가 있다고 생각합니다. 이 추가 오버 헤드가 중요한 이유는 무엇입니까? 두 개의 Int32 멤버로 구성된 클래스가 있다고 가정 해 봅시다. 이 경우 메모리 요구 사항은 8 바이트가 아닌 16 바이트입니다.


다음 코드 조각은 직렬화 할 수있는 한 전달 된 객체의 크기를 바이트 단위로 반환해야합니다. 나는 게임 플랫폼에서 SRAM에 쓰는 문제를 해결하기 위해 Quixant의 동료로부터 이것을 얻었습니다. 그것이 도움이되기를 바랍니다. 신용과 Carlo Vittuci에게 감사합니다.

/// <summary>
/// Calculates the lenght in bytes of an object 
/// and returns the size 
/// </summary>
/// <param name="TestObject"></param>
/// <returns></returns>
private int GetObjectSize(object TestObject)
{
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    byte[] Array;
    bf.Serialize(ms, TestObject);
    Array = ms.ToArray();
    return Array.Length;
}

디버그 모드에서

SOS로드

dumpheap 명령을 실행하십시오.

참고 URL : https://stackoverflow.com/questions/605621/how-to-get-object-size-in-memory

반응형