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 는 같 지 않 습 니 다.

좋은 웹페이지 즐겨찾기