본문 바로가기
컴퓨터/Java

[JVM] JVM(자바) 의 메모리 구조 - 스택과 힙 영역, 스택 프레임이 쌓이는 과정과 힙 영역에 객체가 생기는 과정

by 버니케이 2024. 12. 24.
반응형

 

if (list.get(i).getDataYN() == "Y") {
    dataSize++;
}

 

만약  코드를 보고 이상한걸 못느낀다면…
JVM 스택영역, 힙 영역에 어떤 데이터가 들어가는지 공부해야 한다.

 

 

JVM 의 실행

자바 프로그램이 실행되면 컴파일된 .class 를 실행엔진이 메서드영역에서 읽으면서

-> 스택영역에 순서대로 쌓으면서(스택 프레임 생성) 실행
 + 실행되는동안 객체/배열이 있으면 힙에 생성
  + 실행되는동안 가비지컬렉션이 힙 관리
-> 실행이 다 되면 순서대로 스택에서 나감

를 한다.

 

선요약

 

JVM  스택영역과  영역

public class Sample {
    // 인스턴스 필드
    int x = 10;
    String name1 = "홍길동";
    
    public void method1() {
        // 지역 변수
        int y = 20;
        String name2 = "홍길순";
    }
    
    public void method2(String a) {
        a = "d";
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.method1();
        sample.method2("a");
    }
}

 

main() 스택 프레임

 

자바 프로그램의 시작점은 main() 메소드이다.
그래서 스택 맨 처음에는 main() 메소드가 쌓인다.
이렇게 쌓인 블록 하나를 스택 프레임이라고 한다.

 

19번 줄을 보면 Sample 클래스에서 sample 객체가 생긴다.
sample 은 참조형이기 때문에 
스택 프레임에서는 주소값이 저장되고
힙에 실제 데이터가 저장된다.
------------------
인스턴스 변수:
    int x = 10;
    String name1 = "홍길동";

맨 위에 선언된 인스턴스 변수는 sample 인스턴스가 힙에 생성될 때 
같이 힙에 저장된다.
(추가로 "홍길동"은 문자열 리터럴 이다. 힙의 문자열 상수 풀에 저장된다. 이건 나중에 설명...)

 


 

method1() 스택 프레임

20번 줄에서 method1() 메소드가 호출되면서
method1() 스택 프레임이 쌓인다.

 

method1() 안에는 두개의 지역변수가 있다.
int y = 20; 은 
String name2 = "홍길순";
당연히 이 지역변수는 method1() 스택 프레임이 쌓일 때 생성되고, 프레임이 나갈 때 사라진다.(생명주기)

먼저 int y = 20;
int 는 참조형이 아니기 때문에 스택에 그대로 저장된다.
String name2 = "홍길순";
String 은 참조형이기 때문에 스택에는 name2=@주소값 이 저장되고
힙에 실제 데이터가 저장된다.



method2() 스택 프레임

21번 줄에서 method2("a") 메소드가 호출되면서 
method2() 스택 프레임이 쌓인다.
이때 "a" 라는 인자를 잘 봐야하는데...

 

 

method2() 에는 String a 라는 파라미터가 있다.
method2() 스택 프레임이 쌓이면서 String a = "a" 라는 코드가 호출이 되었다고 생각해야 한다.
파라미터의 String a 도 method2() 스택 프레임에 저장되는데,
참조형이기 때문에 a = @주소값 이 저장되고
힙에 실제 데이터가 저장된다.

 

 

a = "d"; 코드가 실행되면, "d"라는 String 객체가 생성된다. 
 a는 이 객체의 참조값을 가리키게 됨
정리하자면 
"a" 라는 데이터랑 "d" 라는 데이터가 각각 힙에 생기는거고 스택메모리에 있는 String a 는 "a" 를 가리켰다가 "d" 를 가리킴.

* 추가
코드 실행이 끝나면 위에서부터 차례로 스택 프레임에서 빠지면서 실행종료…
안쓰는 힙 객체/배열 상수풀은 가비지컬렉션이 없애버린다.

반응형

댓글