모든 프로그램은 프로그램의 실행에 있어 OS에게 시스템 리소스의 일부인 메모리를 할당 받아야 한다.
그렇기에 일반적으로 운영체제에 종속되어 실행된다.
Java 프로그램은 JVM(Java Virtual Machine)이라는 프로그램을 사용해 운영체제에 종속되지 않고 중립적으로 실행될 수 있다.
예시 그림과 같이 일반 프로그램은 운영체제를 통해 Hardware에 접근하기 때문에 OS에 종속적인 것이다.
하지만 자바는 프로그램 후에 JVM을 통해 OS에 접근하기 때문에 운영체제에 종속되지 않는 것이다.
Java의 중립적 클래스 설계를 올바르게 하여 만들어진 코드는 OS와 상관없이 재사용이 가능한데, 이를 가능하게 해주는 것이 JVM인 것이다.
위와 같이 장점도 있지만 일반 프로그램과는 다르게 중간에 JVM이 추가되었기에 운영체제가 직접 프로그램을 실행시키는 방식보다는 속도면에서 느리다는 단점도 있다. 그러나 기술의 발달로 Hardware의 스펙이 상향평준화되어 Java의 단점을 보완할 수준으로 올라와있다.
🤔JVM
- Java와 OS 사이에 중계자 역할
- Java코드의 재사용성을 높임
- 메모리 관리 기능으로 GC(Garbage Collection)이 있다
자바 프로그램이 실행되는 과정
- 자바 소스, 코드를 작성(*.java)
- Java Compiler를 통해 소스파일을 컴파일함 (javac.exe 사용)
- 컴파일 된 코드는 Java Byte Code, JVM이 실행가능한 형태 파일로 변환된다.(*.class)
- JVM은 컴파일이 완료된 *.class 파일을 Class Loader로 읽어들이면서 프로그램을 시작한다
Class Loader
- JVM 안으로 클래스를 로드, 링크를 통해 배치하는 작업을 수행하는 모듈.
Runtime 시에 동적으로 클래스를 로드한다
Execution Engine
- 클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이는 엔진에 의해 실행된다.
- 실행 엔진은 자바 바이트코드를 명령어 단위로 읽어 실행된다
Runtime Data Areas
- JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. 여러가지 세부 항목으로 나뉘어지나, 보통은 크게 3가지로 분류된다. 두둥탁이 분류된 3가지다.
두둥탁 메소드 영역(Method Area)
- 메소드 영역은 모든 스레드의 공유 영역으로 JVM 시작 시에 생성된다
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*.class)를 읽어서 분석하고, 그 정보를 저장한다
- JVM이 읽어들인 각각의 클래스와 인터페이스에 대한 런타임 상수 플, 필드, 메소드 정보, static변수, 메소드의 바이트 코드 등을 보관
두둥탁 힙 영역(Heap)
- 객체(인스턴스)가 생성되는 공간. 프로그램 실행 중 생성되는 모든 객체는 이곳에 생성된다.(동적 할당)
- 사용자에 의해 관리되는 영역
- 가비지 컬렉션의 대상
- new 키워드를 통해 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
두둥탁 스택 영역(Stack)
- 자바 프로그램에서 호출될 때 메소드의 스택 프레임이 저장되는 영역
- 메소드의 작업에 필요한 메모리 공간을 제공
- JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장
- 메소드의 호출과 함께 할당, 메소드의 호출 완료 시 소멸(메소드가 작업을 마치면 할당된 메모리 공간은 반환)
- 스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임(stack frame)이라고 한다
- 호출 스택의 최상단에 위치하는 메소드가 현재 실행 중인 메소드며, 나머지는 대기상태로 있게 된다.
- 푸시(push)동작을 통해 저장, 팝(pop) 동작을 통해 데이터를 인출
- 후입선출(LIFO, Last-In First-Out)방식으로 동작
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
참고 자료:
https://coding-factory.tistory.com/830
http://www.tcpschool.com/java/java_methodConstructor_method
http://www.tcpschool.com/java/java_array_memory
https://velog.io/@yaincoding/%EC%9E%90%EB%B0%94-%EC%8B%A4%ED%96%89-%EA%B5%AC%EC%A1%B0%EC%99%80-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD
http://www.tcpschool.com/java/java_array_memory
'책벌레와 벌레 그 사이 어딘가 > 개념쌓기' 카테고리의 다른 글
[개념쌓기] 직렬화(Serialization)? (0) | 2023.01.15 |
---|---|
[개념쌓기] Object class? 자바의 최상위 클래스 (0) | 2023.01.12 |
[개념쌓기] 가비지컬렉터? JVM에서 힙? (0) | 2023.01.09 |
[개념쌓기] 메모리? 스택,힙? (0) | 2023.01.06 |
[개념쌓기] HATEOAS? (0) | 2023.01.04 |
댓글