Integer, Long caching

Integer, Long 뿐만 아니라 이 외의 Wrapper Class에 존재하는 기능으로 정해진 범위의 값에 한해서 캐싱되는 기능을 말한다. 여기에서 캐싱이란 값 저장 시 인스턴스를 생성하지 않고 미리 저장 돼있는 값을 사용한다는 뜻으로 특정 범위내의 값 (Integer의 경우 -127 ~ 128)에 대해서는 인스턴스를 생성하지 않음으로써 속도 등 성능 등에 이점을 가진다.

//Integer i = 1;이 동작하는 과정, Cache 클래스는 Wrapper 타입마다 존재한다.
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

간단하게 말하면 -127에서 128까지의 값은 일일이 저장돼 (low, high)있고, 이 범위 내의 값에 대해선 인스턴스를 생성하지 않고 저장된 값을 불러와 사용하는 것이다. 그러므로 범위 내 값은 모두 같은 인스턴스이다.

따라서 이 캐싱기능에 주의하여 사용하여야 한다.

예제 코드의 결과에 대해 생각해보자.

예제

Integer a = 1000;
Integer b = 1000;

if(a == b)
	System.out.println("a == b");
else
	System.out.pintln("a != b");

결과

a != b


GC 종류 알아보기

GC란?

Garbage Collector 종류

Garbarge Collector는 스레드 방식과 사용 되는 Garbage Collection Algorithm에 따라 종류가 결정 된다.

Serial Garbage Collector

  • 가장 원시적 방식의 GC로, 싱글 스레드로 동작
  • Young Generation : Generational algorithm/ Old Generation : Mark and Compaction algorithm
  • 싱글스레드로 동작하기 때문에 성능이 좋지 않고, 지연시간이 기므로 운영서버에서는 사용 불가하다.

Parallel Garbage Collector

  • Java 8의 기본 GC
  • Serial GC와 기본적 알고리즘은 동일, 여러개의 스레드로 GC 처리

Parallel Old Garbage Collector

  • Parallel GC에서 Old Generation의 알고리즘만 다르다.
  • GC를 수행한 영역에 대해 별도로 살아있는 객체를 식별하는 Mark-Summary-Compaction 단계를 거친다. Mark-Sweep-Compaction이 Sweep 단계와는 다르고, 더 복잡하다.

CMS Garbage Collector

  • Current Mark-and-Sweep Garbarge Collector
  • 사용하고 싶다면 자바 버전을 잘 확인하여 사용 (Revmoved in java 14, Deprecated on java 9)
  • 순서
    1. Initial mark : 클래스로더에서 가장 가까운 객체 중 살아있는 객체만 찾아 마킹한다.
    2. Concurrent mark : 1에서 확인한 객에서 참조하고 있는 객체를 따라가며 마킹한다. (스레드 동시 진행)
    3. Remark : 2에서 추가되거나 참조가 끊긴 객체를 확인하여 마킹한다.
    4. Concurrent sweep : GC를 실행 (스레드 동시 진행) - 마킹한 객체를 sweep
  • 해당 GC는 기존 GC들의 단점인 긴 STW(Stop The Wolrd)을 개선했다는 장점이 있지만, CPU 사용량이 크고 Compaction 단계가 기본적으로 제공되지 않아 단편화 발생을 야기시킨다는 단점이 있다. (Sweep 후 Compaction지 않으면 메모리 공간이 조각남으로써 시간이 지날수록 객체 생성에 문제가 생긴다)

G1 Garbage Collector

Z Garbage Collector


web server vs WAS


부동소수점 오류/대체사용가능한 클래스


generic runtime 타입 정보 날아가는 이유


runtime type eraser


Collection 시간복잡도(list, set, tree)


android jit aot

profile
👩‍💻

0개의 댓글

Powered by GraphCDN, the GraphQL CDN