jvm 의 작업 원 리 를 읽 는 방식 으로 이해 하 다.

7232 단어 자바jvmjdkjni
다음으로 이동: http://www.cnblogs.com/jiayi/archive/2010/06/08/1753863.html
----------------------------------------------------------------------------------
jvm 의 작업 원 리 를 읽 는 방식 으로 이해 하 다.
 
JVM 작업 원리 와 특징 은 주로 운영 체제 에서 JVM 을 불 러 오 는 것 은 jdk 에서 자바. exe 를 통 해 이 루어 지고 다음 4 단 계 를 통 해 JVM 환경 을 완성 하 는 것 을 말한다.
1. JVM 마 운 트 환경 과 설정 만 들 기
2. JVM. dll 불 러 오기
3. JVM. dll 을 초기 화하 고 JNIENV (JNI 호출 인터페이스) 인 스 턴 스 로 연결
4. JNIEnv 인 스 턴 스 를 호출 하여 class 클래스 를 불 러 오고 처리 합 니 다.
 
자바 프로그램 을 실행 하고 디 버 깅 할 때 JVM 의 개념 을 자주 언급 합 니 다. JVM 은 자바 프로그램 이 실행 되 는 환경 이지 만 그 는 운영 체제 의 응용 프로그램 과 프로 세 스 를 동시에 사용 하기 때문에 그 는 자신 이 실행 하 는 수명 주기 도 있 고 자신의 코드 와 데이터 공간 도 있 습 니 다.
먼저 JVM 작업 원리 중의 jdk 라 는 것 을 말씀 드 리 겠 습 니 다. 초보 자 든 고수 든 j2ee 프로그래머 든 j2se 프로그래머 든 jdk 는 항상 우 리 를 도와 뭔 가 를 하고 있 습 니 다. 우 리 는 자바 를 이해 하기 전에 먼저 대사 들 이 우리 에 게 jdk 라 는 것 을 제공 할 것 입 니 다. 자바 전체 시스템 에서 어떤 역할 을 하고 있 습 니까?저 는 sun 대사 들 의 디자인 천재 에 놀 랐 습 니 다. 이렇게 완전한 체 계 를 이렇게 완벽 하 게 구조 화 할 수 있 습 니 다. jdk 는 이 시스템 에서 생산 가공 센터 로 서 모든 데이터 출력 을 만 들 고 모든 명령 과 전략의 집행 센터 입 니 다. 그 자체 가 자바 의 완전한 방안 을 제공 하여 현재 자바 가 지원 할 수 있 는 모든 응용 프로그램 과 시스템 프로그램 을 개발 할 수 있 습 니 다. 여기 서 한 가지 질문 을 하 겠 습 니 다.그런데 왜 j2me, j2ee 이런 것들 이 있 습 니까? 이 두 가지 목적 은 매우 간단 합 니 다. 각각 각 분야 의 개발 과 구축 과정 을 간소화 하 는 데 사 용 됩 니 다. jdk 는 JVM 을 제외 하고 핵심 API, 통합 API, 사용자 도구, 개발 기술, 개발 도구 와 API 등 구성 도 있 습 니 다.
자, 쓸데없는 말 을 많이 했 으 니 주제 와 관련 된 것 을 주문 하 세 요. JVM 은 전체 jdk 에서 최 하층 에 있 고 운영 체제 의 상호작용 을 담당 하 며 운영 체제 환경 을 차단 하고 완전한 자바 운영 환경 을 제공 하기 때문에 가상 컴퓨터 입 니 다. 운영 체제 로 JVM 을 불 러 오 는 것 은 jdk 에서 자바. exe 를 통 해 이 루어 집 니 다. 다음 4 단 계 를 통 해 JVM 환경 을 완성 합 니 다.
1. JVM 마 운 트 환경 과 설정 만 들 기
2. JVM. dll 불 러 오기
3. JVM. dll 을 초기 화하 고 JNIENV (JNI 호출 인터페이스) 인 스 턴 스 로 연결
4. JNIEnv 인 스 턴 스 를 호출 하여 class 클래스 를 불 러 오고 처리 합 니 다.
1. JVM 이 환경 을 불 러 옵 니 다. JVM 이 제공 하 는 방식 은 운영 체제 의 동적 연결 파일 입 니 다. 파일 이 라면 불 러 오 는 경로 의 문제 입 니 다. 자바 는 어떻게 이 경 로 를 찾 습 니까?자바 test 를 호출 할 때 운영 체 제 는 path 에서 자바. exe 프로그램 에 있 습 니 다. 자바. exe 는 다음 과정 을 통 해 JVM 의 경로 와 관련 된 매개 변수 설정 을 확인 합 니 다. 다음은 Windows 기반 분석 입 니 다.
먼저 jre 경 로 를 찾 습 니 다. 자바 는 GetApplicationHome api 를 통 해 현재 자바. exe 의 절대 경 로 를 얻 습 니 다. c: \ j2sdk 1.4.209 \ bin \ 자바. exe, 절대 경로 c: \ j2sdk 1.4.2판단 c: \ j2sdk 1.4.209 \ bin \ 자바. dll 파일 이 존재 하 는 지, 존재 하면 c: \ j2sdk 1.4.209 \ jre 경로 로 존재 하지 않 으 면 판단 c: \ j2sdk 1.4.209 \ jre \ bin \ Java. dll 이 존재 하 는 지, 이 c 가 존재 한다 면 \ j2sdk 1.4.209 \ \ jre 를 jre 경로 로 사용 합 니 다. GetPublicJRE Home 검색 HKEY 호출 이 존재 하지 않 는 다 면LOCAL_MACHINE \ \ Software \ \ JavaSoft \ Java Runtime Environment \ "현재 JRE 버 전 번호" \ JavaHome 의 경 로 는 jre 경로 입 니 다.
그리고 JVM. cfg 파일 을 불 러 옵 니 다. JRE 경로 + \ lib + \ ARCH (CPU 프레임) + \ JVM. cfgARCH (CPU 프레임) 의 판단 은 자바md. c 에서 GetArch 함수 가 판단 한 것 은 이 함수 에서 windows 플랫폼 은 두 가지 상황 만 있 습 니 다. WIN 64 의 'ia 64' 이 고 다른 상황 은 모두 'i386' 입 니 다.나의 예: C: \ j2sdk 1.4.209 \ jre \ lib \ i386 \ \ JVM. cfg.

 
  1. -client KNOWN   
  2. -server KNOWN   
  3. -hotspot ALIASED_TO -client   
  4. -classic WARN   
  5. -native ERROR   
  6. -green ERROR  

jdk 디 렉 터 리 에 jre \ bin \ server 와 jre \ bin \ client 는 모두 JVM. dll 파일 이 존재 합 니 다. 자바 는 JVM. cfg 설정 파일 을 통 해 서로 다른 버 전의 JVM. dll 을 관리 합 니 다. 파일 을 통 해 현재 jdk 에서 지원 하 는 JVM 을 정의 할 수 있 습 니 다. 앞부분 (client) 은 JVM 이름 이 고 뒤쪽 은 인자 이 며 KNOWN 은 JVM 이 존재 한 다 는 것 을 표시 합 니 다. ALIASEDTO 는 다른 JVM 에 별명 을 붙 이 고 WARN 은 존재 하지 않 는 다 고 표시 할 때 JVM 대 체 를 찾 습 니 다. ERROR 는 이상 이 없다 고 표시 합 니 다. 자바 XXX 를 실행 할 때 자바 exe 는 CheckJVM Type 을 통 해 현재 JVM 형식 을 검사 합 니 다. 자바 는 두 가지 매개 변수 로 구체 적 인 JVM 형식 을 지정 할 수 있 습 니 다. 하 나 는 JVM. cfg 파일 의 JVM 이름 에 따라 지정 합 니 다. 두 번 째 방법 은 직접 지정 합 니 다.이들 이 수행 하 는 방법 은 '자바 - J', '자바 - XXaltJVM =' 또는 '자바 - J - XXaltJVM =' 이다.첫 번 째 매개 변수 전달 방식 이 라면 CheckJVMType 함 수 는 매개 변수 '- J' 뒤의 JVM 이름 을 가 져 온 다음 알려 진 JVM 설정 매개 변수 에서 같은 이름 을 찾 으 면 해당 JVM 이름 앞의 '-' 를 제거 하고 이 값 을 되 돌려 줍 니 다.두 번 째 방법 은 '- XXaltJVM =' 또는 '- J - XXaltJVM =' 뒤의 JVM 형식 이름 을 직접 되 돌려 줍 니 다.자바 를 실행 할 때 위의 두 가지 방법 중 하 나 를 지정 하지 않 으 면 CheckJVM Type 은 설정 파일 의 첫 번 째 설정 에 있 는 JVM 이름 을 가 져 와 이름 앞의 '-' 를 제거 하고 이 값 을 되 돌려 줍 니 다.CheckJVM Type 함수 의 이 반환 값 은 아래 함수 에서 jre 경로 와 JVM. dll 의 절대 경 로 를 조합 합 니 다.지정 되 지 않 으 면 JVM. cfg 에서 첫 번 째 로 정 의 된 JVM 을 사용 합 니 다. set 를 통 해Java_LAUNCHER_DEBUG = 1 콘 솔 에서 테스트 합 니 다.
마지막 으로 JVM. dll 의 경 로 를 가 져 옵 니 다. JRE 경로 + \ bin + \ JVM 형식 문자열 + \ JVM. dll 은 JVM 의 파일 경로 입 니 다. 그러나 자바 프로그램 을 호출 할 때 - XXaltJVM = 매개 변수 로 지정 한 경로 path 를 사용 하면 path + \ JVM. dll 파일 을 JVM. dll 의 파일 경로 로 사용 합 니 다.
2: JVM. dll 불 러 오기
첫 번 째 단 계 를 통 해 JVM 의 경 로 를 찾 았 습 니 다. 자바 는 LoadJavaVM 을 통 해 JVM. dll 파일 을 불 러 옵 니 다. 불 러 오 는 작업 은 간단 합 니 다. Windows API 함 수 를 호출 하 는 것 입 니 다.
LoadLibrary 에서 JVM. dll 동적 연결 라 이브 러 리 를 불 러 옵 니 다. 그리고 JVM. dll 의 내 보 내기 함수 JNICreate JavaVM 과 JNIGetDefaultJavaVMInitArgs 는 Invocation Functions 변 수 를 받 은 CreateJavaVM 과 GetDefaultJavaVMInitArgs 함수 포인터 변 수 를 연결 합 니 다.JVM. dll 의 적재 작업 이 완료 되 었 습 니 다.
3. JVM 을 초기 화하 고 로 컬 호출 인 터 페 이 스 를 얻 으 면 자바 에서 JVM 의 함 수 를 호출 할 수 있 습 니 다. InvocationFunctions - > Create 자바 VM 즉 JVM 에서 JNI 를 호출 합 니 다.CreateJavaVM 방법 으로 JNIEnv 구조의 인 스 턴 스 를 얻 습 니 다.
4: 자바 프로그램 을 실행 합 니 다.
자바 프로그램 은 jar 패키지 두 가지 방식 이 있 습 니 다. 하 나 는 class 입 니 다. jar, 자바 - jar XXX. jar 를 실행 할 때 자바. exe 에서 GetMainClassName 함 수 를 호출 합 니 다. 이 함 수 는 JNIEnv 인 스 턴 스 를 먼저 얻 은 다음 자바 류 자바. util. jar. JarFileJNIEnv 에서 방법 getManifest () 를 호출 하고 되 돌아 오 는 Manifest 대상 에서 getAttributes ("Main - Class") 를 가 져 옵 니 다.의 값 은 jar 패키지 의 파일 입 니 다. META - INF / MANIFEST. MF 가 지정 한 Main - Class 의 주 클래스 이름 을 실행 하 는 주 클래스 로 합 니 다.이후 main 함 수 는 자바. c 의 LoadClass 방법 으로 이 주 클래스 를 불 러 옵 니 다 (JNIEnv 인 스 턴 스 를 사용 한 FindClass).main 함 수 는 자바. c 에서 LoadClass 방법 을 직접 호출 하여 이 종 류 를 불 러 옵 니 다.클 라 스 를 실행 하 는 방법 이 라면main 함 수 는 자바. c 에서 LoadClass 방법 을 직접 호출 하여 이 종 류 를 불 러 옵 니 다.
그리고 main 함수 가 JNIEnv 인 스 턴 스 의 GetStaticMethodID 방법 으로 불 러 온 class 주 클래스 를 찾 습 니 다.
"Public static void main (String [] args)" 방법 을 사용 하고 이 방법 이 Public 방법 인지 판단 한 다음 JNIEnv 인 스 턴 스 를 호출 합 니 다.
Callstatic VoidMethod 방법 은 이 자바 류 의 main 방법 을 호출 합 니 다.

좋은 웹페이지 즐겨찾기