| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 예외
- Spring API
- jenkins
- tag
- 카카오인증토큰받기
- Interface
- 백엔드공부
- ci/cd
- 인스턴스
- static
- form
- spring
- 백엔드 로드맵
- oAuth2
- feignClient
- 카카오인가코드받기
- MIND 2023 #후기
- 엔티티 매니저
- input
- Docker
- 엔티티 생명주기
- 어떤 개발자?
- GitHub_Actions
- 제로베이스
- 상속
- button
- 카카오사용자정보가져오기
- 백엔드스쿨
- html
- Java
- Today
- Total
HiDevelop
[Java] JVM의 메모리 관리 본문
JVM은 OS가 할당해 주는 메모리 공간을 기반으로 자기자신과 자바응용프로그램의 실행을 돕습니다. JVM은 메모리 공간을 효율적으로 사용하기 위해 데이터 특성에 따라 분류해서 저장합니다. JVM은 메소드, 스택, 힙 영역으로 메모리를 나눕니다.
- 메소드 : 메소드의 바이트코드, static 변수
- 스택 : 지역변수, 매개변수
- 힙 : 인스턴스
* 자바 바이트 코드 : 소스파일을 컴파일 할 때 생성되는, JVM에의해 실행이 가능한 코드
- 메소드 영역
메소드 영역에 저장되는 데이터는 클래스를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 공간입니다. 주로 메소드의 바이트 코드와 static 변수가 저장됩니다.
- 그럼 static 메소드는?, 다른 바이트 코드들은 저장되지 않는 걸까요?
프로그램의 대부분은 메소드내에서 인스턴스 생성과 다른작업을 하기 때문에 메소드 바이트 코드를 메모리 공간에 올리는 것은 대부분의 바이트 코드를 올리는 것과 같습니다.
- 스택 영역
스택은 메소드내에서 유효한 데이터가 저장되는 공간입니다. 지역 변수와 매개변수가 저장됩니다. 지역변수와 매개변수가 선언되는 순간 스택영역이 할당되고, 메소드의 실행이 완료되면 스택에서 소멸됩니다.
다음과 같은 코드가 있으면, main 문이 실행되면서 지역변수인 a,b 선언된 순간에 a,b가 main의 스택영역이 할당되고 show메소드가 호출되면서 매개변수 c가 선언된 순가 c가 show의 스택영역에 할당이 됩니다. 그 다음 메소드가 종료되면 할당된 스택영역이 소멸됩니다!
public void show(int c){...}
public static void main(String[] args){
int a = 3, b = 4;
show(a);
}

- 힙 영역
힙 영역에는 인스턴스가 저장됩니다. 그 이유는? 인스턴스의 생성시점과 소멸시점에 관련이 있습니다.
String str = new String("I LOVE YOU");
다음 문장을 실행했을 때 다음 그림과 같이

참조변수는 스택에 인스턴스는 힙 영역에 저장됩니다. 이 때 str = null을 참조하게 한다면, JVM은 어떤 참조변수도 참조하지 않은 인스턴스를 인식하게 되고 해당 인스턴스를 프로그램이 효율적으로 돌아갈 수 있는 타이밍에 소멸시킵니다. 이러한 기능을 가비지 컬렉션이라고 합니다!
책에서 배운내용을 저가 기억하기 쉽게 정리한 글입니다!
'Java' 카테고리의 다른 글
| [Java]Generics (0) | 2022.03.01 |
|---|---|
| [Java] Object 클래스의 Clone 메소드 (0) | 2022.02.18 |
| [Java] 다시 정리하는 예외 (0) | 2022.02.11 |
| [Java] Local Class & Anonymous 클래스 (0) | 2022.02.07 |
| [Java] Inner && Outer Class (0) | 2022.02.06 |