programing tip

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

itbloger 2020. 11. 9. 07:54
반응형

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


일반적으로의 기본 구현은 Object.hashCode()메모리에있는 객체의 할당 된 주소의 일부 기능입니다 (이는 JLS에서 요구하지 않음 ). VM이 메모리에서 개체를 분로한다는 점을 감안할 때에서 반환 된 값 System.identityHashCode()이 개체 수명 동안 변경 되지 않는 이유는 무엇입니까?

" hashCode일회성 "계산 인 경우 (객체 가 한 번 계산되고 객체 헤더 등에 숨겨져 있음) 두 객체가 동일한 것을 가질 수 있음을 의미합니까 identityHashCode(만약 처음에 할당 된 경우) 메모리의 동일한 주소)?


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

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


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

javadoc의 용어에 대한 간단한 토론과 비고 유성을 보여주는 프로그램 버그 6321873참조하십시오 .


HotSpot에있는 개체의 헤더는 클래스 포인터와 "마크"단어로 구성됩니다.

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

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

여기에서 32 비트 시스템의 일반 Java 객체에 대한 식별 해시 코드가 마크 워드에 저장되고 길이가 25 비트임을 알 수 있습니다.


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

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

내가 아는 한, 이것은 객체 수명에서 절대 변경되지 않는 참조를 반환하도록 구현되었습니다.

참고 URL : https://stackoverflow.com/questions/1063068/how-does-the-jvm-ensure-that-system-identityhashcode-will-never-change

반응형