ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 컴퓨터와 자바 메모리에 대한 이해
    Programming🧑‍💻/Java 2023. 3. 7. 12:52

    컴퓨터 메모리 

    • 컴퓨터 메모리는 두가지 종류로 구분된다. 
    • 비휘발성 기억 장치 : 전원 공급이 없어도 저장된 데이터를 유지한다. (컴퓨터가 종료되어도 데이터가 저장되어 있음) ex)HDD,SDD
    • 휘발성 기억 장치 : 데이터 유지를 위해서는 지속적인 전원 공급이 필요하다. (컴퓨터 종료시 데이터가 휘발) ex)RAM

     

    메인 메모리

    • CPU는 HDD, SDD 같은 비휘발성 기억장치보다 RAM으로 되어 있는 메인 메모리에 빠른 접근이 가능하다.
    • 메인 메모리 상에는 현재 실행중인 어플리케이션과 관련된 데이터들이 저장된다. 
    • 어플리케이션 실행시, 종류 직전 후에 다시 실행하는 것보다 컴퓨터 종료 후 다시 실행하는 것이 조금 더 오래 걸리는 이유는 메인 메모리가 캐시 또는 버퍼의 역할을 하기 때문에 어플리케이션 실행에 필요한 일부 데이터를 들고 있기 때문이다.
    • 메인 메모리를 구성하는 RAM은 휘발성 기억장치로 전원공급 차단시 저장된 데이터가 모두 휘발된다.
    • 메인 메모리는 RAM 이외에 ROM(Read-Only Memory)가 함께 구성된다. 이는 비휘발성 기억 장치로 컴퓨터 부팅시 필요한 데이터를 저장한다. 

     
     

    JVM

    출처 : Java Memory Management,Packt Publishing
    • Java 소스코드는 자바 컴파일러을 통해 바이트 코드로 컴파일 된다. ( .java files -> .class files)
    • 컴파일된 파일(.class)는 바이트 코드로 구성되어 있으며 JVM을 통해 실행된다.
    • 어떤 플랫폼(mac,window,linux)이든 상관없이 해당 플랫폼 상에 호환되는 JVM이 있으면 한번 바이트코드로 컴파일된 파일은 어디서든 실행이 가능하다.
    • 컴파일 된 파일은(.class)는 바이트 코드로 JVM상에 실행되기 때문이다. 
    • JVM이 플랫폼 환경에 맞추어 머신코드 변환해주기 때문에 플랫폼 환경에 따라 다시 컴파일 하는 과정을 거치지 않아도 된다. 
       컴파일 된 파일(.class)은 바이트 코드로 구성되어 있으면 JVM에 의해서 실행된다. 

     

    메모리 관리와 JVM

    • JVM은 할당받은 메모리에 자바 프로그램을 실행하는데 필요한 데이터를 저장한다.
    • JVM은 메모리 할당과 해제를 내부에서 자동으로 처리한다. 

     

    자바이전의 메모리 관리

    • C, C++ 같은 언어에서는 메모리 관리를 개발자가 직접 해주어야한다.
    • 즉 메모리의 할당과 해제를 직접관리해야한다.

     

    • 수동 메모리 관리의 불편한 점
    1.  Dangling pointers: 메모리를 해제한 이후 포인터를 잡고 있는 변수를 NULL로 하지 않을 경우 발생 
    2. Memory leaks : 메모리를 해제하지 않으면 필요없는 데이터에 메모리를 낭비하게 된다.
    3. Boilerplate code: 메모리를 관리하는데 너무 많은 코드가 필요하다.
    4. Error-prone : 수동으로 하는 메모리 관리는 실수를 유발하기 쉽다. 

    메모리 관리 이해를 위한 JVM 구성요소

    출처 : Java Memory Management,Packt Publishing

    1. Class loader : 모든 클래스 파일을 로딩하고 바이트코드를 확인한다. 
    2. Runtime data areas : 메모리상에 클래스데이터, 명령어를 할당한다. 
    3. Execution engine : Class loader를 통해 로딩되고, Runtime data areas에 저장된 데이터들을 이용해 바이트코드를 실행한다. 
    4. Java Native Interface(JNI) : Execution engine은 JNI과 상호작용하며 바이트 코드 실행에 필요한 기본 라이브러리를 사용한다. 
     
     

    Runtime data areas

    출처 : Java Memory Management,Packt Publishing

    Runtime data areas는 Stack area, Heap area, Method area, PC registers, Native method stack area 로 구성되어 있다. 
     
    Heap area

    • JVM 작동 시작시, 자바 어플리케이션 실행시  동적 메모리 할당에 사용할 RAM 일부를 예약해두는데 이 곳을 Heap이라한다. 
    • 클래스의 인스턴스들이 이곳에 저장된다.
    • JVM은 Heap 데이터들을 위한 메모리를 할당하고, garbage collection 프로세스를 통해 메모리를 정리한다. 
    • garbage collection 방식은 Heap내의 영역 구분에 따라 다르게 동작한다.

     
    Stack area

    • JVM 스택은 원시형 값(primitives)와 참조형값의 참조값(Heap상의 저장된 메모리 위치값)이 저장된다. 
    • 메서드를 호출하면 스택내에 각 메서드에 대한 메서드 프레임을 생성하고, 이 메서드 프레임 내에는 메서드의 부분결과, 리턴값과 같은 메서드와 관련된 데이터들이 저장된다. 
    • Stack은 Heap과 달리 각 스레드마다 별도의 Stack이 존재한다.
    출처 : Java Memory Management,Packt Publishing
    • 스택은 각 스레드마다 할당되기 된다. 따라서 메모리상의 스택영역은 각 스레드를 위한 여러 스택으로 구성되어 있다. 
    • 각 스레드는 자기 자신의 스택에만 접근이 가능하다.

     
    Method Area (Meta Space)

    • Runtime representation of class가 저장되는 곳이다. 
    • runtime code, static variables, constansts pools, constructor code같은 클래스의 메타 데이터가 저장된다. 
    • 이전에는 PermGen(Permanent Generation)이라 불렸다.

     
    PC(Promgram Counter) Register

    출처 : Java Memory Management,Packt Publishing
    • PC Register는 각 스레드마다 구분하여 가지고 있으며, 각 스레드가 실행해야하는 명령어의 순서와 현재 실행중인 명령어의 주소를 가지고 있어 다음의 실행해야하는 명령어를 스레드에게 알려준다. 
    • Call Stack이라고 부른다. 

     
    native method stack

    • runtime data area에 네이티브 코드 실행을 위해 할당된 메모리

     
    자세한 내용은 다음을 참고

    Java Memory Management

    Improve application performance by tuning, monitoring and profiling both the garbage collector and JVM Key Features Understand the different parts of Java memory and the various garbage collectors so you … - Selection from Java Memory Management [Book]

    www.oreilly.com


    'Programming🧑‍💻 > Java' 카테고리의 다른 글

    [JAVA] NPE : 널포인트 Exception  (0) 2023.03.16
    [JAVA] String Constant Pool은 무엇일까?  (0) 2022.12.17
    [JAVA] final  (0) 2022.10.25
    [JAVA] static  (0) 2022.10.21
    [JAVA] Enums  (0) 2022.10.08

    댓글

Designed by Tistory.