2012-04-29 4 views
6

int vs Integer, long vs Long, 빈 클래스 인스턴스 대 long 값의 성능을 비교 한 벤치 마크를 수행했습니다.빈 개체/클래스 인스턴스의 경우 28 바이트?

그리고 내가 나 자신을 대답 할 수없는 몇 가지 질문이 있습니다

    빈 클래스 또는 객체의 인스턴스화가 28 바이트 소요 이유
  1. ?
  2. Long 객체의 인스턴스화는 29 바이트, 기본 long 8 바이트를 차지하므로 빈 클래스와의 차이가 1 바이트 만인 이유는 무엇입니까? JVM은 어떤 종류의 최적화를하고 있습니까?

나는 맥 OS에 JDK1.6.0_30을 사용하고, 코드는 답변을

감사합니다 (당신이 전체 프로젝트를 체크 아웃 할 수 있습니다) https://github.com/mousator/benchmarks/blob/master/src/sk/emandem/michal/AutoboxingTypeBenchmark.java 에서 확인할 수 있습니다!

답변

2
  1. 저는 메모리 측정 기술을 신뢰하지 않습니다. runtime.gc()으로 전화하면 반드시 아무 것도하지 않습니다. MemoryMeasurer과 같은 도구를 사용하십시오.
  2. 배열의 오버 헤드가 발생합니다. 일반적으로 12 바이트 정도입니다. 오브젝트 헤더에 8 개, 배열 길이에 4 개, 그리고 참조 용으로 배열 항목 당 4 바이트. (32 비트 VM에 해당합니다.)
+0

답장 @Louis. 나는 MemoryMeasurer를 시도했다. 빈 클래스를 위해서 나는 20 바이트를 가지므로 배열 포인터와 4 바이트를 인스턴스로 사용한다. (16 비트는 이상하지만). 그러나 Runtime 메서드는 매우 안정적인 측정을 생성하므로 흥미 롭습니다. "GC 호출, 메모리 측정, 호출 코드, 메모리 측정, GC 호출"시퀀스 반복 반복은 같은 값을 얻습니다. 런타임과 MemoryMeasurer 사용 사이의 유일한 차이점은 빈 클래스와 int 래퍼 (모두 25B와 20B)입니다. – mousator

+0

Enter 키를 누를 때마다 .. 다음 질문은 20 또는 25B를 사용하여 예상 할 수 있습니까? – mousator

+0

어. 나는 그것에 의존하지 않을 것이다. 단지 그것을 시도하고 볼 수있는 훨씬 더 간단합니다. –

관련 문제