2010-06-07 3 views
2

나는 항상 배열 메모리 사용법에 관해 비슷한 질문을 게시하지만 이제는 좀 더 구체적인 질문을 올리고 싶다.java memory usage

  • 데이터 유형의 크기가 항상 다른 플랫폼 (리눅스/윈도우 32도 동일합니다 : 나는 몇 가지를 이해하지 못했다 http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

    :이 기사를 읽은 후

    /64 비트) ??? int는 항상 32 비트가 될까요?;

  • 내가 메모리 사용량을 계산할 때 자체에 참조 값 을 넣어야합니까? 객체가 인데 int 필드가 있다면 메모리는 12 (객체 헤더) + 4 참조 +4 (int 필드) + 3 (패딩) = 24 바이트가됩니다.
+0

아마도 이것이 당신에게 왜 그렇게 중요한지 설명해 줄 수 있습니까? – leonm

+0

오직 교훈적인 목적을 위해서. – xdevel2000

답변

1

int은 항상 32 비트입니다. 그러나 JVM 사양은 객체의 필드가 메모리에 연속적으로 저장되도록 요구하지 않습니다. 따라서 은 64 비트 JVM이 64 비트 경계에서 int 필드를 정렬 할 수 있습니다. (분명히 Sun 32 비트 JVM은 32 비트 경계에서 8 비트와 16 비트 필드를 정렬합니다!)

+0

그래서 모든 JVM 구현이 여분의 공간을 선택할 수 있다고 말할 수 있습니까? – xdevel2000

+0

아니, 우리는 그 말을 할 수 없습니다. 또는 적어도 각각의 테스트 없이는 테스트 할 수 없습니다. (예를 들어 OpenJDK 코드 기반을 기반으로 사람들이 자유롭게 개인 변형을 만들 수 있기 때문에 불가능합니다.) –

1

먼저, 예, intthe language specification에 따라 32 비트입니다.

개체의 일부가 아니기 때문에 (IMO) 클래스 자체의 메모리 사용량에 참조 자체를 포함하면 안됩니다. 특히, 동일한 객체에 대한 참조가 몇 개가 있는지 알지 못합니다. 객체가 서로 다른 10 개의 객체가 각각 참조를 저장하면 참조 비용을 10 번 지불하게됩니다. 그러나 저장하는 모든 항목의 비용을 계산할 때 참조를 고려해야합니다. 따라서 참조 인 필드가있는 클래스가 있으면 그 대신에 비용을 계산하십시오. (마찬가지로 스택 공간을 계산하는 경우 로컬 변수를 고려하십시오.)

+0

JLS가 정확한 비트 크기를 지정하지 않는다고 생각합니다. 지정된 값 범위는'int'가 적어도 ** 32 비트 폭이어야 함을 의미합니다. JLS 또는 JVM 사양의 어떤 것도 'int'는 메모리에서 4 바이트 만 사용해야한다고 지정하지 않습니다. –

+0

@Joachim : True - 필드 정렬로 인해 4 바이트 만 사용하더라도 더 많이 차지할 수 있습니다. 그러나 적어도 * 언어 수준에서는 4 바이트 값이라는 것을 알고 있어야합니다. * 항상 * 2^31 등으로 둘러 볼 것입니다. –