철갑이의 이모저모

[java] java 메모리 구조 본문

java

[java] java 메모리 구조

철갑 2021. 5. 25. 22:31
728x90

기본타입과 참조타입

기본타입의 변수는 실제 값을 변수 안에 저장하지만, 참조타입의 변수는 메모리의 번지를 변수 안에 저장한다.

// 기본타입
int x = 1;
double y = 3.14;

// 참조타입
String z = "참조";
String r = "영역";

 위 그림과 같이 기본 타입(int, double)의 변수의 경우 스택영역에 직접 값을 저장하고 있지만, 참조타입의 경우에는 힙 영역의 객체 번지 값을 가지고 있다. 이처럼 번지를 통해 객체를 참조하기 때문에 참조 타입 라고 부른다.

메모리 사용 영역

1. 메소드 영역

- JVM이 시작할때 생성되고 모든 스레드가 공유하는 영역이다. 메소드 영역에는 클래스에 대한 정보가 저장이 된다. 코드에 사용되는 클래스들을 클래스 로더로 읽어 정적필드, 상수, 메소드코드. 생성자 코드 등 분류해서 저장한다.

2. 힙 영역

- 객체와 배열이 생성되는 영역이다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. 힙 영역에서 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.  참조하는 변수나 필드가 없다면 JVM이 Garbage Collecter를 실행시켜 자동으로 제거한다. 

3. 스택영역

- 메소드를 호출시 프레임을 추가(push)하고 메서드가 종료되면 해당 프레임을 제거(pop)한다. 스택영역은 LIFO 방식에 따라 동작한다. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

String 타입

java는 문자열 리터럴이 동일하다면 String 객체를 공유하고록 되어있음. 때문에 리터럴로 생성하는 방법과 new 연산자로 생성하는 방법에 따라 비교 연산자의 결과가 달라질 수 있다.

리터럴로 생성시 동일한 객체를 참조
new 연산자로 생성시 다른 객체를 참조

String var1 = "햄스터";
String var2 = "햄스터";
		
String var3 = new String("햄스터");
String var4 = new String("햄스터");
		
if(var1 == var2) {
	System.out.println("참조가 같음");
}else {
	System.out.println("참조가 다름");
} // 참조가 같음
		
if(var1.equals(var2)) {
	System.out.println("문자열이 같음");
} // 문자열이 같음
		
if(var3 == var4) {
	System.out.println("참조가 같음");
}else {
	System.out.println("참조가 다름");
} //참조가 다름
		
if(var3.equals(var4)) {
	System.out.println("문자열이 같음");
} //문자열이 같음
728x90

'java' 카테고리의 다른 글

[java] 멀티 스레드 - (1) 작업 스레드 생성과 실행  (0) 2023.07.05
[java] 클래스와 객체  (0) 2021.06.01