성장일기

내가 보려고 정리하는 공부기록

언어/자바

[JAVA] JAVA에 대하여 (JVM, javac)

와나나나 2024. 6. 11. 00:11
728x90

자바 수업을 듣는 김에 자바에 관해 정리해두려고 한다. 앞으로 사용할 언어인 만큼 기본적인 것부터 꼼꼼히 기록하고싶다.

 

자바 (JAVA)

자바는 1995년 썬 마이크로시스템즈의 제임스 고슬링(James Gosling)과 연구원들에 의해 개발한 개발된 객체지향 프로그래밍 언어로 전 세계적으로 다양한 분야에서 사용된다.

 

특징

자바의 큰 특징들은 다음과 같다.

  • 1995년 개발된 객체지향 프로그래밍 (Object-Oriented Programming, OOP) 언어
  • 운영체제에 독립적
    • 소스 수정 안해도 윈도우, 리눅스 등 모든 운영체제에서 실행 가능
  • 개발자가 메모리 관리를 직접 하지 않아도 됨 
    • 가비지 컬렉터로 알아서 관리됨
  • 완전한 기계어가 아니라 바이트코드 파일(.class)로 구성된다.
    • 이를 사용하기 위해서는 자바가상기계 (JVM)이 필요하다.

 

우리가 쓴 자바 소스파일은 javac 명령어로 인해 바이트코드파일로 전환된다. 그러면 확장자는 .class가 된다.

이를 jvm을 이용하여 기계어로 번역하고, 사용할 수 있게 된다.

 

🌟 JVM (Java Virtual Machine)

jvm은 자바 가상 머신의 약자로 자바 애플리케이션을 클래스 로더로 읽어서 실행해주는 역할을 한다. 위에서 자바가 운영체제에 독립적이고, 메모리 관리를 해준다고 했는데 이는 모두 JVM의 역할이다. 자바가 운영체제에 독립적인 이유는 JVM 위에서 돌아가기 때문임

 

다만 JVM은 운영체제마다 다르게 제공되어 운영체제에 종속적이라고 볼 수 있다.

JVM 구조 - 출처 : https://goodgid.github.io/Java-JVM/#google_vignette

 

 ✅클래스 로더 시스템

 

간단하게 이야기 하면 바이트코드를 읽고 메모리에 저장한 후, 클래스 로더 시스템이 끝나면 객체를 생성해 힙 영역에 저장하는 시스템을 이야기 한다.

 

1. 로딩 

  • .class에서 바이트코드를 읽고, 적절한 바이너리 데이터를 만들어 Method 영역에 저장
    • Method 영역에 저장하는 데이터
      • Type정보 (class, interface, enum 등)
      • 메소드, 변수
      • FQCN

 

 

로딩순서

  1. Bootstrap
  2. Extension
  3. Application
  • Bootstrap -> Extension -> Application 순서로 찾게 된다.
  • Bootstrap에 존재하는지
  • 없다면 Extension에 존재하는지
  • 없다면 Application에 존재하는지
  • 일반적으로 99%는 Application에 존재한다.

못 찾으면 ClassNotFoundException 발생

 

 

2. 링크

 

링크는 3단계로 이루어 진다고 한다.

  1. Verify
  2. Prepare
  3. Resolve
  • Verify
    • 바이트 코드 수정이 이루어졌을 수도 있기 때문에 .class 파일의 형식 유효성 체크
  • Prepare
    • 클래스변수 (static변수) 와 기본값에 필요한 메모리 준비
  • Resolve
    • 사용하는 환경에 따라 동작유무 결정
    • 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체 
public class TestApplication {
	HelloWorld helloWorld = new HelloWorld();
    
    public static void main(String[] args) {
    	SpringApplication.run(TestApplication.class, args);
    }
}

 

이 코드에서 HelloWorld helloWorld = new HelloWorld(); 부분이 실제 레퍼런스를 가리키지는 않는다. 그래서 실제 힙에 들어있는 인스턴스를 가리키는 작업을 resolve 시점에 해준다.

 

 

3. 초기화

 

링크에서 Prepare 단계에 확보한 메모리 영역에 클래스의 static 값 할당

 

 

 ✅메모리 사용 영역

  • 메소드 영역
    • JVM이 시작할 때 생성되고, 모든 스레드가 공유하는 영역
  • 힙 영역
    • 객체와 배열이 생성되는 영역
    • 객체가 참조하는 변수나 필드가 없다면 JVM이 이걸 쓰레기로 취급 + garbage Collector 실행해서 자동 제거
  • JVM 스택 영역
    • 초기화 (최초 변수 선언해서 값이 최초로 들어갈 때)할 때 생성