수학 시간에 배운 분산
위 처럼 naive한 방식으로는 1억개 데이터의 분산을 구하려면 1억개의 데이터를 리스트로 보관해야한다.
OpenJDK 기준으로 Long 타입의 메모리 크기
OpenJDK의 HotSpot JVM을 기준으로
java.lang.Long객체는 다음과 같은 메모리 구조를 가집니다.
메모리 구성:
- 객체 헤더 (Object Header): 12 바이트
- 마크 단어 (Mark Word): 8 바이트
- 클래스 포인터 (Class Pointer): 4 바이트 (compressed oops 사용 시)
- 필드 (long 값): 8 바이트
- 패딩 (Padding): 4 바이트
JVM은 객체 크기를 8바이트 단위로 정렬하므로, 총합이 20 바이트인 경우 4바이트의 패딩이 추가되어 24 바이트가 됩니다.
총 메모리 크기: 24 바이트
계산 방식:
- 객체 헤더: 12 바이트
- long 필드: 8 바이트
- 패딩: 4 바이트
- 합계: 12 + 8 + 4 = 24 바이트
추가 정보:
Compressed OOPs:
64비트 JVM에서 객체 참조를 압축하여 메모리 사용량을 줄이는 기술입니다. 이를 사용하면 클래스 포인터의 크기가 줄어들어 메모리 효율이 향상됩니다.
메모리 정렬:
JVM은 객체의 메모리 정렬을 최적화하기 위해 8바이트 단위로 패딩을 추가합니다. 이는 메모리 접근 속도를 향상시키기 위한 목적입니다.
Welford's Online Algorithm 을 사용한다.