개발 무지렁이

[Java] 컴파일 언어 Java와 JVM 본문

Backend/자바

[Java] 컴파일 언어 Java와 JVM

Gaejirang-e 2022. 12. 1. 11:09

컴파일 언어와 인터프리터 언어


프로그램을 실행하기 위해 고급어(C, Java, Python..)로 작성된 코드를 기계어로 번역해주는 작업이 필요하다
프로그래머가 쓴 코드를 번역하는 시점에 따라 그때 그때하면 인터프리터 언어, 미리 해놓으면 컴파일러 언어라고 한다.
코드 수정이 잦은 서비스에서는 업데이트가 수월한 인터프리터 언어를 쓰는게 좋지만
매번 그때 그때 번역해야하기 때문에 속도는 컴파일러 언어보다 느리다.

Java는 컴파일 언어다




Java로 코드를 작성하고 컴파일러에 명령을 내리면 .class라는
Java Byte code로 변환된 파일이 생긴다.
이 Java Byte code는 기계어가 아니다.
그래서 운영체제(OS)가 해석할 수 없는데,
이를 자바가상머신(Java Virtual Machine)이
운영체제(OS)가 실행할 수 있도록 해석해준다.

자바 가상 머신 (JVM)


= Class Loader + Runtime Data Areas + Excution Engine



  • Class Loader: Runtime시점에 클래스를 로딩하고, 인스턴스 생성 시에 메모리에 로드한다
  • Runtime Data Areas: 프로그램을 수행하기 위해, 운영체제(OS)로부터 별도로 할당받은 메모리 공간을 말한다
  • Excution Engine: Class Loader에 의해 별도의 메모리에 로드된 Java Byte Code를 실행하는 Runtime 모듈을 말한다.
❓ Garbage Collector
: 메모리 누수를 방지하기 위해 주기적으로 메모리를 정리한다.(변수들, 함수들, 객체들)
: 메모리를 알아서 관리하는 언어 (managed language)

- mark-and-sweep: 메모리를 쭉 훑은 다음, 필요한 것들만 마크해서 마크안된 것들을 쓸어버린다.
- reference-counting: 특정요소가 참조되는 횟수를 세서 0이되면 쓸어버린다
  (※ 순환참조하지 말 것, 변수들이 서로 참조해버리면 reference-counting이 0이 안된다)
Comments