본문 바로가기
2023년 이전/기타

Java 메모리와 GC

by JeongUPark 2020. 2. 6.
반응형

Java 메모리의 구조와 GC의 내용을 정리해보려 합니다.

 

Java 메모리뿐만아니라 GC도 인터네에 많은 내용이 있지만 제 블로그에 적어서 쉽게 찾아보려고 작성한 글입니다.

 

 

 

java 는 java 코드를 compiler를 통하여 바이트코드로 변환시킨 뒤 JVM 위에서 실행시키는 구조입니다.

(JVM은 java 바이트 코드를 실행시키는 가상머신으로 java가 플랫폼에 독립적으로 실행될 수 있도록 해줍니다.)

위의 그림을 보면 자바의 동작을 알 수 있습니다. 그 순서를 보면

 

1. Java는 우선 프로그래머가 Java언어를 사용하여 coding을 하여 .java 파일을 만듭니다.

2. 그리고 그 파일을 Java Compiler를 통하여 Compile을 하면 .class 파일이 생성됩니다. (이 파일이 바이트코드로 변환된 상태입니다, 위에서 Class Library는 Java 애플리케이션이 런타임에 호출 할 수있는 동적으로로드 가능한 라이브러리 세트입니다. -출처 위키피디아)

3. 이렇게 생성된 .class 파일은 ClassLoader를 통하여 RuntimeDataArea에 클래스 단위로 로드시키고, Link를 통하여 적절히 배치됩니다. 이 ClassLoader를 통하여 동적으로 클래스를 로드할 수 있습니다.

4. RuntimeDataArea에 배치퇸 바이트 코드들은 Execution Engine을 통하여 실행됩니다. Execution Engine은 메모리에 올라온 코드를 명령어 단위로 실행합니다.

 

위의 과정을 통하여 java가 complite 되고 실행하면 동작하게 됩니다.

 

그럼 위의 그림의 각 부분에 대해 설명 드리겠습니다.

 

Class Loader

컴파일러에 의해 바이트코드로 변환된 코드를 Runtime Data Areas 에 클래스 단위로 로드시키고, Link 를 통해 적절히 배치시키는 작업을 한다. Class Loader 로 인해 동적으로 클래스를 로드할 수 있다.

Execution Engine

Runtime Data Areas 에 배치된 바이트 코드를 실행시키는 역할을 한다. 메모리에 올라온 코드를 명령어 단위로 실행한다.

Garbage Collector

어플리케이션이 생성한 객체의 생존여부를 판단하여 더 이상 사용되지 않는 객체의 메모리를 반환함으로써 메모리를 자동적으로 관리하는 역할을 한다.

Runtime Data Areas

운영체제로부터 할당받은 메모리를 관리하는 영역이다. JVM 에서 관리하는 메모리 영역은 Method(Static or Class) Area, Runtime Constant Pool, Heap Area, Stack Area, PC Register, Native Method Stack Area 으로 나뉜다.

Method (Static or Class) Area

호출한 클래스와 인터페이스에 대한 Runtime Constant Pool, 메소드와 필드, Statoc 변수, 메소드 바이트 코드 등을 저장한다.

Runtime Constant Pool

Method Area 영역에 포함되는 공간이다. 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 reference를 저장한다.

 

위의 내용중 Runtime Data Areas가 바로 이번에 설명하려고 했던 Java 메모리 구조부분입니다. Java의 메모리 구조는 다음과 같습니다.

 

 

 

Method (Static) Area

JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간입니다.
Runtime Constant Pool

메소드 영역에 포함되지만 독자적 중요성이 있습니다. 클래스 파일 constant_pool 테이블에 해당하는 영역으로 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장합니다. JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조합니다.

 

 

Heap Area

런타임에서 동적으로 할당하는 객체를 저장하는 공간입니다. new연산을 통해 생성되는 객체와 배열을 저장하며 GC의 주 대상이 됩니다.

Heap Area 메모리 관리 (GC 관련)

  • Young Generation - 객체가 생성되자마자 저장되는 공간입니다. 시간이 지날수록 우선순위가 낮아지며 Old 영역으로 내려가게 됩니다. 이곳에서 객체가 사라지면 Minor GC 가 발생합니다.
  • Old Generation - 오래된 객체가 저장되는 공간이다. 이곳에서 객체가 사라지면 Major GC 가 발생합니다.
  • Permanent Generation - Class Loader 에 의해 로드되는 클래스나 메소드에 대한 Meta 정보가 저장되는 영역입니다. Reflection을 이용하여 동적으로 클래스를 로드하는 경우 자주 사용됩니다.

Stack Area

Stack 구조의 저장공간입니다. 함수 호출시 발생하는 지역변수, 매개변수, 연산 데이터 등을 저장하는 공간입니다. 함수를 호출하면 push를 통해 Stack 에 저장하고 함수 호출이 종료되면 다음 실행할 함수를 pop하여 함수를 실행합니다. 스레드 별로 저장공간을 따로 생성하여 관리합니다.

PC Register

현재 수행 중이거나 다음에 실행할 인스트럭션 주소를 저장합니다. 연산 수행 중 발생하는 데이터를 레지스터에 저장하였다가 CPU가 필요할 때 가져다 씁니다. 스레드 별로 공간을 만들어 관리합니다.

Native Method Stack Area

자바가 접근할 수 없는 영역은 C와 같은 Low Level 언어로 작성되어 있습니다. 따라서 Native 코드를 실행시키면서 발생하는 데이터를 Stack 구조로 저장하기 위한 공간입니다. 스레드 별로 생성됩니다.

 

 

참조 - https://hyeonu1258.github.io/2018/04/01/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%912/

https://hoonmaro.tistory.com/19

반응형

'2023년 이전 > 기타' 카테고리의 다른 글

면접준비-Android & Java 편  (0) 2020.01.28