당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?

디렉토리

자바 소스 코드로 작성 하나,

둘째, 자바 소스 코드를 컴파일

자바 소스 파일의 셋째, 구현

네, JVM 실행하는 방법 바이트 코드 파일

어떤 하나 개의 언어를 들어, 실력 수준, 원칙 (또는라는 기본 메커니즘) 결국, 좋은 방법의 구현에 대한 연구에 도달하기 위해있다.

이 글에서, 우리는 과정을 통해 최종 제품 형태 프로그래머에서 자바 소스 코드로 작성된 자바 소스 코드의 원칙의 구현에 초점을 맞출 것이다, 무슨 경험? 각 단계는 그것을 구현하는 방법은? 원칙의 구현은 무엇인가?

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


자바 소스 코드를 작성

자바 소스 파일 : 저장 자바 소스 파일을 참조.

이제 다음 코드를 살펴 보자 :

수정 // MYTEST 대중, 그것은 MYTEST라는 이름의 자바 소스 파일을 저장하는 
공용 클래스 MYTEST { 
 공공 정적 무효 메인 (문자열 []에 args) { 
 에서 System.out.println ( ". 테스트 자바하는 프로세스 실행을"); 
 } 
} 
/ 수정 된 대중, 그것은 공용 클래스를 수정 사용할 수 없기 때문에 / MYTEST입니다 
A는 {} 클래스 
// 대중이 MYTEST 이후에 수정 된를, 클래스 B는 너무 대중 수정할 수 없습니다 
} {클래스 B를

(1) 자바 소스 파일 이름은 소스의 이름 공용 클래스 파일입니다

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


(2) 자바 소스 파일은 여러 클래스를 포함하지만, 단지 공용 클래스를 허용 할 수 있습니다

두 컴파일 소스 코드를 자바

자바 소스 코드의 종료 후, 당신은 컴파일러가 필요합니다.

JDK를 설치 한 후, 우리는 디렉토리를 열고 JDK는이 개 .exe 파일, 즉 javac.exe (컴파일 된 소스 코드, xxx.java 파일)과의 java.exe (바이트 코드 실행, xxx.class 파일)이 있습니다.

아래 그림과 같이 :

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


도 1은, 폴더 MyTest.java 전환

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


2, javac.exe 컴파일 MyTest.java

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


编译后,发现e:\Blogs 目录多了以class为后缀的文件:A.class,B.class和MyTest.class

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


Tip:当javac.exe编译java源代码时,java源代码有几个类,就会编译成一个对应的字节码文件(.class文件)

其中,字节码文件的文件名就是每个类的类名。需要注意的是,类即使不在源文件中定义,但被源文件引用,编译后,也会编程相应的字节码文件。

如类A引用类C,但类C不定义在类A的源文件中,编译后,类C也被编译成对应的字节码文件C.class

三 执行java源文件


执行java源文件,用java.exe执行即可

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


到现在,java源程序基本执行结果,并正确打印我们期望的结果,那么,如上的步骤,我们可以总结如下:

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


如上总结,已经抽象化了在JVM中的执行。接下来,我们将分析字节码文件(.class文件)如何在虚拟机中一步一执行的。

四 JVM如何执行字节码文件

(一)装载字节码文件

当 .java 源码被 javac.exe 编译器编译成 .class 字节码文件后,接下来的工作就交给JVM处理。

JVM首先通过类加载器(ClassLoader),将class文件和相关Java API加载装入JVM,以供JVM后续处理。

在该阶段中,涉及到如下一些基本概念和知识。

1.JDK,JRE和JVM关系

  • JDK(Java Development Kit),Java开发工具包,主要用于开发,在JDK7前,JDK包括JRE

  • JRE(Java Runtime Environment),Java程序运行的核心环境,包括JVM和一些核心库

  • JVM(Java Virtual Machine),VM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是JRE核心模块。

2.JVM

JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java虚拟机的主要任务是装载class文件,并执行其中的字节码,不同的Java虚拟机中,执行引擎可能有不同的实现。

大致有如下几种引擎:

  • 一次性解释字节码引擎

  • 即时编译引擎

  • 自适应优化器

关于虚拟机的实现方式,采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定。

3.什么是ClassLoader

虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件是由虚拟机的类加载器(ClassLoader)完成的,在一个Java虚拟机中有可能存在多个类加载器。

任何java运用程序,可能会使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。

启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它的主要作用是从操作系统的磁盘装载相应的类,如Java API类等。

用户自定义装载类,即按照用户自定义的方式来装载类。

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


(二)将字节码文件存储在JVM内存区

当JAVA虚拟机运行一个程序时,它需要内存来存储许多东西。

比如如字节码,程序创建的对象,传递给方法的参数,返回值,局部变量以及运算的中间结果等,这些相关信息被组织到“运行时数据区”。

根据厂商的不同,在Java虚拟机中,运行时数据区也有所不同。有些运行时数据区由线程共享,有些只能由某个特定线程共享。

运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。

在该阶段中,涉及到如下基本概念和知识。

1、方法区

方法区用来存储解析被加载的class文件的相关信息。

当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。

2.堆

堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

3.PC寄存器

PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。

Java 가상 머신은, 중간 데이터를 저장하기 위해 자바 스택을 이용하여 명령 세트를 등록하지 않는다.

4. 스택 영역

이러한 기본 데이터 타입과 같은 값 유형을 저장하기위한 메인 스택 영역. 또한 주목해야 스트링은 참조 형식 힙의 존재이다.

자바 스택이 많은 스택 프레임으로 구성되고, 스택 프레임은 자바 메소드 호출 스레드가 메소드를 호출 할 때, 가상 머신이 쓰레드의 자바 스택에 새로운 스택 프레임을 밀어, 메소드가 리턴의 상태를 포함 이 자바 스택 프레임은 스택에서 팝됩니다.

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


(ⅲ) 실행 엔진의 실행 시간 데이터 영역과 상호 작용

정보가 그것을 수행하기 위해 필요한 획득 실행 등의 중간 결과를 저장하도록 실행 엔진에 대한 런타임 데이터 영역, 런타임 데이터 영역과의 상호 작용을 통해 실행 환경과 관련 데이터, 실행 엔진을 제공한다

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


(ⅳ) 실행 엔진과 원시 메소드 인터페이스

로컬 방법을 수행 할 때, 실행 엔진은 관련 OS 네이티브 메소드를 얻기 위해 네이티브 메소드 인터페이스를 호출합니다.

로컬 방법은 강력 운영 체제와 함께 결합되어 있습니다.

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


(E) JVM은 특정 운영 체제에서 실행될

JVM은 특정 플랫폼에서 실행 가능 로컬 인터페이스를 호출하여 기본 방법을 얻을 수 있습니다. 예를 들어, 수행, 및 윈도우 시스템에 유닉스 시스템에서 수행 리눅스 시스템.

당신은 자바 코드가 어떻게 출력 결과 단계에 의해 단계입니다 쓰기?


추천

출처blog.51cto.com/14528283/2446023