Integer Cache 에 대한 이해
2792 단어 Integer
1: int a = 1000, b = 1000;
2: System.out.println(a == b);
3: Integer c = 1000, d = 1000;
4: System.out.println(c == d);
5: Integer e = 100,h = 100;
6: System.out.println(e == h);
프로그램 을 실행 한 후에 출력 한 결 과 는 true false true 입 니 다. 이 결 과 를 보고 저 는 아무리 생각해 도 이해 가 되 지 않 습 니 다. 세 번 째 줄 은 다섯 번 째 줄 과 똑 같이 초기 화 되 었 는데 왜 결과 가 다 릅 니까? 그래서 답 을 찾 았 습 니 다.
원래 자바 언어 규범 에 따라 규범 에 부합 되 는 자바 구현 은 Integer 의 캐 시 를 적어도 [- 128, 127] 의 범 위 를 덮어 야 합 니 다.
Oracle / Sun JDK 6 을 사용 하고 server 모드 에서 - XX: AutoBoxCacheMax = NNN 인 자 를 사용 하면 Integer 의 자동 캐 시 구간 을 [- 128, NNN] 으로 설정 할 수 있 습 니 다.구간 의 하 계 를 - 128 에 고정 시 키 면 설정 할 수 없습니다.
client 모드 에서 이 매개 변 수 는 잘못 되 었 습 니 다.이 매개 변 수 는 server 모드 에 만 있 습 니 다. c2_globals.hpp 에서 기본 값 은 128 입 니 다.그러나 이 기본 값 은 기본 조건 에서 작 동 하지 않 습 니 다. 수 동 으로 값 을 설정 하거나 - XX: + AggressiveOpts 인 자 를 켜 야 작 동 합 니 다. - XX: + AggressiveOpts 시작 파 라 메 터 를 설정 하면 AutoBoxCacheMax 의 기본 값 이 20000 으로 변경 되 고 유효 합 니 다.
여기 서 sun jdk 의 server 모드 에서 - XX: AutoBoxCacheMax 라 는 매개 변 수 를 설정 하여 Integer 자동 캐 시 크기 를 확인 한 다음 client 모드 에서 이 매개 변 수 는 지원 되 지 않 지만 - XX: + AggressiveOpts 라 는 매개 변 수 를 사용 하여 Integer 의 자동 캐 시 크기 를 20000 으로 조정 할 수 있 습 니 다. 아래 JVM 구현 코드 를 보십시오.
// Aggressive optimization flags -XX:+AggressiveOpts
void Arguments::set_aggressive_opts_flags() {
#ifdef COMPILER2
if (AggressiveOpts || !FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
if (FLAG_IS_DEFAULT(EliminateAutoBox)) {
FLAG_SET_DEFAULT(EliminateAutoBox, true);
}
if (FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
FLAG_SET_DEFAULT(AutoBoxCacheMax, 20000);
}
// Feed the cache size setting into the JDK
char buffer[1024];
sprintf(buffer, "java.lang.Integer.IntegerCache.high=" INTX_FORMAT, AutoBoxCacheMax);
add_property(buffer);
}
// ...
#endif
}
그리고 코드 자체 로 돌아 갑 니 다. Integer e = 100, h = 100;여기 컴 파일 러 는 자동 으로 box 작업 을 도와 줄 것 입 니 다. 자동 포장 이란 Integer. value Of (int) 방법 을 호출 할 것 입 니 다.
또한 이 값 100 은 캐 시 영역 에 있 기 때문에 캐 시 내용 을 직접 읽 습 니 다.그러나 Integer c = 1000, d = 1000;1000 은 Integer 의 기본 캐 시 범위 보다 크기 때문에 c d 는 같 지 않 습 니 다.
동시에 테스트 가능: Integer e = 100, f = Integer. valueOf (100), e = = f 도 true 를 인쇄 합 니 다.
그러나. Integer h = 100, g = new Integer(100); g 는 Integer 대상 을 새로 만 들 었 기 때문에 h g 는 같 지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
cocos2d Lua 학습(一)ios에서 루아 함수 호출 및 전참 방법 lua 코드: 출력 결과: lua 호출 C++ 방법: add 함수: lua 코드: 출력 결과: 함수를 호출합니다. 함수를 호출하려면 다음 협의를 따르십시오. 우선, 호출할 함...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.