티스토리 뷰
밑에 링크를 보며 공부했습니다 :-)
☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)
자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모
inpa.tistory.com
자바의 구동 방식
JAVA 프로그램이 실행되면 1차 컴파일러에 의해 만들어진 바이트코드(.class)는 JVM(자바 가상 머신)이 2차 컴파일 하여 OS로부터 메모리를 할당 받고 관리하며 실행한다. JVM의 메모리 공간 (런타임 데이터 영역) 은 메소드(Static, Class) 영역, 스택 영역, 힙 영역으로 구분되며, 데이터 타입에 따라 각 영역에 나눠 할당 된다.
자바 변수의 종류
변수 명 | 선언 위치 | 설명 | |
클래스 변수 (= static 변수) |
클래스 영역 |
클래스 영역에서 static이 붙는 변수, 여러 객체에서 공통으로 사용하고 싶을 때 정의 생성 시기 : 클래스가 메모리에 올라갈 때 메소드 영역에 적재 |
|
인스턴스 변수 |
클래스 영역에서 static이 아닌 변수. 개별적인 저장 공간으로 객체 마다 다른 값 저장 가능 생성 시기 :인스턴스가 생성되었을 때 변수 명, 타입, 접근제어자 같은 메타데이터는메소드 영역에, 실제 변수 값은 힙 영역에 적재. |
||
지역 변수 | 메소드 영역 |
매소드 내에서 선언되고 수행이 끝나면 소멸되는 변수 |
생성 시기 : 위치하고 있는 메소드가 수행될 때 스택에 적재 |
매개 변수 | 메소드 호출 시 전달하는 값이 담긴 변수. |
📌 코드를 통한 예시
public class Main {
public static void main(String[] args) { //매게 변수
int num = 100; //지역 변수
Counter c1 = new Counter();
int c1_res = c1.get();
Counter c2 = new Counter();
int c2_res = c2.get();
}
}
public class Counter {
private int state = 0; //인스턴스 변수
public static int page = 100; //클래스 변수
public Counter() {
page++;
state = page;
}
public int get() {
return state + page;
}
}
💡 동작 방식
1. 해당 프로그램을 실행시키면 메소드 영역에는 main클래스, counter 클래스, 클래스 변수들이 적재된다.
2. Main 메소드가 실행되면 args, num (지역변수)들이 스택 영역에 적재된다.
3. counter 객체 c1이 초기화되면, 힙 영역에는 counter 객체가 생성되고, c1의 주소값은 해당 객체를 가리킨다.
또한 메소드 영역의 page 변수(클래스 변수)의 값이 변경되며, 해당 객체의 state 변수(인스턴스 변수)의 값도 변경된다.
4. c1.get()이 실행되면, 메소드 영역의 get() 메소드가 호출이 되고, 힙 영역에 있는 state 값과 메소드 영역에 있는 page값을 가져와 스택에 저장한다. (c1.state + Counter.page = 202)
5. c2 객체도 같은 방식이다.
1. 메소드 영역 (static 영역, class 영역, code 영역)
- JVM이 동작해서 클래스가 로딩이 될 때 생성.
- 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(static 변수), 상수(final), 생성자, 메소드 저장.
- 어느 곳에서나 접근이 가능하다.
- 프로그램 시작부터 종료까지 메모리에 남아있다.
- 그래서 static 데이터를 무분별하게 사용할 경우 메모리 부족 현상이 있을 수 있다 .
2. 스택 영역
- 메소드 내에서 정의하는 기본 자료형에 해당되는 지역 변수의 데이터 값이 저장.
- 스택 영역 안에 스택 프레임이 생기고 그 안에 메소드를 호출.
- 스택 프레임이란, 하나의 메소드에 필요한 메모리 덩어리를 의미한다. 해당 메소드의 지역 변수, 매게변수, 리턴 값이 있다.
- 기본 자료형 (int, double, byte, long, boolean) 해당되는 지역 변수, 매개 변수 데이터 값 이 저장.
- 메소드가 호출 될때 할당, 종료될 때 소멸. (스택프레임이 제거)
3. 힙 영역 (객체 저장)
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시동적으로 할당하여 사용하는 영역
- 참조형 데이터 타입 : 객체(인스턴스), 배열이 저장.
- 단 힙 영역에 있는 오브젝트들을 가르키는 레퍼런스 변수(참조 변수)는 스택 영역에 적재.
- 힙 영역은 스택 영역과 다르게 보관되는 메모리가 호출이 끝나도 삭제되지 않고 유지되며,
- 어떠한 참조변수도 힙 영역에 있는 인스턴스를 참조하지 않으면 GC(가비지 컬렉터)에 의해 청소된다.
- 스택은 스레드 개수마다 각각 생성되나, 힙은 몇개의 스레드가 존재하든 단 하나의 힙만 존재.
'백엔드 공부하기 > TIL' 카테고리의 다른 글
230801 TIL : 업캐스팅의 이유, 템플릿 메소드, 프레임워크와 라이브러리의 차이 (0) | 2023.08.01 |
---|---|
230731 TIL : JAVA에서의 상속, 다형성 정리 (0) | 2023.07.31 |
230727 TIL : 싱글톤 패턴 (0) | 2023.07.27 |
230726 TIL : JAVA 생성자, 오버로딩, 생성자 메서드 (0) | 2023.07.26 |
230724 TIL : JAVA의 객체, 메소드, static 이론 문제 (0) | 2023.07.24 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 야놀자
- springboot
- 커리어멘토링
- 백준
- 카카오API
- 패스트캠퍼스강의
- 프로젝트후기
- 그룹스터디
- 야놀자X패스트캠퍼스부트캠프
- 그룹스터디워크샵
- 국비지원취업
- Java
- 백엔드부트캠프
- boj
- TiL
- qjzl
- 백엔드개발자
- 데이터베이스
- 부트캠프
- 자료구조
- 국비지원
- 국비지원캠프
- be
- #국비지원취업
- 스터디후기
- 패스트캠퍼스
- 채팅기능개발
- 과정중간회고
- 백엔드
- 자료구조 #스택 #큐 #덱 #선형자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함