티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
이번에는 자바의 원리에 대해 조금 더 알아보자.
자바는 프로그램 실행 시 메모리 관리를 어떻게 할까?
프로그램 실행 시, 자바의 각 요소들의 메모리 공간은 분리되어 관리된다.
이를 통해 자바는 굉장히 효율적이게 메모리를 관리하여 원활한 프로그램을 구동할 수 있도록 돕는다.
자바의 메모리 관리 영역은 3가지가 있다.
- 메서드 영역
- 스택 영역
- 힙 영역
각 영역에 어떤 요소들이 관리되는지 알아보자.
1. 메서드 영역 : 클래스정보를 보관한다.
클래스 정보에서도 3가지로 나누어볼 수 있다.
1. 실행 코드 : 클래스의 실행코드(바이트코드), 필드, 메서드, 생성자 코드 등 모든 실행코드가 존재한다.
2. static 영역 : 클래스 변수, 즉 static 변수들을 보관한다.
3. 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수들을 보관한다. ex) 1, "Hello java"
메서드 영역에서 중요한 건 , static 영역과 실행 코드 부분이다.
클래스에서는 멤버변수가 있었다.
이 멤버변수에서 static을 선언해 주면 Class 변수로 변하게 되는데, 이 Class 변수는 한 개의 Class에서 생성된 모든 객체가 하나의 변수메모리를 공유하게 된다.
객체가 새로 생성될 때마다 새로운 메모리 주소를 할당받는데, 변수 메모리를 공유하기에 Cs관점에서 이 방법이 유리할까?
나는 아니라고 생각한다.
그래서 프로그램을 처음 실행시킬 때, 메서드 영역에 static 변수( 클래스 변수) 들의 주솟값을 할당하여, 이곳에 접근하여 사용하는 것이 더 유리하다.
또한 실행코드 중, 메서드 실행코드 또한 메서드 영역에 보관된다.
public class Data {
String name;
int age;
Data data;
public void print() {
System.out.println("안녕 나는 메소드를 출력하는 메소드야");
}
}
만약 위와 객체를 생성한다고 가정해 보자.
Data라는 객체를 생성할 때마다 멤버 변수들의 값은 객체마다 다를 수 있기 때문에, 힙 영역에서 관리되는 게 맞다.
이 부분에 대해 한번 생각해 보자.
Data 객체를 몇 개를 생성해도 public void print()라는 메서드의 기능에 변동이 생기는가?
아니다.
메서드의 기능은 객체의 개수와 상관없이 고정적이다.
따라서 메서드는 프로그램 실행 시, 해당 메서드가 저장된 주소 값을 메모리 한 부분에 차지시키고, 뒤에 설명할 스택 영역에서 해당 메모리 주소만 참조하면 되는 것이다.
이렇게 하면 동일한 메서드를 메모리 여러 공간에 중첩시키지 않을 수 있어, 더욱 효율적으로 메모리를 관리할 수 있다.
2. 스택 영역 : 실제 프로그램이 실행되는 영역이다.
일단 스택 자료구조에 대해서 먼저 알아보자.
스택 자료구조는 LIFO (Last in First Out) 구조로 후입선출의 자료구조이다.
이제 스택영역에 대해 알아보자.
스택영역에는 메서드가 실행할 때마다 하나씩 스택 프레임이 쌓이게 된다.
각 스택 프레임에는 지역변수, 중간 연산결과, 메서드 호출정보 등을 포함한다.
메서드 호출정보를 스택 프레임에서 관리하며, 해당 메서드 호출 시, 메서드 영역에 접근하여 해당 메서드의 실행 주소값을 사용한다.
또한 메서드 종료 시 스택영역에 쌓이게 된 스택프레임을 지우며 비워진다.
이렇게 스택 영역에 모든 스택프레임이 사라지게 되면 프로그램은 종료가 된다.
각 Thread마다 스택 영역이 하나씩 존재한다. ( 사실 당연한 것임..)
3. 힙 영역 : 객체가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용하게 된다.
객체와 배열이 생성되는 영역이다. 전에 배운 Garbage Collection이 이루어지는 주 영역이며, 더 이상 참조되지 않는 인스턴스는 제거당한다.
이렇게 자바의 메모리 구조에 대해서 알아보았다.
오늘은 너무 졸려
내일은 static에 대해 자세히 알아보자
정리해 보자면
1. 메서드 영역에는 Class에 대한 정보들이 담겨있고
2. 객체를 생성하면 힙 영역에 해당 객체들에 대한 정보가 들어있다.
3. 메서드를 호출하면 힙영역에 대한 객체 정보가 스택 프레임 형태로 스택 영역에 적재되며 프로그램이 수행된다.
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 final (1) | 2025.02.08 |
---|---|
자바 static (1) | 2025.02.08 |
자바 접근제한자(Access Modifier) + 캡슐화(Encapsulation) (1) | 2025.02.07 |
자바 NullPointException (1) | 2025.02.05 |
자바 기본 형/참조 형 (+Garbage Collection) (0) | 2025.02.05 |
- Total
- Today
- Yesterday
- extends
- 백준 피보나치 수열
- 코딩테스트 준비
- Los
- 스프링
- 상품을 구매한 회원 비율 구하기 파이썬
- 백준
- 김영한 실전 자바 기본
- 프로그래머스
- los 15
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- 기술스택
- los 15단계
- 김영한 실전 자바 기초
- ys.k
- 백준 피보나치
- java
- zixem
- 김영한
- 상속
- lord of sql
- samron
- 코딩테스트
- webhacking.kr
- 김영한 실전 자바 중급
- 자바
- spring
- 프로그래머스 상품을 구매한 회원 비율 구하기
- static
- samron3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |