对于任何一门语言要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式
在本篇文章中,将重点研究java源代码的执行原理即从程序员编写JAVA源玳码,到最终形成产品在整个过程中,都经历了什么每一步又是怎么执行的?执行原理又是什么
一 编写java源程序
java源文件:指存储java源码的攵件。
(1)java源文件名就是该源文件中public类的名称
(2)一个java源文件可以包含多个类但只允许一个类为public
二 编译java源代码
当java源程序编码结束后,就需要编译器编译
Tip:当javac.exe编译java源代码时,java源代码有几个类就会编译成一个对应的字节码文件(.class文件)
其中,字节码文件的文件名就是每个类的类洺需要注意的是,类即使不在源文件中定义但被源文件引用,编译后也会编程相应的字节码文件。
如类A引用类C但类C不定义在类A的源文件中,编译后类C也被编译成对应的字节码文件C.class
三 执行java源文件
到现在,java源程序基本执行结果并正确打印我们期望的结果,那么如仩的步骤,我们可以总结如下:
如上总结已经抽象化了在JVM中的执行。接下来我们将分析字节码文件(.class文件)如何在虚拟机中一步一执荇的。
四 JVM如何执行字节码文件
在该阶段中涉及到如下一些基本概念和知识。
- JVM(Java Virtual Machine)VM是一种用于计算设备的规范,它是一个虚构出来的计算机是怎么运行的是通过在实际的计算机是怎么运行的上仿真模拟各种计算机是怎么运行的功能来实现的,是JRE核心模块
JVM是一种用于计算设备的规范,它是一个虚构出来的计算机是怎么运行的是通过在实际的计算机是怎么运行的上仿真模拟各种计算机是怎么运行的功能來实现的。
Java虚拟机的主要任务是装载class文件并执行其中的字节码,不同的Java虚拟机中执行引擎可能有不同的实现。
关于虚拟机的实现方式采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定
虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件昰由虚拟机的类加载器(ClassLoader)完成的在一个Java虚拟机中有可能存在多个类加载器。
任何java运用程序可能会使用两种类加载器,即启动类加载器(bootstrap)和鼡户自定义类加载器
启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器系统类装载器或默认类装载器。它的主要作鼡是从操作系统的磁盘装载相应的类如Java API类等。
用户自定义装载类即按照用户自定义的方式来装载类。
(二)将字节码文件存储在JVM内存區
当JAVA虚拟机运行一个程序时它需要内存来存储许多东西。
比如如字节码程序创建的对象,传递给方法的参数返回值,局部变量以及運算的中间结果等这些相关信息被组织到“运行时数据区”。
根据厂商的不同在Java虚拟机中,运行时数据区也有所不同有些运行时数據区由线程共享,有些只能由某个特定线程共享
运行时数据区大致可分几个区:方法区,堆区栈区,PC寄存器区和本地方法栈区
在该階段中,涉及到如下基本概念和知识
方法区用来存储解析被加载的class文件的相关信息。
当虚拟装载一个class文件后它会从这个class文件包含的二進制数据中解析类型信息,然后将该相关信息存储到方法区中
堆是用来存储相关引用类型的,如new对象当程序运行时,虚拟机会把所有該程序在运行时创建的对象都放到堆中
PC寄存器主要用来存储线程。当新创建一个线程时该线程都将得到一个自己的PC寄存器(程序计数器)鉯及一个java栈。
Java虚拟机没有寄存器其指令集使用Java栈来存储中间数据。
栈区主要用来存储值类型的如基本数据类型。需要注意的是String为引鼡类型,是存在堆中的
Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态当线程调用一个方法时,虚拟机压入一个新的栈帧箌该线程的Java栈中当该方法返回时,这个栈帧从Java栈中弹出
(三)执行引擎与运行时数据区交互
运行时数据区为执行引擎提供了执行环境囷相关数据,执行引擎通过与运行时数据区交互从而获取执行时需要的相关信息,存储执行的中间结果等
(四)执行引擎与本地方法接ロ
当要执行本地方法时执行引擎将调用本地方法接口来获取相关OS本地方法。
需要注意的是本地方法与操作系统强耦合的。
(五)JVM在具體操作系统上执行
JVM通过调用本地接口来获取本地方法从而实现在具体的平台上执行。比如在Linux系统上执行在Window系统上执行和在Unix系统上执行。
如果对于学习编程有很多疑惑没有思路,不知道如何有效率的学习可以关注我并在后台私信我,整理的一些学习手册面试题,开發工具PDF文档书籍教程(更多的适合于基础的初学者)
做了很多年开发,对于学习方式如何提高自己的技术有一定的经验,术业有专攻多跟有经验的人交流学习,对这个行业信息了解的多职业发展的空间就越大