BE/Java

[Java] 메모리 계산

baek-dev 2024. 11. 30. 18:12

자바 프로그램은 힙(heap)과 스택(stack)영역에서 메모리를 관리한다.

 

기본 데이터 타입 메모리 크기

데이터 타입 크기 (바이트) 비고
`byte` 1 -128 ~ 127
`short` 2 -32,768 ~ 32,767
`int` 4 -2³¹ ~ 2³¹-1
`long` 8 -2⁶³ ~ 2⁶³-1
`float` 4 32비트 IEEE 754 부동소수점
`double` 8 64비트 IEEE 754 부동소수점
`char` 2 16비트 유니코드 문자
`boolean` 일반적으로 1바이트 JVM에 따라 다름

 


참조 데이터 타입 메모리 크기

참조형 타입은 힙 메모리에 저장된다.

1. 객체 자체 (헤더 포함) : JVM구현에 따라 다르지만 일반적으로 객체 헤더는 12~16바이트를 차지한다.

2. 인스턴스 변수 : 포함된 모든 인스턴스 변수의 크기를 합산.

3. 패딩 : JVM은 메모리 정렬을 위해 8바이트 단위로 패딩을 추가할 수 있다.

4. 참조 변수 : 객체의 참조 변수 크기는 JVM의 아킽텍처에 따라 다르다.

  • 32비트 JVM : 4바이트
  • 64비트 JVM : 8바이트

Example

public class Example {
	int x;		// 4바이트
	double y;	// 8바이트
}
  • 객체 헤더 : 12바이트
  • `int x` : 4바이트
  • `double y` : 8바이트
  • 패딩: 4바이트 (총 크기를 8의 배수로 만들기 위해서)
  • 총 메모리 사용량 : 12 + 4 + 8 + 4 = 24바이트

배열 메모리 크기

배열의 크기는 배열 헤더 + 각 요소 크기 * 배열 길이 로 계산 된다.

 

Example

int[] arr = new int[5];
  • 배열 헤더 : 12바이트
  • 각 요소 크기 : 4바이트 (`int`)
  • 요수 갯수 : 5개
  • 총 메모리 사용량 : 12 + 4 * 5 = 32바이트 (패딩 포함)

문자열의 메모리 크기

자바의 `String`은 참조 타입으로 내부적으로 `char[]`배열과 기타 메타데이터를 포함한다.

  • `String` 객체 헤더 : 12~16바이트
  • 내부 `char[]` 배열 : 12바이트(헤더) + 2 * 문자열 길이
  • 기타 메타데이터 (예: `hashCode`) : 4바이트

Example

String str = "Hello";
  • `String` 객체 헤더 : 16바이트
  • `char[]` 배열 헤더 : 12바이트
  • `char[]` 데이터 : 2 * 5 = 10 바이트
  • 패딩 : 총 크기를 8의 배수로 맞추기위해 2바이트 추가
  • 총 메모리 사용량 : 16 + 12 + 10 + 2 = 40바이트

JVM 메모리 영역

자바프로그램은 JVM의 주요 메모리 영역에서 실행된다.

  • 힙 메모리 : 객체와 배열이 저장되는 영역
  • 스택 메모리 : 메서드 호출과 지역 변수 저장
  • 메서드 영역 : 클래스 메타데이터, 상수 풀 등이 저장
  • PC 레지스터 및 네이티브 메모리 : 쓰레드 관련 데이터와 네이티브 코드 실행을 위한 메모리

메모리 계산 예제

public class Test {
    int a;
    double b;
    String name;
    
    public static void main(String[] args) {
    	Test obj = new Test();
        obj.name = "Java";
    }
}
  • 객체 헤더 : 16바이트
  • `int a` : 4바이트
  • `double b` : 8바이트
  • `String name` : 8바이트
  • 패딩 : 4바이트
  • Test객체 총 메모리 사용량 : 16 + 4 + 8 + 8 + 4 = 40

`String name`이 참조하는 문자열 `"Java"` 는 추가로 계산.

  • `String` 객체 : 16바이트
  • 참초변수 `char[]` : 8바이트
  • 기타 메타데이터 (hashCode 등) : 4바이트
  • 패딩 : 4바이트
  • `String`객체 크기 : 16 + 8 + 4 + 4 = 32바이트
  • `char[]` 배열 : 12(배열 헤더) + 2 * 4 + 4(패딩) = 24바이트
  • `"Java"` 문자열 총 메모리 : 32 + 24 = 56바이트
  • 총 메모리 사용량 : 40 + 56 = 96바이트

메모리 사용 최적화 팁

1. 불필요한 객체 생성을 피한다.

2. `String`대신 `StringBuilder`또는 `StringBuffer`를 사용해 문자열 연결을 최적화 한다.

3. 컬렉션 프레임워크에서 초기 크기를 적절히 설정한다.

4. 자바 가비지컬렉터(GC)동작을 이해하고 메모리 관리를 신경쓴다.

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] 캐스팅 (형 변환)  (0) 2024.12.01
[Java] abstract와 interface  (0) 2024.11.30
[Java] 접근 제어자  (0) 2024.11.30
[Java] static  (0) 2024.11.30
[Java] 변수  (0) 2024.11.30