JVM运行机制

        今天咱们来聊聊jvm的运行机制,从而了解java程序的运行原理。做为一个高级java程序员,不只要会编码,并且还要明白本身的程序是如何运行的,这样咱们就能在后续的程序调优方面驾轻就熟。接下来从如下几个方面来了解JVM的运行原理。java

1.Java程序编译过程程序员

Java程序的编译过程简单来讲就是java源程序(.java文件)到Jvm字节码(.class文件)的过程,主要由Java编译器来完成。在编译一个java类程序以前先编译所依赖的全部类。jvm

编译的过程大体分为三个过程优化

(编译命令:javac hello.java)编码

1)  词法分析和输入符号表操作系统

2)  注解处理线程

3)  语义分析和生成字节码翻译

详细过程:设计

源代码文件*.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> JVM字节码文件*.class指针

编译后的Class文件主要包含三项内容

(查看class文件结构命令:javap –c hello)

1) 结构信息:class文件相关信息

2) 元信息:源码中的声明和常量信息

3) 方法信息:源码中的语句和表达式对应的字节码

2.Java程序加载过程

Java程序的加载过程就是.class被加载到jvm内存中的过程,主要由类加载器ClassLoader完成。

类加载器的分类主要分为四类,分别加载不一样的路径:

  • 根加载器Bootstrap ClassLoader
  • 扩展加载器 Ext ClassLoader
  • 系统应用加载器 App ClassLoader
  • 用户自定义加载器 Custom ClassLoader

JVM对类的加载过程分为三步:

1)  装载:负责将二进制文件加载到Jvm内存中。

2)  连接:负责二进制文件格式校验,初始化装载类中的静态变量以及解析类中调用的接口和类。

3)  初始化:静态初始化代码,构造器、静态属性初始化以及jvm指定的初始化代码。

3.Java程序执行过程

完成各类初始化工做以后,而后交由jvm执行引擎来进行处理,执行引擎把字节码转为机器码,而后操做系统才能够真正调用,在硬件环境上执行代码。执行引擎的经过Java字节码解释器(一行一行解释字节码)和JIT即时编译器(对热代码整段编译)来完成机器码的翻译工做。

4.JVM启动流程

Jvm执行一个main方法前都要进行哪些准备工做。主要步骤有:

1) 配置JVM装载环境:JVM.dll文件的查找和装载

2) 解析虚拟机参数:解析参数,验证参数

3) 设置线程栈大小:根据系统类型,加载配置文件,不一样系统,线程栈的大小都不一样

4) 执行Java main方法

5.JVM基本结构 

接下来分别介绍以上几个重要的内容

PC寄存器:每一个线程都会拥有一个PC寄存器,随线程的建立而建立,PC寄存器的做用就是执行下一条指令执行的地址。在执行本地方法时,PC寄存器的值为undefined。

方法区:保存类装载的信息(类型的常量信息,方法信息,方法字节码),方法区一般和永久区联系在一块儿。

Java堆:这是和咱们程序员密切相关的一部分,new出来的每一个对象都在堆中,java堆也是线程共享的。

Java栈:栈由一系列的帧组成,所以也称栈帧,它是线程私有的。帧保存一个方法的局部变量,操做数栈,常量池指针,每一次的方法调用都会建立一个帧,而后压栈。

 6.JVM内存模型 

JVM的内存模型设计也是很是的巧妙。每个线程都会有一个工做内存和主存独立,而每一个工做内存中的存放的是主存中共享变量的拷贝。

对于JVM的了解,做为一个优秀程序员是必修课,由于只有了解了java程序内部的运行原理,才可以更好的理解本身所写的程序,也可以更好的优化本身的程序。正所谓:知己知彼,百战不殆。

相关文章
相关标签/搜索