본문 바로가기
public void static main()/Java

[JAVA] JVM Memory

by 햄리뮤 2022. 2. 18.
반응형

강의를 듣다가 정리를 하는게 좋다고 생각해서! JVM Memory는 무엇인가에 대해 글을 쓴다라리

https://dev.to/veerugithubcode/jvm-architecture-4p0

JVM 이란?

  • 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체!
  • CPU나 운영체제의 종류와 무관하게 실행이 가능함!
  • JVM의 구성
    • Class Loader
    • Execution Engine
    • Grabage Collector
    • Runtime Data Area

https://jeong-pro.tistory.com/148

Class Loader

  • 변환된 Byte code(.class) 파일을 JVM 내로 class를 로드하고 Link작업을 통해 배치 등 일련의 작업을 한다! 또 런타임시 class를 load 한다!

Execution Engine

  • class loader를 통해 JVM 내부로 넘어와 Runtime Data Area (JVM 메모리)에 배치된 Byte code들을 명령어 단위로 실행시킴!

Garbage Collector

  • 어플리케이션이 생성한 객체의 생존 여부를 판단하며, 더이상 참조되지 않거나 null 인 객체의 메모리를 해체시켜 메모리 반납을 한다.
  • Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
  • GC가 역할을 하는 시간은 정확히 언제인지 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음!)
  • GC가 수행되는 동안 GC를 수향하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다. 특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다!!

Runtime Data Areas(JVM 메모리)

  • JVM 메모리로 Java 어플리케이션이 싱행하면서 할당받은 메모리 영역이다.
  • Method,Runtime, Constant Pool, Heap, Stack, PC Register, Native Method Stack)의 영역으로 나뉨!

https://limkydev.tistory.com/51

Method area (static) (모든 스레드에서 공유)

[사용기간]

JVM 시작시 생성

프로그램 종료 시까지 명시적으로 null 선언시 GC대상

구성방식이나 GC방법은 JVM 벤더마다 약간 다를 수 있음

  • 클래스 맴버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보와 같은 메소드 정보, Type정보(Interface 인지 class 인지), Constant Pool(상수 풀: 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역이다!

Heap area (모든 스레드에서 공유)

[사용기간]

객체가 더 이상 쓰지 않거나, 명시적으로 null 선언시 GC대상

구성방식이나 GC 방법은 JVM 벤더마다 다를 수 있음

  • new 키워드로 생성된 객체와 배열이 생성되는 영역이다!
  • 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다!
  • Young Generation: 객체가 생성될 때 저장된다. 막 생성된 객체들의 인큐베이터이다!(오~ 아주 재밌는 표현) 생성된 기간이 흐르고, 우선 순위가 낮아지면 Young 세대의 객체들은 Old세대로 이동하게 된다. 이 영역에서 객체가 사라질 때는 Minor GC가 수행된다.
  • Old(Tenured) Generation: Young Generation 영역에 있는 객체가 오래되서 저장되는 공간이다. 이 영역에서 객체가 사라질 때는 Major GC(Full GC)가 수행된다.
  • Permanent Gerneration: 클래스 로더에 의해 로드 되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역으로 JVM 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.
  • 더 자세한 것은 https://jeong-pro.tistory.com/148  참조!

https://velog.io/@agugu95/%EC%9E%90%EB%B0%94%EC%99%80-JVM-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

Stack area (각 스레드별로 생성)

[사용기간]

{}나 메서드가 끝날때

  • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다!
  • [Call by value] int a = 10; 이라는 코드를 작성했다면 정수값이 할당될 수 있는 메모리 공간을 a(변수이름)라고 잡아두고 그 메모리 영역에 값이 10이 들어간다! 즉, stack에 메모리에 이름이 a라고 붙여주고 값이 10인 메모리 공간을 만든다!
  • [Call by reference] Lima l = new Lima(); 라는 소스를 작성했다면 Lima l은 stack 영역에 생성되고 new로 생성된 Lima 클래스의 인스턴스는 Heap 영역에 생성된다.
  • stack영역에 생성된 l의 값으로 heap영역의 주소값을 가지고있다. stack 영역에 생성된 l이 heap영역에 생성된 객체를 참조하고 있는 것이다.
  • 메소드를 호출할 때마다 개별적으로 stack이 생성된다!

PC register (각 스레드별로 생성)

  • Thread가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다(cpu의 레지스터와 다르다!)

Native method stack (각 스레드별로 생성)

[사용 기간]

native interface 호출시 생성

native interface 종료시 생성

  • 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다!
  • 보통 C/C++ 등의 코드를 수행하기 위한 스택 이라고 한다!

 

오늘은 JVM 구조에 대해서 알아보았따!

이제 그만 알아보자!

 

 

https://velog.io/@agugu95/%EC%9E%90%EB%B0%94%EC%99%80-JVM-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

자바와 JVM 메모리 구조

JVM (Java Virtual Machine)과 메모리 할당

velog.io

https://limkydev.tistory.com/51

 

[Java] JVM 메모리 구조

오늘은 자바 JVM의 메모리에 대해서 알아보도록 하겠다. 사실 JVM 메모리에 대해서 왜 알아야할까? 스스로 자문했을 때 메모리 관리정도?라고 답변을 했다. 소규모프로젝트나 간단한프로그램을

limkydev.tistory.com

https://jeong-pro.tistory.com/148

 

JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정

JVM(Java Virtual Machine) : 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다. CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다. 즉, 운영체제 위에서 동작하는 프로세스로 자

jeong-pro.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글