Java에서 객체의 메모리 풋 프린트가 무엇인지 이해하려고합니다. 나는 this과 자바의 객체와 메모리에 관한 다른 문서들을 읽었다.자바 객체 메모리 풋 프린트 - Visualvm 및 java.sizeOf 측정
그러나 sizeof Java library 또는 visualvm을 사용할 때 나는 이전 참조 (http://www.javamex.com)에 따라 기대할 수있는 것이 전혀없는 두 가지 결과를 얻습니다.
제 테스트를 위해 64-bits Mac
에서 Java SE 7 Developer Preview
을 java.sizeof 0.2.1
및 visualvm 1.3.5
으로 사용하고 있습니다.
나는 세 가지 클래스, TestObject
, TestObject2
, TestObject3
이 있습니다.
public class TestObject
{
}
public class TestObject2 extends TestObject
{
int a = 3;
}
public class TestObject3 extends TestObject2
{
int b = 4;
int c = 5;
}
내 주요 클래스 : java.SizeOf와
public class memoryTester
{
public static void main(String[] args) throws Throwable
{
TestObject object1 = new TestObject();
TestObject2 object2 = new TestObject2();
TestObject3 object3 = new TestObject3();
int sum = object2.a + object3.b + object3.c;
System.out.println(sum);
SizeOf.turnOnDebug();
System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(object1)));
System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(object2)));
System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(object3)));
}
}
() 내가 얻을 : VisualVM과 함께
{ test.TestObject
} size = 16.0b
16.0b
{ test.TestObject2
a = 3
} size = 16.0b
16.0b
{ test.TestObject3
b = 4
c = 5
} size = 24.0b
24.0b
내가 가진 :
this (Java frame) TestObject #1 16
this (Java frame) TestObject2 #1 20
this (Java frame) TestObject3 #1 28
문서화에 따르면 I 인터넷을 통해 읽으십시오, 저는 64 비트이기 때문에 16 바이트의 객체 헤더를 가지고 있습니다. 확인은 TestObject
입니다.
TestObject2
에 대해 정수 필드에 4 바이트를 더해야합니다. 다시 채우기의 4 바이트를 더해야합니다. TestObject2
에 대해 24 바이트의 총 크기를 제공해야합니다. 내가 잘못?
계속해서 TestObject3
에 대해 32 바이트를 제공해야하는 2 개의 정수 필드에 대해 8 바이트 더 추가해야합니다.
VisualVm은 패딩을 무시한 반면 java.sizeOf는 개체 헤더에 포함 된 것처럼 4 바이트를 놓친 것처럼 보입니다. 나는 동일한 결과를주는 4 개의 불린으로 정수를 대체 할 수있다.
질문 :
이유는이 두 가지 도구는 서로 다른 결과를?
패딩이 있어야합니까?
나는 또한 어딘가에 (나는 링크를 찾지 못했다) 클래스와 서브 클래스 사이에 패딩이있을 수 있다는 것을 읽었다. 맞습니까? 이 경우 클래스의 상속 된 트리에 메모리 오버 헤드가 발생할 수 있습니다.
마지막으로, Java가 수행하는 작업에 대해 자세히 설명한 Java 스펙/doc이 있습니까?
도움 주셔서 감사합니다.
업데이트 :
, 나는 부분은 내가 다음 후 열 "크기"를 체크 한 후 "클래스"에서는, 힙 덤프를 만들 VisualVM과의 개체의 크기를 얻기 위해, utapyngo의 의견에 답변을 열 "인스턴스". 오브젝트의 종류마다 1의 경우의 인스턴스 수.
나다니엘 포드 (Nathaniel Ford)의 의견에 대답하기 위해 각 fieds를 초기화 한 다음 내 메인 방법으로 간단한 파이를 사용했습니다. 결과는 바뀌지 않았습니다.
우리는 메모리 소비를 측정하는 방법에 대한 논리를 보지 않고 어느 것이 옳은지 알 길이 없습니다. –
필자의 경우 64 비트 Java 1.7.0-b147의 jvisualvm 1.7.0 (빌드 110325)은 16, 16 및 24를 제공합니다. visualvm으로 측정 할 때 어떤 방법을 사용합니까? – utapyngo
'a', b' 및'c' 회원 필드에 값을 지정하지 않으면 정확한 결과를 얻지 못할 수 있습니다. JVM의 기본 구현에서는 사용되지 않는 필드에 실제로 메모리를 할당 할 필요가 없으며 해당 필드에 대한 포인터를 보유 할 메모리 만 할당합니다. –