자바기초문법

JVM 구조와 메모리

까마귀코딩 2023. 1. 26. 12:41

안녕하세요 ~!

 오늘은 JVM & 메모리에 대해 설명해 보려고 합니다~~

 

 

jvm동작과정은 어떻게 될까요?

 

jvm이란 무엇을 말하는걸까요?

 

- jvm은 자바 버츄얼 머신, 자바가상머신을 뜻하는데요,

자바 바이트 코드를 해석하고 실행하는 역할을 합니다.

 

- 자바코드는 jvm 을 통해 실행되므로 os에서 동일하게 실행할수 있다는 장점이 있습니다.

 

jvm 으로 문제를 해결 

- 자바 바이트 코드는 타겟 플랫폼에 상관없이 jvm 위에서 동작합니다.

- 물론, jvm은 타겟 플랫폼에 의존합니다.

 

 

 

 

구체적으로 메모리 영역을 공부하기 전에 jvm 이 자바 소스코드를 어떻게 해서 os에서 실행하는지 과정을 살펴봅시다.

 

 

 

 

1. 자바소스코드 ( .java ) 파일을 컴파일러가 자바바이트코드 ( .class ) 파일로 변환

 

2. [ .class ] 코드를 jvm의 클래스 로더에게 보냄

 

3. 클래스 로더가 jvm 런타임 데이터영역으로 로딩하여 jvm의 메모리에 올림

 

 

 

 

 


 

 

 

 

 

 

모든 자바 프로그램은 JVM을 통해 실행됩니다.
일단 프로그램이 실행되면 JVM은 OS로부터 프로그램을 수행하는데 필요한 메모리를 할당받습니다.

 

받은 메모리를 가지고 JVM 은 용도에 따라 구분해서 사용합니다 😃👍

 

 

 

 

ㄲㅏ먹지말자!

 


더알아보기


가비지 컬렉터 (Garbage Collector ,GC)

사용하지 않는 메모리를 쌓아두면  이또한 성능개선에 영향이 있겠죠?

이런 쓰레기값들을 누가 어떻게 처리할까요?

 

 

 

당연히 jvm 이 처리하는데,

가비지 컬렉터(garbage collector)를 이용하여 Heap 메모리 영역에서 더는 사용하지 않는 메모리를 자동으로 회수할수 있도록 합니다.

 

 

 

JAVA는 이 가비지 컬렉터를 이용해 자동으로 메모리를 실시간 최적화 시켜줍니다.

따라서 개발자가 따로 메모리를 관리하지 않아도 되니, 더욱 손쉽게 프로그래밍을 할 수 있겠죠?

 

 


런타임 데이터 영역 ( jvm 메모리 영역 )


jvm 메모리 영역은 어떤걸 말하는걸까?

 

자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역입니당

 

 

총 5개인거 같군요

 

 

 

 

 

풀어서 간단히 설명하자면,


Method Area - 스태틱 영역

 

== jvm에서 읽어들인 클래스와 인터페이스에 대한

런타임 상수 풀, 메서드와 필드 , Static 변수, 메서드 바이트 코드 등을 보관하는 용도입니다 !!

 

== jvm 시작시 생성되고 프로그램 종료시까지 사용합니다.

 

== 모든 스레드에서 공유합니다. 

 


Heap Area - 힙 영역

 

== 프로그램 상에서 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용하는 메모리 영역입니다 !! 

== NEW 연산자를 통해 생성한 객체나, 인스턴스 배열을 저장합니다 !!

== jvm이 관리합니다 !!

== 가비지 컬렉션 대상이 되는 공간입니다 !!

 

 

==객체가 더이상 쓰지 않거나, 명시적으로 null 선언시까지 사용합니다.

 

== 모든 스레드에서 공유합니다. 


Stack Area - 스택 영역

 

== 선입후출 구조 , 메서드 호출시 생성되는 쓰레드 수행정보를 기록하는 Frame 저장,

메서드 정보, 지역변수, 매개변수, 연산 중 발생하는 /  임시 적으로 저장  !!

 

 

==  { } 가 끝나는 시점이나, 메서드가 끝날때까지 사용합니다.

 

== 각 스레드별로 생성합니다. 

 

 

 

 

예를들어 Person p = new Person(); 와 같이 클래스를 생성할 경우,

 

 new 에 의해 생성된 클래스는 Heap Area 에 저장되고, 

Stack Area 에는 생성된 클래스의 참조인 p 만 저장됩니다.

 

 

 

 

스택 영역은 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당됩니다.

프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없습니다.

만일 고정된 크기의 JVM 스택에서 프로그램 실행 중 메모리 크기가 충분하지 않다면???

StackOverFlowError가 발생하게 됩니다.

쓰레드를 종료하면 런타임 스택도 사라집니다.


PC 레지스터 Area - pc 레지스터 영역

 

== 현재 실행중인 jvm 주소를 가지고 있습니다. 

== cpu 명령어 즉 instruction 을 수행합니다.

== cpu instruction 수행하는동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장,

연산 및 결과값을 메모리에 전달하기전 cpu내부 기억장치 입니다.

 

== .

 

== 각 스레드별로 생성합니다. 


Native Method Stack Area - 네이티브 메소드 스텍 영역

 

== 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 입니다.

 

== native interface 호출 및 종료시 생성됩니다. 

 

== 각 스레드별로 생성합니다


 

 [ Method Area ],[  Heap Area ] 는 모든 쓰레드(Thread)가 공유하는 영역이고, 

나머지[ Stack Area ], [ PC Register ], [ Native Method Stack ]은 각 쓰레드 마다 생성되는 개별 영역입니다.

 

스레드마다 생성되는 것들과 / 개별생성되는 영역들