자바 가상 컴퓨터 깊이 이해

자바 가상 머 신 이란 무엇 입 니까?
자바 프로그래머 로 서 우 리 는 매일 자바 코드 를 쓰 고 있 습 니 다.우리 가 쓴 코드 는 자바 가상 컴퓨터 라 는 것 에서 실 행 됩 니 다.하지만 가상 컴퓨터 가 무엇 인지 물 어보 면 애매모호 한 사람들 이 많 을 것 이다.본문 에서 나 는 가상 컴퓨터 에 대한 이 해 를 쓸 것 이다.능력 에 한계 가 있 기 때문에,묘사 가 부족 한 부분 이 있 을 수 있다.만약 당신 이 다른 이 해 를 가지 고 있다 면,교 류 를 환영 합 니 다.
자바 프로그램 이 가상 컴퓨터 에서 실행 되 어야 한 다 는 것 을 우 리 는 모두 알 고 있다.그렇다면 가상 컴퓨터 는 무엇 일 까?먼저 인터넷 에서 검색 한 비교적 믿 을 만 한 해석 을 본다.
가상 컴퓨터 는 추상 화 된 컴퓨터 로 실제 컴퓨터 에서 각종 컴퓨터 기능 을 모방 하여 실현 한 것 이다.자바 가상 머 신 은 프로세서,스 택,레지스터 등 자신 만 의 완벽 한 하드웨어 구 조 를 가지 고 있 으 며 해당 하 는 명령 시스템 도 가지 고 있다.JVM 은 구체 적 인 운영 체제 플랫폼 과 관련 된 정 보 를 차단 하여 자바 프로그램 이 자바 가상 컴퓨터 에서 실행 되 는 대상 코드(바이트 코드)만 생 성하 면 다양한 플랫폼 에서 수정 없 이 실행 할 수 있 도록 한다.
이런 해석 은 정확 하 다 고 할 수 있 지만 가상 컴퓨터 의 외부 행위 와 기능 만 묘 사 했 을 뿐 내부 원리 에 대해 설명 하지 않 았 다.일반적인 상황 에서 우 리 는 가상 컴퓨터 의 운행 원 리 를 알 필요 가 없다.자바 코드 만 쓰 면 된다.이것 이 바로 가상 컴퓨터 가 존재 하 는 원인 이다.바 텀 운영 체제 플랫폼 의 차이 점 을 차단 하고 원생 언어 개발 의 복잡성 을 감소 시 켜 자바 라 는 언어 가 각종 플랫폼 을 뛰 어 넘 을 수 있 게 한다(가상 컴퓨터 업 체 가 특정한 플랫폼 에서 가상 컴퓨터 를 실현 하면).그리고 간단 하고 사용 하기 쉽다.이것들 은 모두 가상 컴퓨터 의 외부 특성 이지 만 이런 정보 로 가상 컴퓨터 를 해석 하 는 것 은 너무 추상 적 이어서 우리 로 하여 금 내부 원 리 를 알 게 할 수 없다.
프로 세 스 각도 에서 JVM 해석
운영 체제 차원 에서 가상 컴퓨터 를 이해 해 보 자.우 리 는 가상 컴퓨터 가 운영 체제 에서 운행 된다 는 것 을 알 고 있다.그러면 어떤 것 이 운영 체제 에서 운행 할 수 있 습 니까?프로 세 스 는 운영 체제 의 실행 단위 이기 때문에 프로 세 스 입 니 다.실행 중 일 때 운영 체제 의 프로 세 스 인 스 턴 스 입 니 다.실행 중 일 때(실행 가능 한 파일 로 파일 시스템 에 저장)프로그램 이 라 고 할 수 있 습 니 다.
명령 행 에 익숙 한 학생 들 은 하나의 명령 이 실행 가능 한 바 이 너 리 파일 에 대응 한 다 는 것 을 알 고 있 습 니 다.이 명령 을 두 드 리 고 차 로 돌아 가면 프로 세 스 를 만 들 고 실행 가능 한 파일 을 프로 세 스 의 주소 공간 에 불 러 오고 그 명령 을 실행 합 니 다.다음은 C 언어 와 자바 언어의 Hello World 프로그램 을 비교 해 문 제 를 설명 한다.
먼저 C 언어 버 전의 HelloWorld 프로그램 을 작성 합 니 다.

#include <stdio.h> 
#include <stdlib.h> 
 
int main(void) { 
  printf("hello world
"); return 0; }
C 언어 버 전의 HelloWorld 프로그램 을 컴 파일 합 니 다:

gcc HelloWorld.c -o HelloWorld 
C 언어 버 전의 HelloWorld 프로그램 실행:

zhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld  
hello world 
gcc 컴 파 일 러 가 컴 파 일 된 파일 은 운영 체제 에서 인식 할 수 있 는 바 이 너 리 실행 파일 입 니 다.명령 줄 에서./Hello World 라 는 명령 을 두 드 렸 을 때 프로 세 스 를 직접 만 들 고 실행 가능 한 파일 을 프로 세 스 의 주소 공간 에 불 러 와 파일 의 명령 을 수행 합 니 다.
대비 하여 자바 버 전 HelloWord 프로그램의 컴 파일 과 실행 형식 을 살 펴 보 겠 습 니 다.
먼저 원본 파일 HelloWord.java 를 작성 합 니 다.

public class HelloWorld { 
 
  public static void main(String[] args) { 
    System.out.println("HelloWorld"); 
  } 
} 
자바 버 전의 HelloWorld 프로그램 을 컴 파일 합 니 다:

zhangjg@linux:/deve/workspace/HelloJava/src$ javac HelloWorld.java  
zhangjg@linux:/deve/workspace/HelloJava/src$ ls 
HelloWorld.class HelloWorld.java 
자바 버 전의 HelloWorld 프로그램 실행:

zhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld  
HelloWorld 
위의 과정 에서 볼 수 있 듯 이 자바 버 전의 Hello World 프로그램 을 실행 할 때 입력 한 명령 은.../Hello World.class 가 아 닙 니 다.클 라 스 파일 은 운영 체제 에서 직접 인식 할 수 있 는 바 이 너 리 실행 파일 이 아니 기 때문이다.우리 가 입력 한 것 은 자바 라 는 명령 이다.이 명령 은 우리 가 먼저 시작 한 것 은 자바 라 는 프로그램 입 니 다.이 자바 프로그램 은 실행 한 후에 JVM 프로 세 스 인 스 턴 스 입 니 다.
위의 명령 실행 절 차 는 다음 과 같 습 니 다.
자바 명령 은 먼저 가상 컴퓨터 프로 세 스 를 시작 합 니 다.가상 컴퓨터 프로 세 스 가 성공 적 으로 시 작 된 후에 인자 인'Hello World'를 읽 고 그 를 초기 클래스 로 메모리 에 불 러 옵 니 다.이 클래스 를 초기 화하 고 동적 링크(클래스 의 초기 화 와 동적 링크 는 뒤의 블 로그 에서 소개 합 니 다)를 한 다음 에 이러한 main 방법 부터 실 행 됩 니 다.즉,우리 의.class 파일 은 시스템 에 직접 불 러 온 후에 cpu 에서 실 행 된 것 이 아니 라 가상 컴퓨터 라 는 프로 세 스 에 의 해 위탁 되 었 다.먼저 가상 컴퓨터 프로 세 스 가 시 작 된 다음 에 가상 컴퓨터 의 클래스 로 더 에 필요 한 class 파일 을 불 러 와 야 합 니 다.jdk 의 기본 클래스(예 를 들 어 String 과 Object 등)를 포함 한 다음 에 가상 컴퓨터 프로 세 스 가 class 바이트 명령 을 설명 하고 이 바이트 명령 을 원가 기 cpu 가 식별 할 수 있 는 명령 을 번역 해 야 cpu 에서 실 행 될 수 있 습 니 다.
이런 측면 에서 볼 때,이른바 자바 프로그램 을 실행 할 때,정말로 실행 하고 있 는 것 은 자바 가상 컴퓨터 라 는 프로 세 스 이지,우리 가 쓴 클 라 스 파일 이 아니다.이것 은 가상 컴퓨터 라 는 프로 세 스 가 메모리 의 배분 과 방출 등 기본 적 인 작업 을 처리 하 는 것 이다.우리 가 작성 한 class 파일 은 가상 컴퓨터 프로 세 스 가 실 행 될 때 필요 한'원료'일 뿐 입 니 다.이러한'원료'는 실행 할 때 가상 컴퓨터 에 불 러 오고 가상 컴퓨터 에 의 해 해석 되 어 실 행 됩 니 다.가상 컴퓨터 를 제어 하여 우리 자바 코드 에서 정의 하 는 상대 적 으로 높 은 작업 을 실현 합 니 다.예 를 들 어 파일 을 만 드 는 등 class 파일 의 정 보 를 가상 컴퓨터 에 대한 제어 정보,즉 가상 명령 으로 볼 수 있 습 니 다.
프로 그래 밍 언어 도 자신의 원리 가 있 는데,하나의 언어 를 배 우 는 것 은 주로 그것 의 원 리 를 이해 하 는 것 이다.간단 한 Hello World 프로그램 처럼 보이 지만 깊이 있 는 내용 도 많다.
JVM 시스템 구조 안내
가상 컴퓨터 프로 세 스 와 class 파일 의 관 계 를 보 여주 기 위해 다음 그림 을 그 렸 습 니 다.

위의 그림 에서 표현 한 내용 에 따 르 면 우리 가 컴 파일 한 class 파일 은 자바 가상 컴퓨터 의 원료 로 자바 가상 컴퓨터 내부 에 입력 되 었 습 니 다.그러면 구체 적 으로 누가 이 부분 을 합 니까?사실은 자바 가상 컴퓨터 내부 에 클래스 로 더 라 는 서브 시스템 이 있 는데 이 서브 시스템 은 실행 할 때 필요 에 따라 클래스 를 불 러 오 는 데 사 용 됩 니 다.위의 한 마디 중의'필요 에 따라'네 글 자 를 주의해 라.자바 가상 컴퓨터 가 실행 되 는 과정 에서 그 가 하나의 클래스 가 필요 할 때 만 클래스 로 더 를 불 러 옵 니 다.실행 을 시작 할 때 모든 클래스 를 불 러 오지 않 습 니 다.한 사람 처럼 배 고 플 때 만 밥 을 먹 는 것 이지 한 해 동안 밥 을 다 먹 는 것 이 아니다.일반적으로 가상 컴퓨터 로 딩 류 의 시 기 는 새로운 종 류 를 처음 사용 할 때 이다.이 칼럼 뒤의 글 은 자바 의 클래스 로 더 를 구체 적 으로 토론 할 것 이다.
가상 컴퓨터 에서 불 러 온 클래스 가 자바 가상 컴퓨터 메모리 에 불 러 온 후 가상 기 회 는 그 안에 존재 하 는 바이트 코드 명령 을 읽 고 실행 합 니 다.가상 컴퓨터 에서 바이트 코드 명령 을 실행 하 는 부분 을 실행 엔진 이 라 고 한다.한 사람 처럼 밥 을 먹 으 면 끝 나 는 것 이 아니 라 소 화 를 해 야 하 며 엔진 을 실행 하 는 것 은 사람의 위장 시스템 에 해당 한다.실행 하 는 과정 에서 각 class 파일 을 동적 으로 연결 합 니 다.실행 엔진 의 구체 적 인 행위 와 동적 링크 와 관련 된 내용 도 본 칼럼 의 후속 글 에서 토론 할 것 이다.
우 리 는 자바 가상 기회 가 자동 메모리 관 리 를 하 는 것 을 안다.구체 적 으로 말 하면 쓸모없는 대상 을 자동 으로 방출 하 는 것 이지 프로그래머 가 코드 를 만들어 서 분 배 된 메모 리 를 방출 할 필요 가 없다.이 부분 작업 은 쓰레기 수집 서브 시스템 이 책임 진다.
위의 논술 을 통 해 알 수 있 듯 이 하나의 자바 가상 컴퓨터 인 스 턴 스 는 운행 과정 에서 세 개의 서브 시스템 이 그의 정상 적 인 운행 을 보장 하 는데 그것 이 바로 로드 서브 시스템,엔진 서브 시스템 과 쓰레기 수집 서브 시스템 이다.다음 그림 에서 보 듯 이:

가상 컴퓨터 가 실 행 될 때 클 라 스 파일 을 불 러 오고 클 라 스 파일 의 바이트 코드 명령 을 실행 해 야 합 니 다.그것 이 이렇게 많은 일 을 하려 면 반드시 자신의 공간 이 필요 하 다.사람 이 먹 는 것 처럼 위 에 먼저 넣 어야 한다.가상 컴퓨터 도 하나의 데 이 터 를 저장 할 공간 이 필요 하 다.우선,불 러 온 바이트 코드 는 별도의 메모리 공간 이 필요 합 니 다.하나의 스 레 드 의 실행 도 메모리 공간 으로 방법의 호출 관 계 를 유지 하고 저장 방법 중의 데이터 와 중간 계산 결 과 를 저장 해 야 합 니 다.실행 하 는 과정 에서 피 할 수 없 는 대상 을 만 들 려 면 만 든 대상 은 전문 적 인 메모리 공간 이 필요 합 니 다.가상 컴퓨터 가 실 행 될 때 데이터 구역 의 내용 도 본 칼럼 의 후속 글 에 나타 날 것 이다.가상 컴퓨터 가 실 행 될 때 메모리 구역 은 다음 그림 과 같은 몇 부분 으로 나 눌 수 있 습 니 다.(여 기 는 대충 나 눌 뿐 정교 하 게 나 누 지 는 않 았 다)

총결산
여기까지 썼 습 니 다.기본적으로 자바 가상 컴퓨터 에 대한 이 해 는 다 썼 습 니 다.이 글 의 주 제 는 자바 가상 머 신 을 깊이 이해 하 는 것 이지 만 조금도'깊이'하지 않 고 그냥 평범 하 게 이야기 하 는 것 처럼 느 낄 수 있 습 니 다.나 도 이런 느낌 이 야.자신의 수준 에 한계 가 있 기 때문에 이렇게 할 수 밖 에 없습니다.자바 가상 기 를 깊이 이해 하려 면 세 권 의 책 을 읽 는 것 을 강력 히 권장 합 니 다.
《자바 가상 머 신 깊이 들 어가 기》
《자바 가상 머 신 JVM 의 고급 특성 과 최 적 실천 을 깊이 이해 하 다》.
《자바 가상 컴퓨터 규범》.
사실 나 도 이 몇 권 의 책 을 읽 은 적 이 있 지만 가상 컴퓨터 에 대한 해석 도 하나의 외부 모델 을 바탕 으로 가상 컴퓨터 내부 의 실현 원 리 를 깊이 분석 하지 않 았 다.가상 컴퓨터 는 크 고 복잡 한 것 이다.가상 컴퓨터 를 실현 하 는 사람들 은 모두 큰 소 등급 이다.가상 컴퓨터 의 실현 에 참여 하지 않 았 다 면 이 를 이해 할 수 있 는 사람 이 별로 없 었 을 것 이다.이 칼럼 뒤의 일부 글 도 이 세 권 의 책 을 참고 했다.자바 문법 을 설명 하 는 책 이 부지기수 이지 만 가상 컴퓨터 를 깊이 설명 하 는 책 은 지금까지 나 는 이 세 권 을 본 적 이 있 고 인터넷 의 자료 도 많 지 않다.
마지막 으로 총 결 을 하 겠 습 니 다.
1.가상 컴퓨터 는 신비 하지 않 습 니 다.운영 체제 의 측면 에서 볼 때 일반적인 프로 세 스 일 뿐 입 니 다.
2.가상 컴퓨터 라 는 프로 세 스 는 우리 가 작성 한 class 파일 을 불 러 올 수 있 습 니 다.JVM 을 한 사람 에 비유 하면 클 라 스 파일 은 우리 가 먹 는 음식 이다.
3.클 라 스 파일 을 불 러 오 는 것 은 클래스 로 더 라 는 서브 시스템 입 니 다.마치 우리 의 입 이 음식 을 뱃속 에 먹 는 것 과 같다.
4.가상 컴퓨터 의 실행 엔진 은 class 파일 의 바이트 코드 명령 을 수행 하 는 데 사 용 됩 니 다.우리 의 위장 이 먹 은 음식 을 소화 하 는 것 과 같다.
5 가상 컴퓨터 는 실행 과정 에서 메모리 생 성 대상 을 분배 해 야 한다.이 대상 들 은 시간 이 지나 면 쓸모 가 없 으 니,반드시 이 쓸모없는 대상 들 을 자동 으로 정리 해 야 한다.청소 대상 이 메모 리 를 회수 하 는 임 무 는 쓰레기 수집 기 가 맡 는 다.마치 사람 이 먹 은 음식 처럼 소화 한 후에 반드시 노폐물 을 체 외 로 배출 하고 다음 에 배 고 플 때 밥 을 먹고 음식 을 소화 할 수 있 는 공간 을 비 워 야 한다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기