JAVA - JVM에 대해 알아보자 -1

2022. 2. 18. 04:28Java

반응형

Java에 대해 알고 있는가?


 자바는 썬 마이크로시스템즈의 제임스 고슬링과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이다.(순수 객체 지향 언어X)

91년 그린 프로젝트라는 이름으로 시작해 95년에 발표된 언어이다. 처음에는 가전제품 내에 탐재해 동작하는 프로그램을 위해 개발된 언어이지만 지금은 웹 어플리케이션 개발에 가장 많이 사용하는 언어 가운데 하나이며(자바 공화국인 한국에서는 더더욱), 코틀린이 등장하기 이전까지 안드로이드 앱도 모두 자바로 만들었다.  

 

 썬 마이크로시스템즈가 Oracle에 인수되면서 저작권도 Oracle로 넘어갔다. OpenJDK는 'Open' 답게 GPL2(오픈소스) 이지만, Oracle JDK는 상업라이선스라서 유료화정책의 수순을 밟고있다.

 

자바 언어는 다음 5가지 핵심 목표를 지니고 있다.

  • 객체 지향 방법론을 사용해야 한다.
  • 같은 프로그램이 여러 운영체제에서 실행될 수 있어야 한다.(플랫폼 독립)
  • 컴퓨터 네트워크 접근 기능이 기본으로 탑재되어 있어야 한다.
  • 원격 코드를 안전하게 실행할 수 있어야 한다.
  • 다른 객체 지향 언어들의 좋은 부분만 가지고 와서 사용하기 편해야 한다.

 

 자바의 특징 하나를 꼽으라면 다른 컴파일언어와 다르게 플랫폼 독립적인 것을 꼽을 수 있을 것이다. 그럼 다른 컴파일 언어는 플랫폼 종속적이이란 말인가? 플랫폼 종속적이라는게 대체 무슨말이지?

 

 이 플랫폼이라는 것은 CPU와 운영체제 등을 말하는데, 플랫폼 종속적인 것은 CPU/운영체제에 맞는 기계어 코드로 컴파일이 된다는 것이다. 그럼 이 CPU/운영체제가 아닌 다른 곳에서는 컴파일 된 기계어를 실행시킬 수 없는 것이다.

결국 플랫폼 종속적이라는 말은 공간적 제약을 받는 것과 마찬가지다(뇌피셜) 

 

그럼 자바는 어떻게 플랫폼 독립적으로 기계어 번역(컴파일)을 할 수 있었을까? 바로 JVM 덕분이다.

 

그럼 JVM에 대해서 알아보자.

 

JVM(Java Virtual Machine)


JVM에 대해서 상세하게 이해하려면 C/C++과의 차이를 아는 것이 중요하다.

 

C는 다들 아시다시피 절차지향 언어이면서 어셈블리어 다음으로 기계 레벨까지 접근 가능한 매우 강력한 언어이다. 

특히 이러한 강점은 포인터에서 나오는데 C++ 역시 C의 이런 강점을 그대로 가져오면서 거기에 객체 지향이나 일반화 프로그래밍과 같은 멀티 패러다임을 지원하고자 하는 시도에서 탄생하게 된 언어이다.

그렇다보니 고수준, 저수준의 개념을 모두 포함하게 되었고, 상당히 복잡해졌다.

 

JVM은 Java Virtual Machine의 준말로 번역하면 자가 가상 머신 정도가 되겠다.

우리가 흔히 알고 있는 가상 머신은 주로 운영체제를 실행시키는데 JVM도 비슷한 맥락일까라는 의문이 든다.

 

JVM은 Java로 개발한 프로그램을 컴파일하여 만들어지는 바이트코드를 실행시키기 위한 가상머신이다.

Java 컴파일러가 프론트엔드를 담당한다면 JVM은 코드 최적화와 백엔드를 담당한다고 나무위키에 나온다.

 

그럼 프론트와 백엔드의 통신 방식을 생각한다면 중간자가 있어야 할 것이다(JSON처럼)

Java는 javac 컴파일러를 거쳐 바이트코드로 변환되며, 이 바이트 코드는 JRE에 들어있는 Java classloader에 의해 JVM으로

적재되고 JVM에 적재된 바이트 코드를 JIT(Just-in-time) 컴파일 방식으로 실행한다.

 

아....

알아봐야할 것들이 많아졌다. Java Classloader(이하 자바 클래스로더)는 뭘까?

 

여기에 대해서는 아래 글을 참고하자.

 

 

Java ClassLoader(클래스로더)에 관한 기본적인 이해 -1

Java ClassLoader란? 자바 클래스 로더는 JVM에서 핵심적인 역할을 한다. JVM이 뭔지 상세히 알고 싶다면 아래 글로 오길 바란다. 자바 클래스로더는 JVM으로 동적 로드하는 자바 런타임 환경(JRE)의 일부

mirrorofcode.tistory.com

 

바이트코드가 JVM에 '적재' 된다는 표현에서 알 수 있듯, JVM은 스택 기반이어서 대다수의 명령어가 스택 선두에서 피연산자를 택하고 결과를 다시 스택에 넣는 형식이다. 

그럼 스택은 언제 만들어질까? 바로 JVM 스레드가 생겨날 떄, 해당 스레드를 위한 스택도 같이 만들어진다.

스택엔 뭐가 들어갈까? 스택에는 프레임이 들어간다.

그렇다면 프레임은 뭘까? 프레임은 메소드가 호출될 때마다 만들어지며, 메소드 상태 정보를 저장한다.

 

더 자세한 내용을 알고 싶다면 종립님 블로글 찾아가보자.

 

JVM stack과 frame

 

johngrib.github.io

 

이쯤에서 JVM의 특성을 정리해보자.

 

  • 스택 기반의 가상 머신
  • 모든 기본 타입의 정의를 명확히 함으로써 플랫폼 독립성 보장

 

다른 특성들은 2편에서 다루겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형