[안드로이드-그 한계를 넘어서] 2장. 안드로이드를 위한 효과적인 자바 코드

자바 코드는 바이트코드라는 중간 형식으로 컴파일된다.

“한 번 작성하고, 모든 곳에서 실행할 수 있는” 장점뿐 아니라 자바에서는 가비지컬렉터를 통한 자동 메모리 관리 기능이라는 장점을 제공해 개발자가 코드에서 사용하지 않는 객체의 메모리를 해체하는 수고를 하지 않아도 되게 해준다. 이 기능은 매우 유용하고 코드에서 메모리 관련 버그가 생길 가능성을 크게 줄여지만 가비지 컬렉션 프로세스가 계속해서 실행되야하므로 실행 성능에 부담이 된다.

### 안드로이드 달빅과 자바 SE 비교

안드로이드 개발자들이 자바 SE의 컴파일러를 사용해 애플리케이션을 개발하기는 하지만 자바와 안드로이드 기기에서 자바가 동작하는 방식사이에는 매우 큰 차이가 있다.

안드로이드 기기에서 실행되는 가상머신을 달빅.물론 지금은 ART라는것이지만..

자바SE와 달빅 사이에는 몃 가지 차이점이 있는데, 주로 가상머신과 관련 있다. 자바 SE에서는 스택 머신 설계를 사용하는 데 반해 달빅은 레지스터 기반 머신 바이트코드로 변해주는 dx라는 툴이 있다.

안드로이드는 역사적인 이유로 레지스터 기반 머신을 사용한다. 레지스터 기반 머신은 스택 기반 머신보다 32%까지 빠를 수있지만, 이는 실행 시에 바이트코드를 해석하는 가상머신에 한해서일 뿐,

JIT컴파일(동적해석)은 실행 전에 바이트 코드를 네이티브 코드로 변환한다. 이렇게 하면 두 가지 장점이 있다.

우선 순서 해석된 VM과 관련된 부담을 대부분 제거할 수있다.

두번째로, 정적으로 컴파일된 코드에서는 불가능한 네이티브 코드 최적화를 수행할 수 있다.

예를 들어 JIT컴파일러는 현재 실행 중인 CPU에 가장 적합한 최적화 방식을 선택할 수 있다. 또, JIT 컴파일러는 코드가 어떻게 실행되는지 분석해 애플리케이션의 입력값에 따라 추가 최적화를 수행할 수 있다.

Java_androidJava_complier

자바 SE VM과 달빅 VM의 또 다른 차이점은 달빅VM의 경우 같은 기기의 여러 인스턴스에서 실행하는 데 최적화되어 있다는 점이다. 이 과정은 부팅시점에 시작하는 zygote라는 프로세스에 의해 처리되는데, zygote는 모든 다른 인스턴스의 부모가 되는 첫 번째 달빅 인스턴스를 생성한다. 애플리케이션이 실행되면 zygote프로세스는 새 VM 인스턴스에 대한 요청을 받고 새로 실행된 애플리케이션을 지정 받는 새 프로세스로 분화시킨다.

안드로이드에 대한 정보는 여기서 좀 더 살펴보자. https://www.snetwork.co.kr/index.php/2017/01/08/jvm_android_art/#comment-3