[Java] JVM 메모리 사용 영역

chael_lo·2021년 5월 6일
0

Java

목록 보기
7/52

프로그램을 구동하기 위해서 운영체제가 메모리(RAM)에 데이터 및 명령어를 저장할 공간을 할당하여 준다. 프로그램이 실행되면 JVM(자바 가상 머신)은 운영체제로부터 메모리를 할당받는다. 메모리는 사용할 수 있는 공간이 한정되어 있어서 어떻게 관리하느냐에 따라 프로그램 성능이 좌우된다. 따라서 메모리를 효율적으로 사용하기 위해서는 메모리 영역을 이해할 필요가 있다.

메모리 영역 분류

스테틱(Static) 영역

  • 메소드 영역과 같은 말
    • Class(클래스) 영역
    • Code(코드) 영역
    • Method (메소드) 영역
  • JVM이 동작해서 클래스가 로딩될 때 생성한다.
  • 자바 프로그램에서 특정 클래스가 사용되면(호출될 때) 해당 클래스의 클래스 파일(*.class)을 읽어들여, 해당 클래스에 대한 정보를 스테틱 영역에 저장한다.
  • 스테틱 영역에 저장되는 정보
    • 클래스정보(멤버변수의 이름)
    • 변수정보(데이터타입, 접근제어자정보)
    • 메소드정보(메소드 이름, 리턴타입, 파라미터, 접근제어자 정보)
    • static변수(정적 멤버변수, static이 붙은 자료형)
    • final class변수
    • Constant pool(상수풀 : 문자상수, 타입, 필드, 객체참조가 저장됨)
  • 스테틱 영역에 저장되는 정보는 JVM이 종료될 때까지 사라지지 않고 고정된(Static) 상태로 유지된다.
  • 스테틱 영역에 있는 것은 어떤 곳에서나 접근이 가능해지기 때문에 '전역'이라는 키워드를 사용하며, 이 전역변수는 프로그램이 종료될 때까지 어디서든 사용이 가능하다.
  • 전역변수를 무분별하게 사용하다 보면 메모리가 부족할 우려가 있다.

힙(Heap) 영역

  • 모든 객체(Integer, String, ArrayList, ...)타입이 생성되는 영역이다.
  • JVM은 자바 프로그램에서 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.
  • 스레드의 갯수와 상관없이 하나의 heap 영역만 존재한다.
  • 힙영역에 생기는 객체들의 레퍼런스 변수는 스택영역에 생긴다.
  • 참조 변수나 필드가 없다면 의미없는 객체가 되어 JVM이 쓰레기로 취급하고 Garbage Collector를 실행시켜 자동으로 제거한다.
  • 크기가 정해져 있지 않는 타입이다.(메모리 크기가 크다.)
  • 힙 영역이 가득 차면 OutOfMemoryError가 발생한다.

스택(Stack) 영역

  • JVM은 자바 프로그램에서 블럭을 만나면 스택 프레임이 생기고, 블럭이 끝나면 스택 프레임이 사라진다. 해당 메소드(메소드라고 표현했지만 메소드 포함 하나의 블럭)와 관련된 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시값들은 스택영역에 올라간다.
  • 기본형 타입 변수의 값들은 stack영역에 저장되고, 참조형 타입 변수는 참조값(heap 영역에 존재하는 인스턴스(객체)를 가르키는 역할)만 저장된다.
  • 크기가 정해져 있는 타입이다.(메모리 크기가 작다.)
  • 쓰레드마다 고유의 스택 영역을 가지고 있으므로, 쓰레드가 안전하다.
  • 스텍 영역이 가득 차면 StackOverFlowError가 발생한다.
  • 메모리 엑세스 속도가 가장 빠르다.
profile
천천히 꾸준히

0개의 댓글