[Java] JVM에 대해 이해하기

    아이폰(iPhone)과 안드로이드폰(Android)을 둘다 써봤다면 상대적으로 뛰어난 아이폰의 성능에 감탄하는 경우가 많을 것이다. 그런데 아이러니한 것은 아이폰이 안드로이드폰보다 하드웨어적인 부분에서 상당히 부족한 경우가 많다는 것이다. 

     

    안드로이드를 만든 업체가 구글이라는 것을 감안할 때, 아이폰과 구글의 SW의 차이가 큰 것인가? 생각하면 잘못된 판단이다. 이는 아이폰의 폐쇄적인 소프트웨어와 안드로이드의 개방적인 소프트웨어의 차이일 뿐이고, 정확히 말해서 컨셉의 차이이다. 

     

    안드로이드의 프로그램은 자바(Java) 베이스이다. 한마디로 자바를 할 줄 알면 안드로이드 App을 만드는데 크게 지장이 없다는 소리이다. 반대로 아이폰은 C언어 기반으로 프로그램을 짜야 한다.

     

    C언어로 짠 프로그램은 OS에 맞게 프로그램을 최적화 시켜주는 작업을 진행해야 한다. 이 작업을 빌드(Build)라고 하며 그러다보니 환경이 다른 곳에서는 실행이 되질 않는다. 예를 들어 윈도우 기반의 프로그램들이 MacOS에서 작동이 되질 않는다는 사실은 많은 사람들이 알고 있는 상식이다.

     

    Java언어로 짠 프로그램은 OS에 맞게 프로그램을 최적화 시켜주는 작업을 진행하지 않는다. 왜냐하면 자바는 OS에 따라 프로그램의 빌드를 다르게 하는 것이 아니라 한번더 감싸주는 JVM 환경에 따라 다르기 때문이다. 

     

     

    JVM(Java Virtual Machine)의 개념

     

    JVM은 어떤 환경이든지 간에 JVM을 설치할 수 있는 환경이라면 Java를 실행시켜줄 수 있는 환경을 만들어 버린다. 즉 실제 환경에 가상환경을 랩핑하여 내가 만든 자바 프로그램이 리눅스이든 MacOS이든 윈도우든 아무런 상관이 없어지며 해당 OS에는 단지 JVM만 설치되어 있으면 그만이다.

     

    JVM의 개념

    이는 마치 현대의 플랫폼과 비슷한 개념이라 볼 수 있다. 배달의 민족의 경우, 어떤 음식점이든 배달의 민족 플랫폼으로 주문거래가 되는 것처럼 JVM만 설치하면 그 어떤 환경도 동일한 경험으로 실행할 수 있게 된다.

     

    Java, JVM의 장점

     

    이렇게보면 JVM은 C언어와 같은 개념보다 초월한 느낌이라 볼 수 있는데 사실은 둘의 장단점이 너무 명확하다. 

     

    개발 진입

    물론 대다수의 사람들은 처음에 언어를 배울 때 C를 배우면서 시작을 한다. 하지만 그 C언어를 가지고 어디까지 진행이 될지를 생각해보면 답이 쉽게 나올 것이다. 일반적으로 자바는 C언어보다 다루기가 훨씬 쉽다. 자바는 C언어의 포인터와 메모리 관리 부분을 빼버리면서 진입 장벽을 상당히 많이 낮췄다.

     

    GC(Garbage Collection)

    가비지 컬렉션은 메모리를 알아서 관리해주는 일종의 쓰레기 청소 프로그램이다. 자바를 하는 동안에는 GC가 꾸준히 일을 해주면서 불필요한 메모리를 삭제해주는 작업들을 수행한다. 그래서 대다수의 자바 개발자는 GC를 핸들링하는 일이 없이 끝나는 경우가 많으며 몇몇 퍼포먼스를 생각하는 개발자는 GC를 핸들링하여 자바 어플리케이션의 성능을 더 높이는 작업도 진행한다

     

    나에게 GC는 매트릭스의 요원을 떠올리게 한다

     

    타언어의 접근

    자바의 핵심(JVM 같은)은 계승하고 단점(C언어는 아니지만 그나마 어렵고, 많이 짜야 한다)을 제거하는 언어들이 최근 트렌드이며 자바에서 파생된 대표적인 Javascript같은 경우는 node.js를 비롯하여 다양한 스크립트성 언어들이 등장하면서 소스는 더 라이트해졌다.

     

    그래서 자바를 핸들링할 줄 아는 개발자라면 최근 트렌드 언어들은 충분히 빠르게 습득하고도 남을 정도이다.

     

    JVM의 구성요소

     

    클래스 로더(Class Loader)

    자바는 수많은 클래스(class) 들로 이루어져 있는데 이 클래스(.class 파일)를 적재하는 것을 담당한다.

     

    실행데이터 영역(Run-time Data Area)

    메소드 영역(Method area), 힙 영엽(Heap area), 스택 영역(Stack area), Native method 스택, PC 레지스터(register) 영역으로 구성되어 있다. 한마디로 자바 안에 자리 잡은 데이터 영역을 담당한다

     

    실행엔진 (Execution Engine)

    한마디로 .class(클래스) 파일을 해석하는 녀석으로, 클래스 로더에서 적재된 것을 실행 엔진에서 실행한다. 이때 데이터는 당연히 실행데이터 영역을 접근하여 진행한다

     

    가비지 콜렉터 (Garbage Collector)

    메모리 영역에 남아있는 데이터를 효율적으로 관리(삭제)해주는 내장 프로그램

     

     

    반응형

    댓글

    Designed by JB FACTORY