자바 프로그램은 힙(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 |