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 개의 객체가 동일한 해시 코드를 가질 가능성은 드물지만 발생할 수 있습니다 .
내가 아는 한, 이것은 객체 수명에서 절대 변경되지 않는 참조를 반환하도록 구현되었습니다.
'programing tip' 카테고리의 다른 글
"Xcode에서이 장을 플레이 그라운드로 여는"방법은 무엇입니까? (0) | 2020.11.09 |
---|---|
스크롤 할 때 페이드 인되는 Google Play와 같은 ActionBar를 만드는 방법 (0) | 2020.11.09 |
Maven과의 통합 테스트에 대한 모범 사례? (0) | 2020.11.09 |
OpenGL이 라디안 대신 각도를 사용하는 이유는 무엇입니까? (0) | 2020.11.09 |
종속성이있는 동적 라이브러리와 연결 (0) | 2020.11.09 |