JVM
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 생성 타이밍