본문 바로가기
Language/Java

[Java] Java 메모리 영역(stack, heap, static), JVM, JAVA 변수 종류

by lucas_owner 2023. 2. 7.

목차 

  1. JVM 이란?
  2. Java의 메모리 영역
  3. Java 변수 종류
  4. Static(Method) 영역
  5. Heap 영역
  6. Stack 영역

 

JVM 메모리 구조중, (Stack, Heap, Static)메모리 영역과

JVM, Java 변수 종류에 대해서 알아보자. 

 

 

JVM 이란?

- 메모리 영역을 공부하기전 간단하게 JVM에 대해서 알아보자.

 

JVM 이란 Java Virtual Machine의 약자이며, 자바 가상 머신이라고 불리운다. 

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

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

 

○ 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 

JVM 구조

 

Java의 메모리 영역

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

 

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

 

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

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

 

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

- 클래스 변수, 인스턴스 변수는 - 전역변수(global variable), 멤버변수(member variable), 필드(filed)라고 한다. 
셋다 같은 뜻이다.

- Filed(필드) = 클래스 영역에있는 변수를 말한다.

Ex) 필드 안에 전역변수 = 전역변수 안에 전역변수.

 

 

- 메서드 내부에 있는 변수를 지역 변수라고 한다. 

 

 

Static (Method) 영역

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

 

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

 

 

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" 를 가르킨다.)

 

 

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 영역을 공유하여 사용 가능.

 

 

 

 

반응형

댓글