새소식

반응형
Java/Spring

JVM, 자바 메모리 영역(코드, 데이터, Static, 스택, 힙)

  • -
반응형

JVM 이란?

JVM은 Java Virtual Machine으로 Java와 OS 사이에서 가장 중요한 중간자 역할을 한다.

자바 컴파일러(javac)가 개발자가 작성한 소스코드(.java)를 컴파일하면 바이트 코드(.class)가 된다.

컴파일된 바이트 코드(.class) 를 OS에 맞게 기계어로 해석해주는 역할을 JVM 이 한다.

쉽게 얘기하면 자바 소스코드(.java)를 컴파일 한 바이트 코드(.class)를 운영체제가 이해할 수 있도록

해석하고 실행시키는게 JVM 이다.

 

 

JVM 실행 순서

  1. 자바 소스코드(.java)를 자바 컴파일러가 바이트코드(.class) 로 변환한다.
  2. 변환된 바이트코드를 JVM 의 Class Loader(클래스로더) 로 전달한다.
  3. Class Loader(클래스 로더)에서 JVM 런타임 영역으로 로딩(할당)하여 메모리에 올린다.

 

자바 메모리 영역

메모리의 공간은 Method(Static) 영역, Stack(스택) 영역, Heap(힙) 영역으로 구분되고 데이터 타입(자료형)에

따라서 해당 공간에 할당된다.

 

Method(Static) 영역

 

JVM 의 Class Loader 에 의해 로딩(할당)될 때 생성된다.

하나의 JAVA 파일(.class)에는 필드(Field), 생성자(constructor), 메소드(method)로 구성된다.

그중 필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(Static이 붙은 자료형)가 Static 영역에 데이터를 저장한다.

Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다.

전역변수를 프로그램이 종료될때까지 어디서든 사용 가능한 이유이기도 하다.

따라서 전역변수를 무분별하게 사용하게되면 메모리가 부족할수도 있어 조심해서 사용해야한다.

 

Stack 영역(스택 메모리 영역)

 

우리가 현재까지 작성하던 메소드 내에서 정의하는 기본 자료형(int, double, String, byte, long, bolean 등)에

해당되는 지역변수(매개 변수 및 메소드 블럭 내 변수 포함)의 데이터 값이 저장되는 공간이 Stack(스택) 영역이다.

해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.

pulbic class Stack_memory_example{
	public static void main(String[] args){
        int a = 5;
        a = 4;
        a = 3;
        a = 2;
        String b = "obo";
        double c = 1.2;
    }
}

 

위 코드처럼 main 메소드의 블록안 지역변수들이 호출될때 Stack 영역에 할당되고 종료시 소멸된다.

a라는 변수는 5,4,3,2 순으로 값을 할당하였고 출력되는 값은 2가 출력된다. 이전 데이터는 지워지는 것이고 2라는 값만 출려된다. 이유는 Stack 영역은 LIFO(Last In First Out)의 구조를 가지고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.

Heap 영역(힙 메모리 영역)

 

참조형의 데이터 타입을 갖는 객체(인스턴스), 배열, String 객체 등은 Heap 영역에 데이터가 저장된다.

new 클래스(); 를 통해 Stack영역(메소드 블록 안 지역변수들)에서 생성하면 Heap 영역에 공간을 생성하고,

생성된 공간의 주소값(참조값)을 Stack 영역에서 가지고 있다.

* 인스턴스 : 객체를 new 클래스(); 를 통해 생성한다.

public class Heap_Example {
    public static void main(String[] args) {

    int[] a = null; // int형 배열 선언 및 Stack 영역 공간 할당

    System.out.println(a); // 결과 : null

    a = new int[5]; // Heap 영역에 5개의 연속된 공간 할당

    // 변수 a에 참조값 할당

    System.out.println(a); // 결과 : @151239742 (참조값)

    }
}

 

위 코드를 보면 a라는 배열을 생성하면 Stack영역에 공간 할당된다.

생성된 배열에 new 키워드를 사용하여 인스턴스를 생성하면(a = new int[5];) Heap 영역에 5개의 연속된 공간 할당하고 해당 공간의 참조값을 a 변수에 return하여 저장한다.

반응형

'Java > Spring' 카테고리의 다른 글

특정 List 정보 .xlsx 파일 다운로드  (0) 2021.08.28
HandlerInterceptor  (0) 2021.08.28
Dispatcher Servlet(Front Controller), ViewResolver  (0) 2021.08.28
DI(Dependency Injection, 의존성 주입)  (0) 2021.08.28
@Qualifier 어노테이션  (0) 2021.08.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.