1. 개요

자바의 Integer 상수 풀


2. 내용

jmap을 통해 Integer 인스턴스의 메모리 변화를 모니터링하던 중 이상한 점을 발견하였다.

  인스턴스수 바이트 인스턴스 중가 바이트 증가 개당 바이트
Tomcat 시작시점 372 5952      
Integer 1000개 ( 0 ~ 999) 투입 1245 19920 873 13968 16
Integer 2000개 ( 0 ~ 1999) 투입 3117 49872 1872 29952 16
Integer 3000개 ( 0 ~ 2999) 투입 5989 95824 2872 45952 16
Integer 4000개 ( 0 ~ 3999) 투입 9861 157776 3872 61952 16
Integer 5000개 ( 0 ~ 4999) 투입 14733 235728 4872 77952 16
Integer 6000개 ( 0 ~ 5999) 투입 20605 329680 5872 93952 16
Integer 7000개 ( 0 ~ 6999) 투입 27477 439632 6872 109952 16
Integer 8000개 ( 0 ~ 7999) 투입 35349 565584 7872 125952 16
Integer 9000개 ( 0 ~ 8999) 투입 44221 707536 8872 141952 16
Integer 10000개 ( 0 ~ 9999) 투입 54093 865488 9872 157952 16

 

(테스트는 Static ArrayList에 add하는 방식으로 진행)

부하를 투입할 때 인스턴스가 꼭 128개만큼 부족하다. 예를 들어 5000개를 넣으면 4872개만 들어간다. (단 1000개 넣었을 때 873개가 증가한 것은 정확히 모르겠지만 기록하는 사이에 1개 더 증가한 것으로 추정)


3. 원인

https://dzone.com/articles/the-internal-cache-of-integers


4. 검증

  1. 부하를 넣을 때 0부터가 아니라 128부터 넣으면 정확히 부하를 투입한만큼 인스턴스가 증가하는 것을 확인했다.
  2. 만약 1000개 투입 시 128부터 1127까지 넣으면 인스턴스 1000개 증가
  3. 만약 1000개 투입 시 127부터 1126까지 넣으면 인스턴스 999개 증가