일반적으로 우리가 작성한 코드는 JVM에 의해 실행된다.
그럼 JVM 속에서 이 코드들은 어떻게 저장되고 어떻게 동작하는가?
CS 지식에서 단골 메뉴이다. 자바를 사용한다면 기본적으로 자바가 어떻게 동작하는지를 알고있어야 한다.
또한 안정적으로 프로그램을 개발하려고 한다면 이 구조를 역시 빼놓을수가 없다.
프로그램이 메모리를 사용하는 방식은 아래와 같다.
객체 지향 프로그래밍에서는 이 데이터 저장 영역을 다시 3개의 영역으로 나눠서 사용하게 되는데,
이 영역이 우리가 잘아는 Static, Stack, Heap 영역이다.
코드를 통해 우리가 작성한 코드가 어떻게 데이터 저장 영역에 저장되는지 확인해보자.
public class Start{
public static void main(String[] args){
System.out.println("hello world");
}
}
1. JRE(자바 실행 환경)이 main()메서드를 확인하고 main()메서드의 존재가 확인되면 JVM을 띄운다 (자바 가상 머신)
2. 이렇게 JVM이 띄워지면 먼저 java.lang 패키지를 영역의 Static 영역에 올린다.
(여기서 java.lang 패키지가 무엇이냐?)
JAVA 프로그래밍에 필요한 가장 기본적인 클래스들이 모여있는 패키지로 보통 우리가 패키지를 사용할 때 import를 이용해서 사용하고자 하는 패키지를 띄우는데, 이 lang 패키지는 import하지 않아도 자동으로 올려진다. (최상위 클래스)
3. 그 후 우리가 작성한 클래스인 Start 클래스도 Static 영역에 올라간다.
(프로그램 상의 모든 클래스를 스태틱 영역에 배치)
4. Start 클래스 속의 main() 메서드가 실행되려면 main() 메서드의 스택 프레임이 Stack 영역에 할당되어야 한다.
(책에서는 ({) 중괄호를 만나면 스택 프레임이 하나 생기고, } 이렇게 닫히면 스택 프레임이 종료된다고 언급)
5. 그 후 main()메서드의 인자인 args를 저장할 변수 공간을 스택 프레임의 하단에 확보하고, 그 후 위 코드에서 실행하고자 하는 구문이 실행된다.
이렇게 동작을 하게 되는데, 아까 위에서 언급한 것처럼 닫히는 중괄호를 만나면 main() 스택 프레임은 소멸된다.
Q: 그럼 과연 변수는 어떤 영역에 존재할까?
A : 변수는 모든 영역에 존재한다. why? -> 변수마다 각기 다른 목적을 가지니까!
지역변수는 스택 영역의 스택 프레임 속에서 존재하며 스택프레임이 사라지면 같이 사라진다 .
클래스 멤버 변수는 스태틱 영역에서 존재하며, JVM의 일생동안 같이 지낸다.
객체 멤버 변수는 힙 영역에 존재하며, GC의 의해 일생을 종료한다 (가비지 컬렉터)
정리해보자!!
Static 영역 | Stack 영역 | Heap 영역 |
- 패키지나 클래스 정보가 올라간다. (이 패키지나 클래스는 호출시에 올라감) - Static 영역에 자리잡으면 JVM와 생애를 같이함. - 클래스 멤버가 올라감, 위치에 상관하지 않고 어떤 곳에서나 접근이 가능함. |
- 중괄호 {, }에 의해 생성되고 종료됨 (스택 프레임) - 지역 변수는 이 곳에 자리 잡음 - 내부 스택 프레임에서 외부는 접근 가능하나 이 역은 성립 불가 - 스레드도 이 영역에 생긴다. |
- 생성된 인스턴스가 올라간다 - 객체 멤버 변수가 자리 잡는다 (참조 끊키면 GC에 의해 사라짐) - 객체와 배열은 참조를 통해 호출된다. |
참고 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해 (위키북스)
https://siyoon210.tistory.com/124
https://kephilab.tistory.com/35
https://coding-factory.tistory.com/827
'기술면접 관련 및 참고하기' 카테고리의 다른 글
HTTP는 뭔데요? ( CS 특강 - HTTP/HTTPS/통신 흐름, TLS/SSL 등) - 작성 중 (0) | 2022.11.25 |
---|---|
운영체제(Operating System) 프로세스(Process)와 쓰레드(Thread) - 우테코 Tech 내용 추가 (2022.12.02) (1) | 2022.11.19 |
크롤링(Crawling)과 스크래핑(Scraping)?? (0) | 2022.03.12 |
라이브러리? 프레임워크? what is that? (0) | 2022.03.06 |
Java와 C계열의 차이점 (0) | 2022.01.16 |