목차

     

    배경

    지난번 JVM의 클래스로더 시스템의 역할과 구조와 동작 방식에 대해 알아봤다.

    beststar-1.tistory.com/13

     

    클래스로더(Class Loader)

    목차 배경 지난번 JVM이 바이트코드를 어떻게 실행시키는지에 대해 알아봤다. beststar-1.tistory.com/2 JVM(Java Virtual Machine), 바이트코드(Byte Code) 이 글은 자바 프로그램이 운영체제에 독립적으로 구동..

    beststar-1.tistory.com

    이제 클래스 로더가 바이트코드를 읽어들여 적재해두는 메모리 영역(Runtime Data Area, JVM Memory)을 들여다보자. 

     


    과정

    메모리 영역(JVM Memory, Runtime Data Area)

    프로그램을 수행하기 위해 운영체제로부터 할당받는 메모리 영역이다. 그 구성요소들을 알아보자.

     

    힙 영역(Heap Area)

    인스턴스화 된 모든 클래스 인스턴스와 배열, 객체를 저장하며 모든 JVM 스레드에 공유되는 공유 자원이다. 여기에 인스턴스 변수가 저장된다.

    힙에 저장된 할당된 메모리 회수 권한은 무조건 가비지 컬렉터(Garbage Collector)에 있어서 이에 의해서만 회수가 가능하다.

     

    💡 가비지 컬렉터는 Application 내부에서 사용되지 않는다고 판단되는 객체를 제거하는 역할을 담당한다.
    여러가지 알고리즘과 동작 방식이 있으므로 추후 별도의 글로 정리해둘 예정이다.

     

    Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다.

    대부분의 오브젝트는 크기가 크고, 서로 다른 코드 블록에서 공유되는 경우가 많다.

    애플리케이션의 모든 메모리 중 Stack 영역에 있는 데이터를 제외한 부분이라고 보면 된다.

    모든 Object 타입(Integer, String, ArrayList ...)은 Heap 영역에 생성된다.

     

    또한 몇 개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재한다.

    Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 Stack 영역에 올라가게 된다.

     

    메서드 영역(Method Area, Static)

    메서드 영역에서는 런타임 상수풀과 필드와 메서드 데이터 내용, 생성자 및 메서드의 코드 내용을 저장,
    클래스 수준의 정보를 저장한다. 여기에 클래스 변수가 저장된다.

    해당 클래스가 코드에서 맨 처음 사용될 때 메서드 영역에 로딩되며

    추가로 이때 클래스에 만약 static 블록이 있다면 단 한번 실행된다.

     

    스택 영역 (JVM Stack Area)

    LIFO 동작으로 동작하는 자료구조이며

    스레드마다 런타임 스택을 만들고 JVM 스택에는 프레임에 저장된다.

     

    메서드 하나가 호출될 때마다 새 프레임이 생성되어 스택에 쌓이고

    메서드 호출이 정상 완료되거나 예외가 던져지면 프레임은 스택에서 빠지면서 소멸된다.

    또한 스레드가 종료되면 스택도 제거된다.

    https://dzone.com/articles/java-memory-management

     

    그리고 Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.

    primitive type의 데이터가 값과 함께 할당된다.

    지역변수들은 scope에 따른 visibility를 가진다.

    각 Thread는 자신만의 Stack을 가진다.

     

    public class Main {
        public static void main(String[] args) {
            String url = "https://";
            url += "beststar-1.tistory.com";
            System.out.println(url);
        }
    }

    https://yaboong.github.io/java/2018/05/26/java-memory-management/

    위 예제코드를 메모리 관점에서 재분석해보자.

    String url 은 String 클래스의 객체 참조 변수로 Stack에 있으며, 실제 객체는 Heap에 있다. 

     

    PC 레지스터

    Thread가 생성될 때마다 그 Thread가 어떠한 명령(Instruction)을 실행하게 될지에 대한 부분을 기록하는 메모리 공간을 말한다.

    JVM은 Stacks-Base 방식으로 작동한다.

    JVM은 CPU에 직접 Instruction을 수행하지 않고 Stack에서 Operand를 뽑아내 이를 별도의 메모리 공간에 저장하는 방식을 취하는데, 이러한 메모리 공간을 PC Registers라고 한다.

    연산을 위해 필요한 피연산자를 임시로 저장하기 위한 용도로 사용한다.

     

    네이티브 메서드 스택(Native Method stack)

    네이티브 메소드 스택은 JVM의 스택이 아니라 C 스택을 가리킨다.

    자바가 아닌 다른 언어로 작성된 네이티브 메서드를 지원하기 위해 사용되는 스택이다.

    네이티브 메소드 스택은 JVM 스택과 마찬가지로 스레드 단위의 자료구조이다.

    public class Main {
        public static void main(String[] args)
        {
        	int port = 4000;
            String host = "localhost";
        }
    }

    https://yaboong.github.io/java/2018/05/26/java-memory-management/

    💡 더 자세한 동작을 알고 싶다면 이 블로그를 참고하면 좋다.

    Stack과 Heap을 중심으로 코드와 메모리 구조 그림을 통해 어떤 동작이 이루어지는지 구체적으로 보고 싶으면 이 블로그도 참고하면 좋다. 가비지 컬렉터도 일부 나오니 좋은 글이다.

     

    네이티브 메소드 인터페이스(JNI)

    JVM에서는 C , C++, 어셈블리어로 구축한 네이티브 한 함수를 네이티브 메서드라고 한다.

    JNI란 네이티브 메서드를 호출할 수 있는 방법을 제공하는 인터페이스를 말한다.

    그럼 네이티브 메소드를 왜 사용하는 걸까? 몇 가지 적어보도록 하자.

     

    • 이미 다른 언어로 상당히 크고 중요한 코드를 작성했고 자바로 동일한 코드를 재작성하기를 원치 않을 때 사용한다.
    • 자바가 시스템 디바이스에 접근하거나 플랫폼 특정적인 작업을 할 때 사용하도록 한다.
    • 자바로 구현하기엔 애플리케이션이 너무 느릴 수 있어서 C 언어를 사용해서 성능 향상을 위해서 작성하기도 한다.

     

    이런 네이티브한 메서드를 저장한 게 네이티브 메소드 라이브러리이다.

     

     

    지금까지의 내용을 간략화하면 아래와 같다.

    메모리 영역은 프로그램을 수행하기 위해 운영체제로부터 자원을 할당받는 곳을 말하며
    힙, 스택, 메서드 영역 등으로 자원을 공유/유지하는 것이다.


    결과

    JVM과 관련하여 아래 사항들을 공부하고 정리했다.

    • 메모리 영역의 개념과 역할
    • 메모리 영역 구성요소인 힙, 스택, 메서드

    성과

    • 짧은 설명이라도 이를 이해시키기 위해 사진, 그림, 코드 등을 함께 두는 것이본인의 내용정리에 있어서도 좀 더 완성도 있게 해주는 효과가 있다는 것을 알게 됐다. 

    출처

    JVM 구조

    https://catch-me-java.tistory.com/12

     

    가비지 컬렉터

    https://yaboong.github.io/java/2018/06/09/java-garbage-collection/

     

    JVM 메모리 관리

    yaboong.github.io/java/2018/05/26/java-memory-management/

     

    JVM 메모리

    https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/