2013-02-24 6 views
5

클래스 Integer에는 Integer 값을 캐시하는 캐시가 있습니다. 따라서 메서드 valueOf을 사용하거나 inboxing을 사용하면 새 값이 인스턴스화되지 않고 캐시에서 가져옵니다.정수 캐시의 크기는 얼마입니까?

기본 캐시 크기는 127이지만 VM 설정으로 인해 확장 될 수 있음을 알고 있습니다. 내 질문입니다 : 얼마나 큰이 설정에서 캐시 크기의 기본값입니다 및이 값을 조작 할 수 있습니까? 이 값은 사용하는 VM (32 비트 또는 64 비트)에 따라 다릅니 까?

이제 레거시 코드를 조정 중이며 int에서 Integer로 변환해야 할 수도 있습니다.

명확한 설명 : 나는 자바 소스

private static class IntegerCache { 
    static final int low = -128; 
    static final int high; 
    static final Integer cache[]; 

    static { 
     // high value may be configured by property 
     int h = 127; 
     String integerCacheHighPropValue = 
      sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); 
     if (integerCacheHighPropValue != null) { 
      int i = parseInt(integerCacheHighPropValue); 
      i = Math.max(i, 127); 
      // Maximum array size is Integer.MAX_VALUE 
      h = Math.min(i, Integer.MAX_VALUE - (-low)); 
     } 
     high = h; 

     cache = new Integer[(high - low) + 1]; 
     int j = low; 
     for(int k = 0; k < cache.length; k++) 
      cache[k] = new Integer(j++); 
    } 

    private IntegerCache() {} 
} 

public static Integer valueOf(int i) { 
    assert IntegerCache.high >= 127; 
    if (i >= IntegerCache.low && i <= IntegerCache.high) 
     return IntegerCache.cache[i + (-IntegerCache.low)]; 
    return new Integer(i); 
} 

에서 발견 한 다음 코드는 그래서 캐시를 구성 할 수 있습니다 생각합니다. Javadoc 가입일

+2

자바 소스 코드입니다. VM 설정은이 설정과 아무 관련이 없습니다. –

+0

그것은 -128에서 +127까지입니다. vm에서 구성을 허용하지 않는 한 변경 될 수 있다고 생각하지 않습니다. – vikingsteve

+3

시스템 속성'java.lang.Integer.IntegerCache.high'를 사용하여 다른 한계를 설정할 수 있습니다. 그것은 모두 소스 코드에 있습니다. –

답변

11

내부 Java 구현으로 구성 할 수 없습니다. 범위는 에서 -128까지 127입니다. 당신은 Javadocs을 확인하거나 소스에서 좀 걸릴 수 있습니다 :

public static Integer valueOf(int i) { 
     final int offset = 128; 
     if (i >= -128 && i <= 127) { // must cache 
      return IntegerCache.cache[i + offset]; 
     } 
     return new Integer(i); 
} 

UPD를. 나는 입니다. (Marco Topolnik에게 thx). 위의 모든 것은 오래된 Java 구현과 관련됩니다. 를 들어 자바 7 구현은 시스템 속성을 달성 할 수있다 :

-Djava.lang.Integer.IntegerCache.high=<size> 

또는 JVM 설정 :

-XX:AutoBoxCacheMax=<size> 

UPD를. 2java.math.BigInteger에는 값에 대한 하드 코드 된 캐시가 있습니다. -16 < = x < = 16입니다. 소스 : + AggressiveOpts을 사용 : 자바 7의

private final static int MAX_CONSTANT = 16; 
    private static BigInteger posConst[] = new BigInteger[MAX_CONSTANT+1]; 
    private static BigInteger negConst[] = new BigInteger[MAX_CONSTANT+1]; 
    static { 
    for (int i = 1; i <= MAX_CONSTANT; i++) { 
     int[] magnitude = new int[1]; 
     magnitude[0] = i; 
     posConst[i] = new BigInteger(magnitude, 1); 
     negConst[i] = new BigInteger(magnitude, -1); 
    } 
    } 

    public static BigInteger valueOf(long val) { 
     // If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant 
     if (val == 0) 
      return ZERO; 
     if (val > 0 && val <= MAX_CONSTANT) 
      return posConst[(int) val]; 
     else if (val < 0 && val >= -MAX_CONSTANT) 
      return negConst[(int) -val]; 
     return new BigInteger(val); 
    } 
+0

[java.math.BigInteger] (http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html)와 유사한 캐시가 있습니까? – Pacerier

+0

네, 있습니다. 답변을 업데이트했습니다. – udalmik

1

:

공용 static 정수 valueOf (INT의 ⅰ)

지정된 int 값을 나타내는 정수 인스턴스를 반환. 새로운 Integer 인스턴스가 필요하지 않은 경우이 메서드는 일반적으로 자주 사용하는 값을 캐싱하여 이 훨씬 더 좋은 공간과 시간 성능을 제공 할 가능성이 있으므로이 생성자 Integer (int)보다 우선 사용되어야합니다. 이 메서드는 항상 값을 -128에서 127 범위에 포함하며이 범위 외의 다른 값 을 캐시 할 수 있습니다.

하지만 이것에 의존해서는 안되며, 이것에 대해서는 아무 것도 변경하지 마십시오. 이것은 구현에 영향을 미치지 않아야하는 JVM의 구현 세부 사항입니다.

+0

이 캐시를 사용하는 것이 좋지 않을 것이라고 생각하지만,이를 피하는 이유는 내 코드를 깨끗하게 유지하려는 것입니다. "구현 세부 사항"에 대한 귀하의 의견에 동의하지 않습니다. 이것은 구현 세부 사항이 아닙니다. Javadoc에 있다면, 바인딩이됩니다. 여러분은'-128'에서'127'까지 캐시 될 것이라고 안전하게 추측 할 수 있습니다 (추한 코드의 팬이라면). – Isaac

2

, 내가 오라클의 자바 문서에서 찾을 수 없습니다 것은 -XX 때 변경됩니다 정확히 무엇에 대한 설명입니다.그래서 aggressiveopts가 java 버전을 사용하는 실험실의 앱 서버에서 jvm 설정에 미치는 영향을 확인했습니다. {quote} java 버전 "1.7.0_15" Java (TM) SE 런타임 환경 (빌드 1.7.0_15-B03) {인용}

과정은 aggressiveopts와 장애인 자바를 실행하는 것입니다 : 자바를 -d64 -server -XX : -AggressiveOpts -XX : + UnlockDiagnosticVMOptions -XX : + PrintFlagsFinal -version

aggressiveopts를 사용하여 java를 실행하는 과정입니다. 이 활성화되었습니다. : 자바 -d64 -server -XX : + AggressiveOpts -XX : + UnlockDiagnosticVMOptions -XX : + PrintFlagsFinal -version

이 프로세스는 이러한 차이 제작 :

부울 AggressiveOpts 거짓 -> 진정한 {제품}

INTX AutoBoxCacheMax 128 -> 20,000 {C2} 제품

INTX BiasedLockingStartupDelay 4000 -> {500} 생성물 거짓

부울 EliminateAutoBox -> {사실 C2 진단}

관련 문제