JVM运行机制

        今天我们来聊聊jvm的运行机制,从而了解java程序的运行原理。作为一个高级java程序员,不仅要会编码,而且还要明白自己的程序是如何运行的,这样我们就能在后续的程序调优方面得心应手。接下来从以下几个方面来了解JVM的运行原理。

1.Java程序编译过程

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

编译的过程大致分为三个过程

(编译命令: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程序内部的运行原理,才能够更好的理解自己所写的程序,也能够更好的优化自己的程序。正所谓:知己知彼,百战不殆。

posted @ 2018-03-12 23:22  疯狂的蜗牛仔  阅读(337)  评论(0编辑  收藏  举报