자바 코드는 어떻게 실행 되는가

code_able·2023년 10월 23일
0

jvm이란 무엇인가.

CPU가 JAVA를 인식하여 실행 할 수 있도록 하는 가상컴퓨터 이다.
JAVA의 원시 코느는 CPU가 인식하지 못하므로 기계어로 컴파일을 해줘야 한다.
이때 JAVA Compiler가 .java 파일을 .class로 변환한다.

컴파일 하는 방법

  1. hello.java 파일 작성
public class Hello{
  public static void main(String[] args){
    System.out.println("Hello World");
  }
}
  1. hello.class로 컴파일
javac hello.java
  1. 실행
JAVA hello

바이트코드란 무엇인가.

Virtual Machine에서 돌아가는 프로그램을 위한 이진 표현 법이다.
자바 바이트코드는 JVM이 이해할 수 있는 언어로 변환된 코드다.

JIT 컴파일러란 무엇이며 어떻게 동작 하는가.

프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.
인터프리터의 단점을 완하기 위해 도입되었다.
컴파일된 코드는 캐시에 보관하기 때문에 빠르게 실행된다.
따라서 jvm은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고
컴파일을 수행한다.

JVM 구성요소

  • 클래스 로더 : JVM내 클래스 파일을 로드하고 배치
  • 실행 엔진 : JVM내의 런타임 데이터 영역에 바이트 코드를 배치 실행 엔진에 의해 실행된다.
    • 인터프리터 : 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
    • JIT : 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행
  • 가비지 콜렉터 : 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함.
  • Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
    • PC Register : Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.
    • JVM 스택 영역 : 각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다. 메서드 수행이 끝나면 프레임 별로 삭제를 한다. 메소드 안에서 사용되는 값들을 저장한다. 또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
    • Native method stack : 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.
    • Method Area : 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
      • Runtime Constant Pool : 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.
    • Heap 영역 : 객체를 저장하는 가상메모리 공간. new 연산자로 생성되는 객체와 배열을 저장한다.
      - Permanent Generation : 생성된 객체들의 정보의 주소값이 저장된 공간이다. 클래스 로더에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용된다.
      - New/Young 영역 : 이곳의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다.
      생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다.
      - Eden : 객체들이 최초로 생성되는 공간
      - Survivor 0, 1: Eden에서 참조되는 객체들이 저장되는 공간
      - Old 영역 : 이곳의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다.
      생명 주기가 긴 “오래된 객체”를 GC 대상으로 하는 영역이다.

JDK와 JRE

  • jdk : JDK안에는 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE (Java Runtime Environment)도 함께 포함되어 있습니다.

  • jre : JRE는 자바 실행 환경(Java Runtime Environment)의 약자로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 자바 가상 머신 (JVM)이 포함되어 있습니다. JRE는 자바로 "개발(쓰기)은 안되고 실행(읽기)만 된다"라고 생각해주시면 될 것 같습니다.

가비지 콜렉터

가비지 콜렉터(Garbage Collector)는 프로그래밍 언어에서 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 메모리를 자동으로 해제하는 기능을 말합니다. 이를 통해 개발자는 명시적으로 메모리를 해제하는 작업을 하지 않아도 되어 코드를 더 간결하게 작성할 수 있습니다.

가비지 콜렉터의 주요 역할은 다음과 같습니다:

사용되지 않는 메모리 탐지: 가비지 콜렉터는 프로그램 실행 중에 동적으로 할당된 메모리를 모니터링하고, 어떤 메모리가 더 이상 사용되지 않는지를 감지합니다.

해제되지 않은 메모리 해제: 사용되지 않는 메모리를 자동으로 해제하여 시스템의 자원을 효율적으로 활용합니다.

가비지 콜렉터는 주로 고급 프로그래밍 언어에서 사용되며, C#의 .NET Framework, Java, Python 등에서 내장되어 있습니다. 이러한 언어들은 메모리 관리를 대신 처리하므로 개발자는 명시적으로 메모리를 할당하고 해제할 필요가 없습니다.

가비지 콜렉터를 사용함으로써 메모리 누수(memory leak)와 같은 문제를 방지하고 프로그램의 안정성을 높일 수 있습니다. 그러나 가비지 콜렉션 과정이 실행될 때 일시적으로 성능 저하가 발생할 수 있으므로, 이를 고려하여 프로그램을 설계하는 것이 중요합니다.

profile
할수 있다! code able

0개의 댓글