자바 프로그램 실행 과정 및 메모리 메커니즘 상세 설명

이 강 의 는 자바 코드 가 어떻게 한 걸음 한 걸음 운행 되 는 지 를 소개 할 것 이다.그 중에서 관련 된 컴 파일 러,클래스 로 더,바이트 코드 검사 기,해석 기와 JIT 컴 파일 러 가 전체 과정 에서 어떤 역할 을 발휘 하 는 지 소개 할 것 이다.또한 자바 프로그램 이 사용 하 는 메모리 가 어떻게 관리 되 는 지 소개 합 니 다.쌓 기,스 택,방법 구역 은 각각 어떤 내용 을 저장 하 는 지 소개 합 니 다.마지막 으로 자바 프로그램 이 실 행 될 때 메모리 의 변 화 를 이해 하 는 데 도움 을 주 는 작은 코드 예제 입 니 다.
Java 프로그램 실행 과정
  • 단계 1:원본 코드 를 쓰 고 원본 코드 는 자바 의 파일 형식 으로 컴퓨터 하 드 디스크 에 저 장 됩 니 다.
  • 단계 2:컴 파 일 러(copiler)는 컴 파 일 러 오류 가 있 는 지 확인 합 니 다(예 를 들 어 분점,키워드 맞 춤 법 오류 등).검 사 를 통 해 컴 파일 러 는 원본 코드 를 바이트 코드(by tecode)로 번역 하여 컴퓨터 하 드 디스크 에 저장 합 니 다.
  • 단계 3:이 자바 프로그램 을 실행 하려 면 JVM 에 클래스 로 더(class loader)라 는 내장 프로그램 이 메모리 에 있 는 JVM 으로 바이트 코드 를 하 드 디스크 에서 불 러 옵 니 다.
  • 단계 4:JVM 에 바이트 코드 검사 기(by tecode verifier)라 는 내장 프로그램 이 런 타임 오류 가 있 는 지 확인 합 니 다(예 를 들 어 스 택 넘 침).검 사 를 통 해 바이트 코드 검사 기 는 바이트 코드 를 해석 기(interpreter)에 전달 합 니 다.
  • 단계 5:해석 기 는 바이트 코드 를 한 줄 씩 번역 하여 현재 시스템 에서 이해 할 수 있 는 기계 코드(machine code),
  • 으로 번역 합 니 다.
  • 단계 6:기계 코드 를 운영 체제 에 건 네 주 고 운영 체 제 는 main 방법 을 입구 로 하여 프로그램 을 시작 합 니 다.이로써 자바 프로그램 이 이렇게 실행 되 기 시작 했다.
  • 세심 한 독자 들 은 절차 도 에서 JIT 라 는 것 이 절차 에서 해석 되 지 않 았 다 는 것 을 알 게 되 었 을 것 이다.그러면 JIT 컴 파 일 러(Just-In-Time Compiler)는 프로그램 실행 과정 에 참여 하면?다음 두 가지 예 를 살 펴 보 자.
  • 상황 1:해석 기 는 코드 에 대해 한 줄 씩 설명 합 니 다.마치 우리 가 절차 에서 소개 한 것 과 같 습 니 다.
  • 상황 2:JIT 컴 파일 러 가 자바 실행 과정 에 참여 하 는 상황 입 니 다.JIT 컴 파일 러 는 모든 코드 를 스 캔 하여 최적화 합 니 다.예 를 들 어 마지막 줄 코드 가 중복 되 는 것 을 발견 하면 제거 하고 앞의 4 줄 코드 만 해석 기 에 전달 합 니 다.이렇게 하면 해석 기 는 더욱 빠 르 고 효율 적 으로 운행 할 수 있다.왜냐하면 불필요 한 코드 가 번역 해 야 하기 때문이다.
  • 물론 이것 은 JIT 컴 파일 러 의 최적화 수단 중 하나 일 뿐 서로 다른 회사 가 디자인 한 JIT 컴 파일 러 는 자바 프로그램의 운행 에 대해 서로 다른 최적화 방식 을 가 질 것 이다.또 JIT 컴 파일 러 가 매번 실행 과정 에 참여 하 는 것 은 아니 라 는 점 을 알 아야 한다.
    메모리 메커니즘
    3 단계 에서 우 리 는 바이트 코드 가 클래스 로 더 에 의 해 메모리 에 불 러 올 것 이 라 고 말 했 습 니 다.그러면 불 러 온 후에 JVM 은 어떻게 메모리 관 리 를 합 니까?
    보통 메모 리 를 불 러 온 후에 자바 프로그램 이 사용 하 는 메모 리 는 크게 3 개의 영역 으로 나 뉜 다.쌓 기(hep),스 택(stack)과 방법 구역(methodarea)이다.

    더미:new 에서 나 온 물건 을 저장 합 니 다.
    스 택:부분 변 수 를 저장 합 니 다.
    방법 구역:유형 정보,필드 정보,상수 탱크(constant pool),정적 변수,방법 정보 등.
    
    public final class Student extends Object implements Serializable
    { 
    // 1.    
    // 2.       
    private String name; 
    private int score; 
    // 3.    
    public final int id = 0; 
    public final String gender = "male"; 
    // 4.     
    public static int a = 0; 
    // 5.     
    public int getid() 
    { 
    return id; 
    }}
    PC 레지스터:실행 할 명령 을 저장 하 는 주소 입 니 다.(기계 의 머리 가 잘 돌아 가지 않 기 때문에 그 가 어디 까지 실 행 했 는 지 기억 할 수 있 도록 전문 적 인 구역 이 필요 하 다.그렇지 않 으 면 잊 어 버 릴 것 이다)
    로 컬 방법 스 택:JVM 스 택 이 발휘 하 는 역할 과 매우 비슷 합 니 다.그 차 이 는 JVM 스 택 이 자바 방법 으로 서 비 스 를 제공 하 는 것 에 불과 하고 로 컬 방법 스 택 은 Native 방법 으로 서 비 스 를 제공 합 니 다.어떤 가상 컴퓨터(예 를 들 어 Sun HotSpot 가상 컴퓨터)는 심지어 로 컬 방법 스 택 과 가상 컴퓨터 스 택 을 하나 로 합 친다.
    모든 스 레 드 는 각각 독립 된(가상 컴퓨터)스 택,PC 레지스터 와 로 컬 방법 스 택 을 가지 고 있 습 니 다.쌓 기와 방법 구역 은 모든 라인 이 공유 된다.
    마지막 으로 자바 프로그램 이 실 행 될 때 메모리 의 변 화 를 작은 예 로 이해 합 니 다.
    
    public class Person 
    {
    int id; int age; Person(int id1, int age1)
    { 
    id = id1; age = age1; 
    } 
    public static void main(String[] args) 
    { 
    Person Tom = new Person(1, 25); 
    } 
    }
    우선,stack 에 메모 리 를 신 청 했 습 니 다.이 메모리 구역 의 이름 은 Tom 입 니 다.이 구역 에 저 장 된 내용 은 null 입 니 다.
    이 어 Person 의 구조 방법 을 호출 하고 방법의 매개 변 수 는 부분 변수 에 속 하기 때문에 stack 에 각각 id1 과 age 1 을 저장 합 니 다.
    구조 방법 을 통 해 Person 의 대상 이 새로 나 올 수 있 습 니 다.이 대상 은 구성원 변 수 를 연결 하여 힙 에 저 장 됩 니 다.구성원 변수 id 와 age 의 값 은 stack 에 저 장 된 부분 변수 id 1 과 age 1 에 의 해 부 여 됩 니 다.
    마지막 으로 이 대상 의 인용 값(주소 와 유사)을 Tom 에 전달 하고 인용 값 을 통 해 이 대상 을 찾 을 수 있 습 니 다.

    (메모:stack 에 있 는 id1 과 age 1 은 구조 적 방법 호출 이 끝나 면서 사라 집 니 다.여 기 는 전 과정 을 잘 표현 하기 위해 그림 에 보관 합 니 다.)
    창고 와 더미 에 대한 기타 지식
  • 스 택 과 더미 의 크기 는 모두 기본 값 으로 고정 되 어 있 습 니 다.이들 은 jvm 의 매개 변수 로 설정 되 어 있 습 니 다.서로 다른 jvm 이 설정 한 매개 변수 에 따라 해당 하 는 스 택 과 더미 의 크기 도 다 릅 니 다.
  • 스 택 은 실행 시의 단위 입 니 다.안에 저 장 된 정 보 는 모두 현재 스 레 드 와 관련 된 것 으로 국부 변수,프로그램 운행 상태,방법 반환 값 등 을 포함 합 니 다.더 미 는 저장 단위 이다.저장 대상 만 책임 진다.
  • 방법 호출 이 끝 난 후에 방법 중의 국부 변 수 는 사라 지고 stack 에서 공간 을 계속 차지 하지 않 습 니 다.스 택 과 더미 의 분리 로 인해 서로 다른 스 레 드 가 같은 대상 에 접근 할 수 있 습 니 다.이것 은 효과 적 인 데이터 교환 방식(공유 메모리)입 니 다.또한 쌓 여 있 는 공유 상수 와 캐 시 는 모든 스 택 에 접근 할 수 있 기 때문에 공간 도 절약 했다.
  • 참조 https://simplesnippets.tech/execution-process-of-java-program-in-detail-working-of-just-it-time-compiler-jit-in-detail/ https://blog.csdn.net/yfqnihao/article/details/8289363 https://www.zhihu.com/question/29833675
    자바 프로그램 실행 과정 및 메모리 메커니즘 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 자바 프로그램 실행 과정 및 메모리 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
    자바 프로그램 실행 과정 및 메모리 메커니즘 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 자바 프로그램 실행 과정 및 메모리 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기