학습 목표
우리가 자바를 배우는 동안 실습에만 중심을 뒀었지 컴퓨터 내부적으로 JRE는 어떻게 돌아가고 JVM은 어디서 실행되며, JDK는 왜 쓰이는지에 대해서 학습할 비중이 매우 적었다. 이제 제대로 한 번 알아 보고, 프로그램이 어떻게 메모리에 적재되며 어떤 데이터가 어떤 메모리에 올라갈 지를 학습해 보는게 폭표이다.
JRE와 JVM이란 뭘까?
JVM (Java Virtual Machine) 과 JRE (Java Runtime Environment) 추가적으로 JDK (Java Development kit) 까지. 해당 의미를 정확히는 몰라도 Java 개발자라면 한 번쯤 들어봤을 것이다.
이는 각각
- JVM : 자바 소프트웨어 개발 도구
- JRE : 자바용 OS
- JDK : 가상 PC
을 의미한다고 알고 있는데 이는 다 플랫폼 독립적인 자바의 특성에서 부터 시작된다는 것일 모두가 알 고 있을 것이다.
이 JVM과 JRE에 대한 뜻은 알게 됐으나 정확한 사용법을 알고 싶지만 한 가지 더 알아야 하므로 잠시만 기다리자.
메모리 구조
JRE와 JVM이 사용되는 방법에 대해서 이해하려면 첫 번째로 먼저 메모리의 구조에 대해서 알아야 한다.
메모리 구조에는 크게 2가지의 구조가 존재한다.
-
코드 실행 영역
-
데이터 영역
이렇게 두 가지에서 데이터 영역은 또 3가지로 세분화 되는데
- 스태틱 영역
- 스택 영역
- 힙 영역
그렇다면 아마 다음과 같은 구조를 갖게 될 것이다.
이렇게 세분화된 세 영역에서 각자 하는 일을 부여한다면
- 스태틱 영역 : 클래스의 활동 영역
- 스택 영역 : 메서드의 활동 영역
- 힙 영역 : 변수 및 임시 변수들의 활동 영역
그렇다면 JRE와 JVM은 어떻게 쓰일까?
예를 들어 우리가 이러한 Java 코드를 수행한다고 해보자.
public class Post01 {
public static void main(String[] args) {
System.out.println("안녕하세용~~");
}
}
그렇다면 다음과 같은 과정이 일어날 것이다.
JRE가 프로그램 내에 main()
메서드가 존재하는지 확인한다.
우리의 JRE 가 나타나서 프로그램 내부에 있는 main()
메서드의 존재를 찾을 것이고, 만약에 main()
메서드의 존재가 확인된다면 JVM을 부른다.
JVM이 전처리 과정을 거친다.
JVM이 가장 먼저 불러들어 와서 하는 일은 전처리라는 과정인데 그 과정에 대해서 자세히 알아보자.
JVM은 전처리 과정을 통해서 import
된 클래스나 package
를 메모리에 올려놓는데, Static 영역에 추가시킨다.
지금 위의 소스코드에서는 System.out.println()
을 사용하기 위해서 Java.lang
클래스가 import 되었다. 그럼 전처리 과정에 의해 다음과 같이 될 것이다.
그리고 나서 추가적인 import
가 존재하는지 확인하지만 추가적인 import
는 존재하지 않기 때문에 넘어간다.
추가적으로 전처리 과정에서 import된 클래스를 static 영역에 배치할 뿐 아니라 프로그램 내에 존재하는 모든 클래스를 static에 배치시킨다
메서드를 stack 영역에 배치 시킨다.
전처리 과정을 거치고 나서 바로 사용할 수 있는 것이 아니다.
아까 봤던 그림처럼 static 영역은 클래스의 활동 영역이라고 했고 우리가 실행하고 싶은 코드인 System.out.println()
은 메서드라는 것을 잊지 말아야 한다. 그리고 메서드의 활동 영역은 Stack 영역이므로 이를 Stack 프레임을 만드는 것 까지를 거쳐야 한다.
이로써 우리는 System.out.println("안녕하세요")
라는 코드가 수행되는 것이다.
이와 같이 메모리 구조의 쓰임과 함께 알아보니 정말 유익한 시간이지 않았나요? 다음 시간에는 메모리 구조에 heap 영역에 대해서 말 해볼게요!!
'💊 Java & Kotlin & Spring > - Java & kotlin' 카테고리의 다른 글
[Java 심화] List 컬렉션에서 참조변수의 타입을 어떤 것으로 해야할까? (0) | 2020.07.29 |
---|---|
[Java 심화] Java 에서 Comparable로 정렬 기준 바꾸기. (0) | 2020.02.24 |
[Java 심화] 추상화에 대한 심오한 고찰. (2) | 2019.12.23 |
[Java 심화] 변수가 메모리에 담기는 과정과 스택 프레임과 만남 (3) | 2019.12.21 |
[Java 심화] 포스팅을 시작하며.. (0) | 2019.12.21 |
댓글0