백엔드 엔지니어 이재혁
[Java] Java 언어와 JVM 본문
Java 언어의 고수준 기능들은 JVM으로부터 오는가
Java는 C/C++ 계열과 다르게 멀티스레드 제어를 언어 단에서 지원한다. volatile이나 synchronized 같은 키워드 말이다.
멀티스레딩은 이제 기본적인 기능 중에 하나이기에 멀티스레드를 지원하는 것이 특이하지는 않지만, 다른 언어들과 다르게 언어 레벨 키워드에서 멀티스레드 기능을 지원한다는 점이 흥미롭게 느껴졌다.
조금 생각해보니 Java는 JVM이라는 가상머신 위에서 구동되기 때문에 JVM을 통해 더 다양한 기능을 언어에 녹일 수 있었던 것이 아닐까 생각이 든다.
멀티스레딩 기능은 운영 체제와 아주 밀접한 관련이 있기 때문에 플랫폼(운영 체제)에 따라 구현 방식이 달라질 수 있다. 그래서 컴파일시 바로 실행 가능한 프로그램으로 만들어주는 컴파일 언어에서는 하나로 통일된 기능을 제공하지 못하고 외부 라이브러리를 통해서 구현하는 것이 일반적이라고 생각된다.
대신 Java는 언어와 운영 체제 사이를 이어주는 JVM을 통해 하나의 코드로 모든 기기에서 동일하게 작동하도록 만들었기 때문에 언어 수준에서도 고수준의 기능을 제공할 수 있는 것 같다.
비슷한 방식으로 .Net 위에서 작동하는 C#도 lock 키워드를 통해 멀티스레딩을 지원한다고 한다. C#은 Java보다 늦게 나온만큼 언어단의 기본 기능만 놓고 보면 C#이 더 많은 기능을 지원한다. C#은 프로세스간 동기화까지도 지원한다고 한다. (Mutex, Semaphore)
Mutex: 하나의 스레드만 접근 허용 / Semaphore: n개의 스레드까지 접근 허용
Java는 서로 다른 JVM(프로세스) 간 동기화는 기본 라이브러리로 불가능하고, 외부 저장소를 활용해서 직접 구현해야 한다. (RDB의 락과 같이)
Java 언어에 녹아있는 GC 기능도 그렇고, 언어 수준에서의 멀티스레딩 지원도... 결국 JVM이 있기에 가능한 일이라고 생각된다. Write Once, Run Anywhere라는 말이 단순히 플랫폼마다 코드를 다르게 작성할 필요 없게 만들어줄 뿐 아니라, 그에 따른 더욱 고수준 기능을 제공하는 언어로 등장할 수 있었던 것이다.
JVM 때문에 괜히 무거워지는 것 아닌가 싶던 생각이 (어플리케이션을 가상머신 위에서 실행한다고????? 미친거 아닌가?) 점점 개발자가 더 중요한 곳에 집중할 수 있도록 밑바탕을 더 많이 다져주는 것 같다는 관점이 생기게 됐다.
Java 어플리케이션마다 JVM이 실행된다? 그렇다면 안드로이드는?
Java는 어플리케이션을 실행할 때마다, 개별적으로 JVM이 실행된다. 이는 어플리케이션의 독립성을 위해 각 프로세스마다 독립된 JVM을 실행한다고 한다.
이 내용을 보고 어... 그럼 안드로이드 스마트폰은 JVM이 수십개 올라가는건가?라는 생각이 들었는데, 결론부터 말하자면, 안드로이드의 어플리케이션은 JVM 위에서 실행되지 않는다.
안드로이드 앱은 ART라는 런타임 라이브러리를 로드해서 사용한다고 한다. Java 데스크탑 어플리케이션은 여러개 실행되면 JVM이 여러개 실행되기 때문에 메모리 사용량이 선형적으로 증가하는 반면, ART 런타임 라이브러리는 메모리 영역에서 공유되어 실행할 수 있기 때문에 많은 스마트폰 앱을 실행한다고 해도 JVM같이 선형적으로 증가하지는 않는다. (각각의 앱마다 개별적인 스택/힙 영역이 존재하긴 함)
추후 수정
Go 언어를 배우고 나니, 고수준 기능을 위해서 꼭 VM이 필요하지는 않는 것 같다. 런타임 관리가 필요하다 정도.
'흥미로운 것들' 카테고리의 다른 글
| 진짜 REST API와 HATEOAS (0) | 2025.07.13 |
|---|---|
| [Java] MapN의 비트 연산 사용 (0) | 2025.06.18 |
| [Java] List.of() 메서드 (0) | 2025.06.18 |
| [Java] 멤버 변수를 굳이 지역 변수에 복사해서 쓰는 이유가 뭘까? (0) | 2025.06.06 |
| [CS] CPU 캐시 메모리의 흥미로운 점들 (0) | 2025.05.22 |