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. 검증
- 부하를 넣을 때 0부터가 아니라 128부터 넣으면 정확히 부하를 투입한만큼 인스턴스가 증가하는 것을 확인했다.
- 만약 1000개 투입 시 128부터 1127까지 넣으면 인스턴스 1000개 증가
- 만약 1000개 투입 시 127부터 1126까지 넣으면 인스턴스 999개 증가