[Java] 메모리 구조

이병수·2024년 1월 2일
0

Java

목록 보기
9/27
post-thumbnail
post-custom-banner

Java 메모리 구조


자바의 메모리 구조에 대해서

  • 자바의 메모리 구조는 크게 스택 영역, 힙 영역 그리고 메서드 영역으로 나눌 수 있다.

스택 영역 (Stack Area)

자바 실행 시, 하나의 실행 스택이 생성되며 각 스택 프레임은 지역변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.

  • 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임

  • 메서드를 호출할 때마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다. ( 자료구조 Stack 처럼 동작한다. )

  • primitive 타입의 데이터(byte,short,int,long,double,boolean 등)에 해당되는 지역변수, 매개변수 데이터 값이 저장된다.

  • 참고 : 스택 영역은 각 쓰레드 별로 하나의 실행 스택이 생성되며 쓰레드 수 만큼 스택 영역이 생성된다.


정리

  • 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리

  • 메서드를 계속 호출하면 스택 프레임이 계속 쌓임

  • 지역 변수(매개변수 포함)는 스택 영역에서 관리

  • 스택 프레임이 종료되면 지역변수도 함께 제거되며 모든 스택 프레임이 종료되면 프로그램이 종료

  • 힙 영역에 있는 객체의 주소값을 갖고 있는 참조 변수도 스택 영역에 있다.


힙 영역 (Heap Area)

객체(인스턴스)와 배열이 생성되는 영역이다.

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용한다.

  • 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장된다.

    • 객체는 힙 영역에서 관리가 된다.

    • 힙 영역에 있는 오브젝트들을 가리키는 참조 변수는 스택에 적재

  • 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더이상 참조되지 않은 객체는 GC에 의해 제거된다.

  • 힙 영역 외부가 아닌 힙 영역 안에서만 인스턴스끼리 서로 참조하는 경우에도 GC의 대상이 되어 제거된다.


메서드 영역(Method Area)

프로그램을 실행하는데 필요한 공통 데이터를 관리한다.

이 영역은 프로그램의 모든 영역에서 공유된다.


클래스 정보

  • 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드 등 모든 실행 코드가 존재한다.
  • 처음 자바를 실행하면 클래스 정보를 읽고 자기 자바에 올리게 되는데, 이 메서드 영역에 해당 정보를 올린다.

static 영역

  • static 변수들을 보관한다.

런타임 상수 풀

  • 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.

    • 예를 들어서 프로그램에 "hello"라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리

    • 프로그램을 효율적으로 관리하기 위한 상수들도 관리한다.


  • JVM이 동작해서 클래스가 로딩 될 때 생성된다.

    • 프로그램의 시작부터 종료될 때까지 메모리에 남아있다.
  • 메서드 영역에 있는 것은 어디서나 접근이 가능하다.

  • 클래스 변수(static)와 메서드는 무조건 메서드 영역에 존재한다.


메서드 코드는 어디서 관리할까?

메서드 코드는 메서드 영역에서 관리한다

  • 객체가 생성되더라도, 힙 영역안에서 해당 클래스의 인스턴스 값들이 필드값과 함께 저장되지만

  • 메서드에 대한 새로운 메모리 할당에 대해서는 없다.

  • 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.

따라서, 인스턴스의 메서드를 호출하면 실제로 메서드 영역에 있는 코드를 불러서 수행한다.


static

클래스의 멤버 변수(필드) 종류

  1. 인스턴스 변수 : static이 붙지 않은 멤버 변수

    • static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다.

    • 즉, 힙 영역에 관리되어진다.

    • 인스턴스 변수는 인스턴스를 만들때마다 새로 만들어진다.

  2. 클래스 변수 : static이 붙은 멤버 변수

    • 클래스 변수, 정적 변수, static 변수 등으로 부른다.

    • static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근이 가능하며, 클래스에 소속되어 있다.

    • 클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다.

    • 메서드 영역에서 관리되어진다.



클래스의 메서드 종류

  1. 인스턴스 메서드

    • static이 붙지 않은 메서드는 인스턴스를 생성해야 호출할 수 있고 인스턴스 메서드라고 한다.
  2. static 메서드

    • 정적 메서드 또는 클래스 메서드라 하며, 클래스 메서드 안에서는 인스턴스 변수, 인스턴스 메서드가 들어올 수 없다.


변수와 생명주기


지역변수(매개변수 포함)

  • 지역 변수는 스택 영역에 있는 스택 프레임에 보관

  • 메서드가 종료되면 스택 프레임도 제거되는데 해당 스택 프레임에 포함된 지역변수도 함께 제거

  • 생명주기 짧음

인스턴스 변수

  • 인스턴스에 있는 멤버 변수

  • 힙 영역에 사용된다.

  • GC(가비지 컬렉션)가 발생하기 전까지 생존하기 때문에 지역변수보다 생명 주기가 길다.

클래스 변수

  • 메서드 영역의 static 영역에 보관되는 변수

  • 메서드 영역은 프로그램 전체에 사용되는 공용 공간

  • 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성되고 JVM이 종료될 때까지 생명주기가 이어진다.

  • 생명주기가 길다.


좋은 개발 참조..

static 메서드만 가지고 있는 클래스인 경우에는 생성자를 제한함으로써 굳이 인스턴스를 만들 필요 없게 해야한다.


참고

김영한의 실전 자바 - 기본편 강의

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%8A%A4%ED%83%9D-%ED%9E%99

profile
백엔드 개발자가 되고 싶어요
post-custom-banner

0개의 댓글