[Samsung SW AI Academy For Youth] Java 2주차 회고

jihun·2026년 1월 22일

studylog

목록 보기
9/11
post-thumbnail

JVM 메모리 구조

JVM(Java Virtual Machine)

자바 프로그램이 실행되는 환경 제공

JVM은 메모리를 체계적으로 관리하기 위해 여러 영역으로 나뉘어져 있다.

  • 메서드 영역 (Method Area)
  • 힙 영역 (Heap Area)
  • 스택 영역 (Stack Area)
  • PC 레지스터 (PC Register)
  • 네이티브 메서드 스택 (Native Method Stack)

GC(Garbage Collection): 사용되지 않는 객체를 메모리에서 해제하여 자동으로 메모리를 관리

JVM 메모리 구조


*JVM 버전에 따라 달라질 수 있다.

Method Area

  • 클래스 정보를 저장하는 영역
  • 정적 변수, 상수, 메서드 등이 저장됨
  • 일부 JVM에 따라 GC가 관리해주는 경우도 있음
  • 모든 스레드가 공유
  • 클래스 로더(Class Loader)에 의해 클래스가 로드 될 때 저장되는 공간

Heap Area

  • 객체 인스턴스를 저장하는 공간
  • GC가 관리하는 영역 (사용되지 않는 객체를 자동으로 삭제)
  • 인스턴스 변수, 배열 등이 해당 영역에 저장
  • 어플리케이션이 사용할 수 있는 가장 큰 메ㅔ모리
  • 모든 스레드가 공유
  • 문자열 상수 풀 관리 (Java 7+)

Stack Area

  • 지역 변수, 메서드 호출 시 사용되는 값, 연산 결과 등 저장
  • 메소드 호출 시 스택 프레임이 생성되며, 끝나면 스택 프레임 제거
  • 스레드 마다 생성

PC Register

  • 현재 실행 중인 메모리의 주소를 저장하는 영역
  • 프로그램 실행 흐름을 제어하는 데 사용
  • 스레드 마다 생성

Native Method Stack

  • 네이티브 언어(C, C++ 등)로 작성된 메서드 호출 시 사용하는 메모리 영역
  • 스레드 마다 생성

Static

Static: 클래스 자체에 1개만 공유되는 멤버 (필드, 메서드)

  • Static 키워드를 작성하면 객체(인스턴스)와 무관하게 클래스 자체에 속함
  • 특정 객체에 속하지 않고 모든 객체가 동일한 static 멤버를 참조
  • 클래스의 이름을 통해 직접 호출 가능
  • JVM 메서드 영역에 저장

Static 필드 (클래식 변수)

  • 정적 필드는 클래스 수준에서 공유되는 변수
  • 객체마다 값이 다른 인스턴스 필드와는 달리 모든 인스턴스가 공유
  • 클래스 이름을 통해 호출하는 것을 권장
// Person Class
public class Person {
	static int pCount;
	
	String name;
	int age;
	String hobby;
}

// PersonTest Class
public class PersonTest {
	public static void main(String[] args) {
		Person p = new Person();
		p.name = "Kim";
		
		Person.pCount++;
		
		p.pCount++; // 오류는 나지 않지만 경고
	}
}

Static 메서드

  • 정적 메서드는 클래스 이름을 통해 직접 호출할 수 있는 메서드
  • 객체와 무관하게 동작, 전역적인 작업에 적합

Static 블록 (초기화 블록)

  • 정적 블록은 클래스 로드 시 한 번만 실행되는 초기화 블록
  • 정적 필드 초기화에 사용
public class Counter {
	// static 변수
	public static int sCount;
	// non-static 변수
	public int iCount;
	// 초기화 블록
	static {
		sCount = 10;
	}
}

Static 주의 사항

  • static 영역에서는 non-static 영역을 직접 접근할 수 없음

  • non-static 영역에서는 static 영역에 대한 접근이 가능

public class Main {
	String str = "문장";
	
	public static void main(String[] args) {
		System.out.println(str);
	}
}
  • non-static 영역에서는 static 영역에 대한 접근이 가능
public class Main {
	static String str = "문장";
	
	public static void main(String[] args) {
		System.out.println(str);
	}
}

0개의 댓글