본문 바로가기

카테고리 없음

JAVA 메모리 구조

1. JVM (Java Virtual Machine)

 

- JVM 이란 Java Virtual Machine 약자이며 자바 가상 머신이라고도 한다.

  Java의 바이트 코드를 해석하고 실행하는 역할을 한다.

  OS에 상관없이 실행할 수 있는 장점이 있다.(JVM만 설치하면 어떤 운영체제에서든 java 파일을 실행할 수 있다.)

 

JVM 구조

 

○ JVM 실행 순서

  1. .java 파일을 컴파일러(Compiler)를 통해 .class 파일로 변환한다.
  2. .class 파일을 JVM 의 ClassLoader(클래스로더)에게 보낸다.
  3. 클래스로더에서 JVM 런타임 영역으로 로딩(할당)하여 메모리에 올린다. 

○ JVM의 RunTime Data Area(런타임 데이터 영역)

- Java 메모리 영역을 알기 위해선 런타임 데이터 영역에 대해서 알아야한다. 

클래스 로더가 .class 파일을 이 영역에 올리기 때문이다. 

런타임 데이터 영역에는 5가지 영역이 존재한다.

  1. Static Area(Method Area)
  2. Heap Area
  3. Stack Area
  4. PC Register
  5. Native Method Stack 

 

2. JAVA 메모리 영역

 

- 자바 프로그램을 실행 하게되면 JVM(Java Virtual Machine)은 OS 로 부터 메모리를 할당 받는다, 할당 받은 메모리를 자바 프로그램에 맞게 여러개의 영역으로 나누어 사용하게 된다.

 

- 각 영역은 목적에 맞게 사용되고, 어플리케이션의 성능에 영향을 미친다. 같은 기능을 하는 어플리케이션 일지라도, 메모리 관리에 따라 성능에 차이가 생긴다는 이야기다. 메모리를 관리하지 않고 구성하게 된다면 StackOverFlow 가 발생하여 어플리케이션이 종료될수도 있다는 말이다, 혹은 어플리케이션의 속도가 크게 저하 될수도 있다. 

 

- JVM의 메모리는 크게 3가지로 이루어져 있다.

  1. Heap 영역.
  2. Stack 영역.
  3. Static(Method) 영역.

 

3. JAVA 변수의 종류

 

- 메모리 영역에 올라가는 것 들중 이해하기 가장 쉬운것이 변수에 대한 부분이다. 또한 처음 공부하는 경우, 변수 종류에 대해 굉장한 혼돈이 오기 마련이다. 변수 종류를 간단하게 이해하고 메모리 영역에 대해 접근하면 이해하기가 쉬울것이다.

 

- 변수는 선언 위치에 따라 구분짓게 된다.

- 4가지의 종류가 존재한다. (클래스 변수, 인스턴스 변수, 지역변수, 매개변수)

 

public class Variable { 

	public static int age = 20; // 클래스 변수(전역 변수)
    
    int height = 60; // 인스턴스 변수(전역 변수)
    
    public static void main(String[] args) { // 매개변수(파라미터)
 		int size = 50; // 지역변수
        
    }
}
변수 종류 선언 위치 설명 생성 시기 소멸 시기 저장 메모리
클래스 변수
(Static variable)
클래스 영역 static 키워드가 붙고 여러 객체에서 공통으로 사용 할 때 사용 클래스가 메모리에 올라갈때 프로그램 종료 시 Static
인스턴스 변수
(Instance variable)
클래스 영역에서 static이 아닌 변수 인스턴스가 생성될 때 인스턴스 소멸시 Heap
지역 변수
(Local variable)
메서드 영역 메서드 내부에서 선언된다. 
초기 값을 지정해야 사용가능.
블록 내에서 변수의 선언문이 실행 될 때 블록을 벗어날 때 Stack

 

 

4. Static(Method)의 영역

 

Static 영역 혹은 Method 영역이라고 불린다. 클래스 변수나, static 으로 선언된 것들이 해당 메모리 영역에 저장된다.

 

  1. JVM이 실행될 때 Class 가 로딩될 때 생성.
  2. Class의 정보, Static 변수(클래스 변수), 생성자(Constructor), 메소드(Method)와 같은 것들을 저장한다.
  3. Static 영역에 있는 것은 어디서든 접근 가능 하다. 
  4. JVM이 종료 시(프로그램이 종료 시) 메모리에서 해제 된다. 즉 프로그램이 종료되기 전까진 메모리 상에 존재하게된다. 
    그렇기 때문에 어디서든 접근이 가능한 것이며, 무분별 하게 사용될 경우 메모리 부족 현상이 발생할 수 있다.

 

5. Heap의 영역

 

인스턴스를 생성할 때 사용되는 메모리 영역이다.

 

- 참조형 데이터 객체의 실제 데이터가 저장되는 공간이다. Stack 영역에서 실제데이터가 존재하는 Heap 영역의 참조값을 가지고 있다.

 

- new 키워드로 인스턴스를 생성 할 때, Heap 영역에는 생성된 객체가 저장, Stack 영역에서 생성된 객체에 대한 주소 값(Reference)이 저장된다.

 

  1. new 를 사용해 객체를 생성할 때 저장된다.
  2. 참조형 데이터 타입이 저장된다. (String, 배열(array), enum, class, interface), Object
  3. Heap 영역의 데이터들을 가르키는 Reference(참조 주소)는 Stack영역에 적재된다.
    Reference를 통해서만 Heap 영역의 데이터들에 접근, 핸들링 할 수 있다.
  4. 호출이 종료되도 삭제되지 않는다. -> GC(가비지 컬렉터)에 의해 메모리에서 해제된다. 
  5. 쓰레드가 몇개가 존재하든, 단 하나의 영역만 존재한다. 
    (Stack 영역의 경우 쓰레드 별로 1개씩 생성된다.)

Heap, Stack이 저장되는 부분

 

String name = "lucas";

- String name = "lucas"; 이라는 줄이 있을때. 

- "lucas" 는 Heap 영역에 저장. 

- name 부분은 Stack 영역에 저장. (name 은 주소를 갖고 있으며 -> Heap 영역의 "lucas" 를 가르킨다.)

 

 

6. Stack의 영역

  1. 기본 자료형(원시 자료형, Primitive type), 지역변수, 매개변수가 저장되는 메모리.
    (int, double, boolean, byte)
  2. 메서드 내부의 기본자료형에 해당하는 변수 적재.
  3. Heap 영역에 생성된 데이터의 참조값이 할당됨. -> *그림 : Heap, Stack 저장되는부분 참고.
  4. 메소드가 호출될 때 메모리에 할당, 메서드 종료시 메모리에서 삭제됨.
  5. 자료구조 Stack의 구조이다, LIFO(Last In First Out)
  6. 각 Thread 마다 자신만의 Stack 을 가진다. (1:1) - (Thread : Stack) 
    Thread는 내부적으로 Static, Heap, Stack 영역을 가진다. 

    Thread는 다른 Thread에 접근 할 수 없지만, static, Heap 영역을 공유하여 사용 가능.

4. PC Register

쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.

 

 

5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.