JVM은 System.InderityHashCode ()가 절대 변경되지 않도록 어떻게 보장합니까?

StackOverflow https://stackoverflow.com/questions/1063068

문제

일반적으로 기본 구현 Object.hashCode() 메모리에있는 객체의 할당 된 주소의 일부 기능 (이것은 의무화되지는 않지만 JLS). VM이 메모리에서 물체를 분로시키는 것을 감안할 때, 왜 값이 System.identityHashCode() 물체의 수명 동안 절대 변하지 않습니까?

"원샷"계산 인 경우 (개체의 hashCode 한 번 계산하고 객체 헤더 또는 무언가에 숨겨져 있습니다. identityHashCode (메모리의 동일한 주소로 처음 할당 된 경우)?

도움이 되었습니까?

해결책

최신 JVMS 객체 헤더의 값을 저장합니다. 값은 객체 할당에 소비 된 시간을 최소 (때로는 수십주기까지 낮음)로 유지하기 위해 일반적으로 첫 번째 사용 만 계산된다고 생각합니다. Common Sun JVM을 컴파일하여 ID 해시 코드가 항상 모든 객체에 대해 1이되도록 컴파일 할 수 있습니다.

여러 객체는 동일한 ID 해시 코드를 가질 수 있습니다. 그것이 해시 코드의 특성입니다.

다른 팁

구현에 관계없이 두 번째 질문에 대한 답변으로 여러 객체가 동일한 IdentityHashCode를 가질 수 있습니다.

보다 버그 6321873 Javadoc의 문구에 대한 간단한 토론과 비 유성을 보여주는 프로그램.

핫스팟에서 객체의 헤더는 클래스 포인터와 "마크"단어로 구성됩니다.

마크 워드에 대한 데이터 구조의 소스 코드를 찾을 수 있습니다. markOop.hpp 파일. 이 파일에는 마크 단어의 메모리 레이아웃을 설명하는 주석이 있습니다.

hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)

여기서 우리는 32 비트 시스템의 일반 Java 객체에 대한 Identity Hash 코드가 Mark Word에 저장되고 길이가 25 비트임을 알 수 있습니다.

해싱 함수 구현을위한 일반적인 지침은 다음과 같습니다.

  • 동일한 객체가 일관된 해시 코드를 반환해야합니다, 시간에 따라 변경되지 않거나 변수 정보에 의존해서는 안됩니다 (예 : 무작위 숫자 또는 변한 멤버 필드의 값으로 시드 된 알고리즘.
  • 해시 함수에는 a가 있어야합니다 좋은 무작위 분포, 그리고 해시 코드를 버킷으로 간주하면 2 개의 물체가 가능한 한 다른 버킷 (해시 코드)에 매핑되어야합니다. 2 개의 객체가 동일한 해시 코드를 가질 가능성은 드물어야합니다. ~할 수 있다 일어나다.

내가 아는 한, 이것은 참조를 반환하기 위해 구현되며, 수명은 결코 바뀌지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top