메모리에서 객체 크기를 얻는 방법? [복제]
이 질문에는 이미 답변이 있습니다.
- C # 14 답변 에서 바이트 단위의 객체 인스턴스 크기 찾기
객체가 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;
}
직접 얻을 수는 없다고 생각하지만 간접적으로 찾을 수있는 몇 가지 방법이 있습니다.
한 가지 방법은이 GC.GetTotalMemory
방법을 사용하여 객체 생성 전후에 사용 된 메모리 양을 측정하는 것입니다. 이것은 완벽하지는 않지만 나머지 응용 프로그램을 제어하는 한 관심있는 정보를 얻을 수 있습니다.
그 외에도 프로파일 러를 사용하여 정보를 얻거나 프로파일 링 API 를 사용 하여 정보를 코드로 가져올 수 있습니다. 그러나 그것은 사용하기 쉽지 않을 것이라고 생각합니다.
C #의 개체에서 사용중인 메모리 양을 확인하십시오를 참조하십시오 . 비슷한 질문에.
관리되지 않는 개체 :
Marshal.SizeOf(object yourObj);
가치 유형 :
sizeof(object val)
관리 대상 개체 :
- 관리되는 개체를 얻을 수있는 직접적인 방법이없는 것 같습니다. 참조 : http://blogs.msdn.com/cbrumme/archive/2003/04/15/51326.aspx
좋아요,이 질문에 대한 답변을 받았으며 답변을 수락했지만 누군가 저에게 답변을 요청했습니다.
우선, 확실하게 말할 수는 없습니다. 내부 구현 세부 사항이며 문서화되어 있지 않습니다. 그러나 다른 객체에 포함 된 객체를 기준으로합니다. 이제 캐시 된 객체의 메모리 요구 사항을 어떻게 계산합니까?
이전에이 기사 에서이 주제를 다루었습니다 .
이제 캐시 된 객체의 메모리 요구 사항을 어떻게 계산합니까? 대부분의 아시다시피 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
'Programing' 카테고리의 다른 글
jQuery '입력'이벤트 (0) | 2020.05.13 |
---|---|
input () error-NameError : 이름 '…'이 (가) 정의되지 않았습니다 (0) | 2020.05.13 |
비밀번호없이 생성 된 OpenSSH 개인 키에 비밀번호를 추가하려면 어떻게합니까? (0) | 2020.05.13 |
numpy dtype을 기본 파이썬 유형으로 변환 (0) | 2020.05.13 |
C #에서 동일한 클래스의 다른 생성자에서 오버로드 된 생성자를 호출 할 수 있습니까? (0) | 2020.05.13 |