JAVA를 하면서 빼놓을수 없는 중요한 역할을 하는 녀석이있다. 한번 얕게 알아보자.

JVM이란?

Java Virtual Machine을 줄여서 JVM이라고 부른다. java byte code를 os에 맞게 해석해주고 Java Compiler.java -> .class로 변환해준다. 이때 컴파일되면 파일안에는 바이트코드로 변환되어있는것을 확인할수가 있다.

.java 파일 ---> compiler ---> .class 파일


  • .java 파일 : java 문법을 사용하여 작성한 모든 소스코드 파일 (인간이 읽을수 있는형태)
  • .class 파일 : 컴파일러가 작성해주며 java byte code로 만들어진 파일 (JVM이 읽을수 있는 형태)
    • JVM이 읽을수 있다면 JVM이 있는 모든 OS에서 실행이 가능하다

Compiler란?

high level language -> low level language로 변환해주는 소프트웨어로써 JAVA, C, Go..와 같은 프로그래밍언어로 작성된 프로그램 소스를 기계어(low level language)로 변환해주는 소프트웨어를 말한다. 자바는 우리가 알고 있는 일반적인 Compiler뿐만 아니라 JIT Compiler도 있다.

Hello.java ---> Compiler ---> Hello.class ---> JVM ---> Hello
(Hello 프로그램의 실행 흐름도)

JIT 컴파일(just-in-time compilation) : 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.

jvm

JVM 구조 (출처:https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2)


JVM 구조
  • Class Loader
    • RunTime시점클래스를 로딩하게 해주며 클래스의 인서턴스를 생성하면 클래스 로더를 통해 메모리에 올라간다.
JVM 메모리 구조
  • 메소드 영역 (Method Area)
    • 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 클래스파일을 읽고 해석하여 클래스에 대한 여러 정보(클래스 데이터)를 메소드 영역에 저장하며 클래스변수도 이영역에 함께 생성된다.
  • 힙 (Heap)
    • 인스턴스가 실제로 생성되는 공간이며 우리가 new를 붙여 만든 모든 인스턴스는 이곳에 생성된다. 다시말해 인스턴스 변수가 생성되는 공간이다.
  • 호출스택 (call stack, execution stack)
    • 메서드의 작업에 필요한 메모리 공간을 만들어주며 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되고 메서드 작업이 진행중일동안 지역변수,매개변수들과 연산의 중간결과 등을 저장하는데 사용되고 작업이 완료되면 메모리공간은 반환된다.


(Stack : https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D)


스택 알고리즘에 대한 이해를 돕기위해 동영상을 준비해보았다.

Call Stack Test Source (테스트 소스)

자 우리는 이제 스택에 대해 이해를 했다. 아래와 같은 예제가 있을시 Method Area 내부가 어떻게 동작하는지 순서대로 살펴보자

public class Main {
    public static void main(String[] args){
        testMethod00();
    }

    public static void testMethod00(){
        testMethod01();
    }

    public static void testMethod01(){
        System.out.println("아서 등장!");
    }
}
실행결과

stack-test 결과를 살펴보면 좌측하단호출순서대로 main -> testMethod00 -> testMethod01 순서대로 쌓이고 수행이 다된 메소드부터 차례대로 반환대는것을 확인할수가 있다.

과도한 중첩 메소드 호출은 Stack Overflow Error!가 발생할수 있으니 주의하자.

이번 포스팅에서 다룬 내용들은 Java를 하시는분들이라면 정말 중요한 내용이니 한번더 살펴보시기 바랍니다.