什么是Java虚拟机?

要弄明白Java程序的执行过程首先要了解一下Java虚拟机。

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

Java虚拟机(Java Virtual Machine简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。

可以看到,Java虚拟机是在原有计算机的基础上虚拟出来的抽象计算机,提供Java程序的运行环境。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM是Java平台无关的基础,使Java程序能够做到 “Write Once, Run Anywhere”。

Java程序执行过程

图解执行过程

那有了Java程序的运行环境等一些列支持后,Java程序是如何做到从一个只有代码的.java源文件变成计算机可执行的文件的呢?

如下图,是Java程序的执行过程。

大致过程就是,我们写好的.java文件(源文件)被编译器编译后变成.class文件(字节码),然后被JVM的类加载器加载到内存,通过字节码校验器去做一些校验,校验通过后交由解释器将字节码文件解释成计算机能够识别的机器指令。

名词解释:

字节码:字节码是已经经过编译,但与特定机器码无关,需要解释器转译后才能成为机器码的中间代码。

Java字节码:是Java虚拟机执行的一种指令格式。

解释器:是一种电脑程序,能够把高级编程语言一行一行直接翻译运行。解释器不会一次把整个程序翻译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每翻译一行程序叙述就立刻运行,然后再翻译下一行,再运行,如此不停地进行下去。它会先将源码翻译成另一种语言,以供多次运行而无需再经编译。其制成品无需依赖编译器而运行,程序运行速度比较快

具体执行过程

通过上图我们知道Java程序的执行会经过一下几个步骤:​编译-->装载字节码-->校验字节码-->解释字节码-->执行,然后我们看一下这几个步骤具体执行过程,以及Java程序的执行过程对应到我们的实际操作:

1、编译

在windows环境中,打开命令窗口,切换到java文件的目录,使用 javac命令,执行 javac xxx.java把.java文件编译成.class文件

2、装载字节码

编译好的.class文件交给 JVM 执行,即使用java命令,执行java xxx(.class文件的名称,不带后缀)。java命令将会启动 JVM,并将后面的参数作为初始化类,通过 JVM 内的类加载器将字节码文件装载到内存中。

3、校验字节码

类的加载是通过类加载器进行的,加载完后,先由字节码校验器负责检查那些无法执行的明显有破坏性的操作。除了系统类之外,其他类都要被校验。

校验器执行的一些检查:

变量要在使用前初始化

方法调用与对象引用类型之间要匹配

访问私有数据和方法的规则没有被违反

对本地变量的访问都在运行的堆栈内

运行时堆栈没有溢出

如果这些检查没有通过,类最终不会被加载完成。

4、解释字节码

JVM 把每一条要执行的字节码交给解释器,翻译成对应的机器语言,最终由操作系统执行。

JVM 解释执行字节码文件就是 JVM 操作 Java 解释器进行解释执行字节码文件的过程。

维基百科

机器语言:机器语言(machine language)是一种指令集的体系。这种指令集称为机器代码(machine code),是计算机的CPU可直接解读的数据。

结语

实际上 JVM 执行字节码文件远比这复杂,其中还包括即时编译器、指令重排等优化。这里只是对 Java 程序的执行过程做一个大致的介绍,让 Java 程序员能够明白自己写的程序在 JVM 里到底是如何执行的。如果要深入研究 JVM 的更多细节,建议大家去看书或其他资料。

-----

文章首发于公众号@编程大道,欢迎微信搜索关注,第一时间接收文章发布通知。扫码关注噢

java怎么运行_不要再问我Java程序是怎么执行的了!相关推荐

  1. java说影_面试被问到Java虚拟机,用这篇文章怼过去

    Jvm内存结构 Jvm内存结构,一般是面试官对Java虚拟机这块考察的第一问.讲真,还没背会,自己罚自己面壁思过. Java虚拟机的内存结构一般可以从线程共有和线程私有两部分起头作答,然后再详细说明各 ...

  2. 面试官,不要再问我“Java虚拟机类加载机制”了

    关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...

  3. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  4. 不要再问我“Java GC垃圾回收机制”了

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底 ...

  5. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了

    点击上方"占小狼的博客",选择"设为星标" 本文阅读时间大约4分钟. 来源:https://dwz.cn/dLRLBZab Java虚拟机层面所暴露给我们的状态 ...

  6. java 输出中文_没见过的 Java 编程入门教程!例程使用中文标识符代码:问个好吧...

    前言 Java 教程用中文写(如下)更能被新手理解学习.可惜至今没有看到类似入门教程,在此敢为人先. 注意:本教程的所有 Java 代码都可以正确运行,因为 Java 早已支持中文命名标识符. 编程语 ...

  7. 大三学生简历_不要再问那些没有的高级开发人员了。 开始指导大三学生。

    大三学生简历 by Ryan Bigg 通过瑞安·比格(Ryan Bigg) 不要再问那些没有的高级开发人员了. 开始指导大三学生. (Stop asking senior developers wh ...

  8. docker管理mysql风险_不要再问了,数据库不建议上Docker

    不要再问了,数据库不建议上Docker 前言 近2年Docker非常的火热,各位开发者恨不得把所有的应用.软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗? 这个问题不是子虚乌有 ...

  9. 【Java进阶营】10道经典java面试题_实习生必问

    第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 ...

最新文章

  1. StyleSheet文件中路径处理
  2. 牛B的调试工具:OzCode
  3. tensorflow-计算图
  4. cocos2dx-Lua与Object的通讯机制
  5. php取json子对象属性,php中输出json对象的值(实现方法)
  6. java验证码画布类型,【Java工具类】使用Kaptcha生成验证码写回页面中
  7. [css] 为什么说css的选择器一般不要超过三级?
  8. [转]浅谈MS-SQL锁机制
  9. java如何实现广告弹窗,WPF实现消息提醒(广告弹窗)
  10. 如何保证http传输安全性
  11. ARMLINUX学习笔记(5)-----ADS建立工程
  12. tracert查网络问题
  13. 施密特触发器HSPICE仿真【内附代码】
  14. 年终固定资产盘点报告可一键生成
  15. TextView 字体中间加 横划线
  16. GDDR6X和GDDR6差距对比 GDDR6X和GDDR6区别
  17. 2016 年 50 个最佳的轻量级 JavaScript 框架和库一
  18. 四、卷积、转置卷积(上卷积)大小计算公式
  19. 云图科技,长沙VR多方面给人们带来了新的体验!
  20. 计算机网络ospf实验报告,计算机网络实验报告 12_OSPF实验.doc

热门文章

  1. 基于JAVA+Swing+MYSQL的在线订餐管理系统
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的家乡美管理系统
  3. java 字符串编程题_Java编程题——在一个字符串中查找第一个非重复的字符
  4. 【转】NodeJS教程--基于ExpressJS框架的文件上传
  5. C# 给自己写的软件,加注册码功能。
  6. 学习笔记 - 002
  7. 57 - 算法 -贪心算法 - 区间不相交问题
  8. Java面向对象之继承、super关键字、方法重写
  9. cmd中python -V版本显示不出来
  10. python的作用域分别有几种_python 作用域知识点整理