JVM 메모리영역

2025. 6. 19. 16:00·공부일기../Java
⚠️개인이 학습한 것을 바탕으로 작성되어 부정확할 수 있으며, 오류가 있다면 알려주시면 감사하겠습니다.

 

자바 객체지향 관련 인강을 들었다.

먼저 JVM 메모리 영역에 관해 정리해보려고한다.

 

우선 인강을 들은 후 면접문제 형식으로 내가 알고있는 내용들을 정리했다.

개념에 대한 얘기는 적지 않았기때문에 여기에 차근차근 헷갈리는 부분을 정리하고자한다.

 

[객체지향 공부 노션]

https://www.notion.so/1-2-2134b147d78c8053b3d4fbc1f0724321

 


 

우선 메모리부분을 먼저 포스팅하려고하는 이유는 아래와같다.

 

JVM(Java Virtual Machine)은 자바 프로그램을 실행할 때, 메모리를 여러 영역으로 나눠서 관리한다.
이 구조를 이해하면 `static ` , ` heap ` , 참조형 등 많은 개념이 한 번에 정리되기 때문이다.

 

그리구 메모리관리 못하면 메모리설계가 잘되어있는 프로그램에 비해 현저히..느리고 못생긴 사이트가 만들어진다..

 

 


 

1. JVM 메모리 영역 구성

영역 설명
Method Area (메서드 영역) 클래스 정보, static 변수(어디서든 접근가능), 상수 저장. 클래스 로딩 시 최초 1회 생성
Heap - 객체(instance)가 저장되는 영역. new로 생성된 객체는 여기 저장! 
- JVM이 자동으로 메모리를 관리하는 곳
- 모든 쓰레드가 공유하는 공간
- GC(Garbage Collector)의 대상이 되는 영역
Stack 메서드 호출 시 지역 변수, 매개변수, return 주소 저장. LIFO 구조
PC Register 각 쓰레드가 실행 중인 명령어 주소 저장
Native Method Stack C/C++ 등 네이티브 메서드 호출 시 사용하는 영역

 

이해가 쉬운 예시

개념  저장  선언위치 위치  생성 시점 예시
static 변수(클래스 변수) 메서드 영역 클래스 영역 클래스 로딩 시 Math.PI, Example.count
인스턴스 변수 힙( ` Heap ` ) 객체 생성 시 ex.name, user.id
지역 변수 스택( ` Stack ` ) 메서드 영역 메서드 실행 시 int i = 0;
참조 변수 스택( ` Stack ` ) 메서드 실행 시 User u = new User();

 

Heap 영역과 관련해서..

요즘은 메모리 리소스가 충분하고 (= JVM Heap Size가 커서 메모리 여유공간) GC 성능이 뛰어나서 작은 메모리 누수는 눈에 띄지 않을 수 있다고는 하지만 장기 운영, 실서비스 트래픽, 지속적인 객체 생성이 있을 때 분명히 문제가 되기때문에... 

나에게 메모리 관리란 ㅜ.. 넘 어려운 영역이다.. 데이터 베이스 설계할때도 그렇고 최소의 비용을 사용하려고 노력함..

 

자바 8버전부터는 ` Young Generation ` 영역과 ` Old Generation ` 로 나뉜다. (회사에서는 7버전을 씀)

잘은 모르지만 이름 그대로 Young 존은 신생객체영역이고 대부분의 객체는 여기서 생성되고 금방 GC대상이 된다.

여기서 여러번 살아남은 객체가 Old 존으로 이동하는데 여기서 GC가 일어나면 Major GC 또는 Full GC이라고 한다.

(느려서 장애날수도)

 


 

2.메모리영역 상세 설명

 

1. ` static ` 변수는 어디?

→ 메서드 영역( ` Method Area ` )
클래스가 로딩될 때 메모리에 올라가며, 모든 객체가 공유함.

class Example {
    static int count = 0;  // 메서드 영역에 저장
}

 

2. 인스턴스 변수는 어디?

→ ` Heap ` 영역
`new` 키워드로 객체를 생성하면, 그 객체의 속성은 ` heap ` 에 저장됨.

Example ex = new Example();  // ex는 stack, 실제 객체는 heap

 

3. 지역 변수는 어디?

→ ` Stack ` 영역
메서드 실행 시 생성되고, 메서드 종료 시 사라짐.

void method() {
    int temp = 3;  // stack에 저장
}

 

 

4. 정리~

class Person {
    static int total = 0;      // Method Area
    String name;               // Heap (객체 내부)
    
    public Person(String name) {
        this.name = name;
        total++;               // Method Area의 static 필드 접근
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("철수"); // p: Stack, new Person(): Heap
    }
}

 

 


 

 

 

그리고 보통 인강같은곳에서는 ` PC Register ` 와 ` Native Method Stack ` 은 JVM 메모리 구조에서 잘 언급되지 않지만, 그래도 자바의 실행구조를 깊이있게 이해하기위해서는 반드시 알아야 할 개념이다.. 

(나도..잘모름..... 언제까지 내가 쪼랩개발자일수는 없기때문에 이번기회에 개 념 만 공부 쫌 함 ㅠㅠㅋ  )

 

 

3. PC Register (Program Counter Register)

정의
  • 각 JVM 쓰레드마다 존재하는 작은 메모리 공간
  • 현재 실행 중인 바이트코드의 주소(위치) 를 저장
왜 필요할까?
  • 자바는 멀티쓰레드 환경이기 때문에, 각 쓰레드마다 자신만의 실행 흐름이 있어야 함.
  • PC Register는 각 쓰레드가 어떤 명령어를 실행 중인지 기억하는 공간임.
 특징
  • 쓰레드마다 독립적 (쓰레드가 여러 개면 ` PC Register ` 도 여러 개)
  • 자바 메서드 실행 시엔 바이트코드 주소를 저장
  • 네이티브 메서드 실행 시엔 정의되지 않음(값이 없음)

 

* 바이트코드 실행 추적이란?

자바 코드는 .java 파일로 작성되지만, 컴파일하면 .class 파일이 만들어지고,
이 .class 안에는 사람이 읽을 수 없는 JVM만 이해하는 명령어 집합 = 바이트코드(bytecode) 가 들어있다.

컴파일하면 바이트코드로 변환되고, JVM은 이 바이트코드를 한 줄씩 실행한다.

 

JVM은 이 바이트코드를 한 줄씩 읽고 실행해야 하는데,
현재 어느 명령어(Instruction)를 실행 중인지, 다음에 무엇을 실행할지 를 기억해야한다.

바로 이 "현재 실행 중인 명령어의 위치(주소)를 저장" 하는 역할을 하는 게 PC Register (Program Counter Register) 이다.

 

 

 

4. Native Method Stack (네이티브 메서드 스택)

정의
  • 자바가 아닌 C/C++ 등 네이티브 언어로 작성된 메서드(native method) 를 실행할 때 사용하는 스택
  • JVM이 native 키워드가 붙은 메서드를 호출하면, 이 영역을 사용해 OS 시스템 함수나 라이브러리를 호출
public native void registerNatives(); // JNI 호출 예시
 왜 필요할까?
  • 자바만으로는 접근할 수 없는 플랫폼/운영체제 의존 기능이 존재하기 때문
    • 예: 파일 핸들링, 하드웨어 접근, 시스템 호출
  • 그래서 자바에서는 C 코드로 작성된 시스템 라이브러리를 JNI (Java Native Interface) 를 통해 호출
특징
  • JVM마다 구현 방식이 다를 수 있음
  • OS 수준의 호출을 처리하기 때문에 JVM 외부에서 실행되는 코드와 상호작용 가능

예시: System.loadLibrary()

static {
    System.loadLibrary("native-lib");  // 네이티브 메서드 호출 시 Native Stack 사용
}

 

 

5. 정리 요약

항목  PC Register  Native Method Stack
용도 바이트코드 실행 주소 추적 네이티브 메서드 실행 (JNI 등)
위치 각 쓰레드마다 존재 각 쓰레드마다 존재
자바 메서드 사용 시 O (바이트코드 실행 추적) X
네이티브 메서드 사용 시 X (정의되지 않음) O (C 코드 등 실행 시 사용됨)

 

 

6. 문제

문제 형식으로 정리했따.. 개념정리겸..

 

PC Register 관련 질문

 Q1. JVM에서 PC Register의 역할은 무엇인가요?

 모범 답변:
PC Register는 각 쓰레드마다 존재하는 작은 메모리 공간으로,
현재 실행 중인 JVM 바이트코드의 명령어 주소를 저장합니다.
자바는 멀티쓰레드 기반이기 때문에, 각 쓰레드가 자기 실행 위치를 따로 기억할 수 있어야 합니다.


Q2. PC Register는 모든 메서드 실행에서 사용되나요?

모범 답변:
PC Register는 자바 메서드가 실행될 때만 명령어 위치를 저장합니다.
native 메서드를 실행할 때는 바이트코드가 없기 때문에 PC Register는 정의되지 않거나 비어 있게 됩니다.


Native Method Stack 관련 질문

 Q3. Native Method Stack은 언제 사용되며, 왜 필요할까요?

모범 답변:
자바에서는 native 키워드가 붙은 메서드를 통해 C/C++ 등 네이티브 라이브러리를 호출할 수 있는데,
이때 JVM 내부에서 별도의 Native Method Stack을 사용해 해당 메서드를 실행합니다.
이 스택은 JVM 외부 코드와의 연동(JNI 등)을 위해 필요합니다.


Q4. 자바에서 Native 메서드 호출은 어떤 상황에서 사용되나요?

모범 답변:

  • OS 시스템 호출 (파일, 메모리, 네트워크 제어 등)
  • 성능 최적화가 필요한 부분 (네이티브 연산 가속)
  • 플랫폼 종속 기능 구현 (예: 안드로이드 NDK)

예: System.loadLibrary("libName") → C/C++ 라이브러리 호출

'공부일기.. > Java' 카테고리의 다른 글

[TDD](TDD기반 서비스 개발 후) 회고 및 객체지향 설계 고민  (0) 2025.07.12
[TDD] JUnit 테스트 입문 – Mockito로 실제 객체 vs Mock 비교  (0) 2025.07.11
[TDD] TDD 테스트 방법론  (0) 2025.07.11
스트림(Stream) / Optional<T> / 람다  (0) 2025.07.03
객제지향 속성 (캡슐화,상속,추상화,다형성)  (0) 2025.06.20
'공부일기../Java' 카테고리의 다른 글
  • [TDD] JUnit 테스트 입문 – Mockito로 실제 객체 vs Mock 비교
  • [TDD] TDD 테스트 방법론
  • 스트림(Stream) / Optional<T> / 람다
  • 객제지향 속성 (캡슐화,상속,추상화,다형성)
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    다짐
    swagger
    항해플러스
    StringTokenizer
    spring
    MySQL
    TDD
    ERD
    항해99
    spring boot
    JPA
    ADC 환경
    스프링부트
    Paging
    React
    리팩토링
    자바
    인프라 기초
    SpringBoot
    BufferedReader
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
JVM 메모리영역
상단으로

티스토리툴바