👉 자바는 컴파일, 인터프리터방식을 같이 사용한다. 이러한 이유는 속도 때문인데, 최적화 및 속도 플랫폼 독립성을 가져갈 수 있다.
👉 ByteCode라는 것은 프로그래밍언어와 인터프리터 언어 그 사이의 언어이기 때문에, 다양한 플랫폼에서 사용이 가능하다. ByteCode는 jvm(Java Virtual Machine)이 이해할 수 있는 언어이고, 클래스 파일은 .class로 파일이 끝나는데 이는 jvm에서 실행할 수 있다.
🌳 JDK(Java Development Kit) : 자바개발을 위한 키트이다.
ex) 컴파일러, 개발도구, JRE
🌳 JRE(Java Runtime Enviroment) : 자바 개발환경.
ex) jvm, 필수 라이브러리, class
-> (JRE = API + JVM + 개발도구)
🌳 JVM(Java Virtual Machine) : ByteCode를 인터프리터로 변경해주는역할, 기계어로 변환
-> 메모리누수 방지(GC가 포함되어있음)
-> Virtual Machine(가상머신) : 소프트웨어가 하드웨어를 모방하는 환경

👉 JAVA는 대부분 메모리 관리를 알아서 하는 언어라고 알고 있지만, 그것이 아님.
GC라는 가비지컬렉션이 사용하지 않는 객체를 자동으로 파악하여 삭제하기 때문에 메모리 누수를 방지하는 것. 이 과정이 JVM에서 주기적으로 진행이 되므로 사용자가 직접 메모리 해제를 할 필요가 없다.
👉 가비지컬렉션의 동작원리로 메모리의 root부터 시작하여 전체 객체를 파악한후 마크앤스위프트를 통하여 사용되지 않는 객체에 마크를 해두고 이후 실제 메모리에서 스위프트(삭제)를 한다.