인프런 널널한 개발자 강사님의 기초 탄탄! 독하게 시작하는 Java - Part2 : OOP와 JVM의 강의 중 JVM내용 정리
개발을 하고 서비스를 하면서 장애가 났을때에 다양한 원인이 있겠지만, 해결을 하려할 때 JVM에 대한 깊은 이해가 없을경우 해결을 못하는 경우가 있습니다.
JVM에 대한 이해를 쌓고자 강의를 들으면서 알게 된 것들과 중요한 내용을 지금부터 정리해보겠습니다
JVM은 결과적으로 보면 프로세스이다. java.exe 실행 파일을 실행시켜서 그 위에서 내가 만든 어플리케이션을 돌리는 것이다.
JVM은 기본적으로 Virtual Machine이다.
여담
널널한 개발자님 강의를 보다 보면 설명을 하시면서 물리적/논리적 개념으로 나누는데
물리적인 부분 == H/W
논리적인 부분 == S/W
으로 봐도 된다.
또한 논리적이다 라는 말은 가상이라는 개념으로 봐도 된다고 종종 말씀하신다.
logical 을 IT쪽에서는 Virtual이라고 한다.
그리고 컴퓨터에서 CPU를 machine이라고도 한다고 하는데 그렇다면
Vircual Machine이다 라고 하면 CPU를 논리적으로 구현한것이다 라고 해석할 수 있다.
강사님께서 정말 많이 자주 그리시는 컴퓨터의 형태이다.
하드웨어 영역과 소프트웨어 영역으로 나누어져 있고, 소프트웨어영역은 Application영역과 System영역이 있다. System 영역의 가장 대표적인게 운영체제인데, 운영체제의 핵심적인 알맹이를 커널이라고 한다.
커널은 그림에서 Kernel 영역에서 돌아가는 것이고
User Mode Application 영역이 있는데, 이것은 이제 위 그림에서 User 영역에서 돌아가는것이다.
우리가 소위 Native라고 부르는 영역은 H/W부터 Kernel까지 포함하는 구간이다.
그래서 그 부분을 개발하는것은 C/C++과 같이 Native언어로 개발을 하는데, C/C++코드가 CPU가 이해할 수 있는 언어로 직접 번역이 되어 실행합니다.
그렇기떄문에 H/W나 OS에 의존성이 있고, 의존성이 있다는 말은 Window에서 개발한 C/C++코드가 있으면 그 코드는 리눅스에서 제대로 동작하지 않을 수 있다는 것입니다.
처음에 말했듯 VM이라는 것은 컴퓨터를 소프트웨어적으로 구현한 것이다. 머신은 머신인데 이 머신이 인식할 수 있는 코드가 자바 바이트 코드라면 그걸 JVM 이라고 한다는 것이다.
결과적으로 JVM이라는것을 말하면 소프트웨어로 CPU도 구현돼있고, RAM도 구현돼있고, SSD도 구현돼있는 것이다. 따라서 JVM은 User Mode Applicatio 프로세스 임과 동시에 가상 메모리 공간을 RAM이나 보조기억장치처럼 활용 하면서 동시에 머신으로 연산도 해주는기능을 모두 포함하고 추가로 운영체제가 제공하는 기능 일부까지 다 들어있습니다.
따라서 JVM은 CS론에서 "OS/컴퓨터구조 를 전부 섞어서 C나 C++로 구현" 한게 JVM이 된다는 것이다.
그래서 위에서 잠깐 설명한 네이티브영역을 개발하는 언어들과 다르게 JVM만 있다면 내가 만든 자바코드는 JVM이 돌려주기 때문에 OS에 영향이 없이 JVM만 있다면 돌릴 수 있는 것이다.
C++ 과 Java의 메모리 관리 차이
C++ | Java |
- 객체에 대한 모든 관리 책임은 개발자에 있다.(소유권, 메모리 할당 및 해제) - 객체의 생명주기에 모두 개입하는 구조 |
- 객체 메모리 해제는 전적으로 JVM몫이다.(개발자에게는 소유권도 책임도 없음) - 문제 발생 시 구조를 알아야 대응이 가능함 |
C++은 자유도가 극상에 가깝다. 근데 자유도가 극상인 만큼 책임도 많이 져야한다.
자바는 GC가 메모리관리를 해준다.
JVM 구성요소
1. Class Loader, 2. Runtime Data Area, 3. Execution Engine으로 크게 3가지 영역으로 나뉜다.
아무 영역에 속하지 않은 Native Method이쪽은 User Mode가 아닌 Kernel모드 수준에서의 API를 호출하게 해주는걸 가능하게 해준다.
나는 3가지 영역에 대해서만 알아볼거고, 2번 Runtime Data Area영역이 가장 중요하다고 한다.
'CS > JAVA' 카테고리의 다른 글
JVM 이해하기 (2) - Class Loader (2) | 2025.01.29 |
---|---|
옵저버 패턴 정리 (0) | 2024.07.21 |