programing

메모리에서 개체 크기를 가져오는 방법은 무엇입니까?

showcode 2023. 5. 5. 10:00
반응형

메모리에서 개체 크기를 가져오는 방법은 무엇입니까?

내 개체가 메모리에서 사용하는 바이트 수(C#)를 알아야 합니다.예를 들어 내가 얼마나Hashtable또는SortedList또는List<String>.

이것은 정확하지 않을 수도 있지만 저에게는 충분히 가깝습니다.

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

직접 구할 수는 없을 것 같은데 간접적으로 찾을 수 있는 방법이 몇 가지 있습니다.

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

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

비슷한 질문은 C#?에서 개체가 사용하는 메모리확인을 참조하십시오.

관리되지 않는 개체:

  • Marshal.SizeOf(object yourObj);

값 유형:

  • sizeof(object val)

관리 개체:

  • 관리 개체를 직접 가져올 방법은 없는 것 같습니다. 참조: https://learn.microsoft.com/en-us/archive/blogs/cbrumme/size-of-a-managed-object

네, 이 질문은 답변이 되었고 답변이 받아들여졌는데 누군가가 제 답변을 적어달라고 해서 그렇게 하세요.

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

저는 이전에 이 기사에서 이 주제에 대해 언급한 적이 있습니다.

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

다음 코드 조각은 직렬화될 수 있는 한 전달된 개체의 크기(바이트)를 반환해야 합니다.저는 게임 플랫폼에서 SRAM에 쓰는 문제를 해결하기 위해 키호테의 동료로부터 이것을 얻었습니다.도움이 되길 바랍니다.카를로 비투치에게 감사드립니다.

/// <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

반응형