필자A 2021. 12. 21. 14:19

java8을 기점으로 구조나 동작 방식이 변경되었다고 합니다 ^^...

정확한 내용은 다를 블로그를 참조해주세요

 


 

JVM (Java Virtual Machine)

java확장자 파일을 compile하여 class확장자 파일(byte code)을 만들어 - compile

class 확장자 파일을 사용하여 java application을 동작하게 합니다. - runtime

 

JVM의 역할은 자바 애플리케이션을 JVM내의 클래스 로더로 읽어 실행시키는 것입니다.

그리고 OS들에 구애받지 않고 사용할 수 있게 JAVA와 OS사이에서 중개자 역할을 합니다.

또한 JVM내에 GC(Garbage Collector)가 존재해 사용되지 않는(참조) 데이터들을 정리합니다.

 

( 수정 필요 )

JVM 구조는 크게 4가지입니다.

  • Class Loader
  • Execution Engine
  • Runtime Data Area
  • Garbage Collector

먼저 Runtime Data Area의 요소에는 

Method Area, Heap Area, Stack Area, PC register Native Method Stack이 있습니다.

 

method Area : 모든 쓰레드가 공유하는 영역, 클래스, 인터페이스, static변수 등을 보관

Heap Area : method Area와 같이 모든 스레드가 공유합니다. method Area영역에 로드된 클래스만 생성 가능합니다.

이쪽에서는 GC의 영향을 받습니다.

stack Area : 메서드 호출시마다  메서드 단위마다 1개씩 생성됩니다.

메서드 안에서 생성되는 값들이 저장되며 끝날 시 그 stack Area에 해당되는 것들은 삭제됩니다.

Native Method Stack : 다른 언어로 작성된 네이티브 코드들을 위한 영역

PC Register : 스레드가 실행될 때 생성되며 스레드마다 1개씩 가집니다. 스레드 안의 명령으로 실행되야할지를 기록합니다.

 

Class Loader :

JVM내로 클래스 파일(. class)을 로드합니다.  런타임 때에 동적으로 수행됩니다.

Garbage Collector :

Heap Area영역 중 참조되지 않는 값들을 지우는 일을 합니다.

Runtime Data Area :

위에서 설명했지만 애플리케이션 실행에 있어 필요한 데이터를 보관하는 공간입니다.

Excution Engine :

Class Loader에 의해 로드된 바이트코드를 실행하는 요소입니다.

배치를 Loader가 하고 실행을 Engine이 한다고 알고 있습니다.

 


1. static을 사용한 간단한 사용 방식

 

static keyword를 사용한 식별자와 함수는 java application(app)이  시작될 때 메모리에 적재된다고 합니다.

그 외 non statitc은 runtime환경에서 인스턴스 생성 시 heap영역에 적재됩니다.

 

static 한 값들에서 non static값을 참조할 수 있을까?

non static 값들은 인스턴스 생성 시  메모리에 적재되어 그보다 빠른 타이밍의 static 키워드에서 참조가 불가합니다.

반대로 느린 타이밍의 non static에서는 static을 참조가 가능합니다.

 

2. static + spring bean

 

spring bean 생성과 static val 생성 타이밍

반응형