• JVM 整体流程介绍


    一、 JVM自身的物理结构
    从图中可以看出 JVM 的主要组成部分
    ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎),Native Method Library(本地库接口)
    这四大组成部分可以用文字描述如下。JVM 是执行 Java 程序的虚拟计算机系统,然后我们来看看执行过程:首先需要准备编译好的 Java 字节码文件(即class文件),计算机要运行程序需要先通过 类加载器 将 class 文件加载到内存中,即 运行时数据区,但是字节码文件是JVM定义的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解释器,也就是 执行引擎 将字节码翻译成特定的操作系统指令集交给 CPU 去执行,这个过程中会需要调用到一些不同语言为 Java 提供的接口(例如驱动、地图制作等),这就用到了本地 Native 接口(本地库接口)。

    1 ClassLoader

    ClassLoader 负责加载字节码文件即 class 文件,class 文件在文件开头有特定的文件标示,并且 ClassLoader 只负责class 文件的加载,至于它是否可以运行,则由 Execution Engine 决定。

    2 Runtime Data Area

    Runtime Data Area 是存放数据的,分为五部分:Stack(虚拟机栈),Heap(堆),Method Area(方法区),PC Register(程序计数器),Native Method Stack(本地方法栈)。几乎所有的关于 Java 内存方面的问题,都是集中在这块。

    3 Execution Engine

    执行引擎,也叫 Interpreter。Class 文件被加载后,会把指令和数据信息放入内存中,Execution Engine 则负责把这些命令解释给操作系统,即将 JVM 指令集翻译为操作系统指令集。

    4 Native Interface

    负责调用本地接口的。他的作用是调用不同语言的接口给 JAVA 用,他会在 Native Method Stack 中记录对应的本地方法,然后调用该方法时就通过 Execution Engine 加载对应的本地 lib。原本多用于一些专业领域,如JAVA驱动,地图制作引擎等,现在关于这种本地方法接口的调用已经被类似于Socket通信,WebService等方式取代。
    执行引擎及本地方法接口不过多进行介绍,我们重点关注其余两个部分:
    1. ClassLoader : 类加载器相关知识点,包括类的双亲委派加载机制,加载过程等。
    2. Runtime Data Area : JVM 内存管理相关知识点,包括内存划分、常用设置、JVM 调优、垃圾回收及常见内存溢出问题的排查解决等。
    二、Java 代码编译直到执行的整个流程
    1.Java源码编译机制
    Java 源码编译是由 Java 源码编译器来完成的。Java 源码编译由以下三个过程组成:
    • 分析和输入到符号表
    • 注解处理
    • 语义分析和生成class文件
    流程图如下所示:
    最后生成的class文件由以下部分组成:
     
        结构信息。包括class文件格式版本号及各部分的数量与大小的信息
        元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池
        方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息
    2.类加载机制
     
    JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
    1)Bootstrap ClassLoader
     
    负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
     
    2)Extension ClassLoader
     
    负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
     
    3)App ClassLoader
     
    负责记载classpath中指定的jar包及目录中class
     
    4)Custom ClassLoader
     
    属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
     
    加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
     
    3.类执行机制
     
    JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧主要有局部变量区和操作数栈两部分,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:
     
     4.Java 字节码执行
    Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:
     
  • 相关阅读:
    通过Vim+少量插件配置一个高效简洁的IDE
    Javascript中Closure及其相关概念
    MongoDB对Javascript的支持
    正则表达式中分组功能高级用法
    NAT穿透解决方案介绍
    平衡二叉树算法分析
    字符串匹配KMP算法详解
    node 内存溢出
    React项目编译node内存溢出
    正则表达正整数/正则表达正整数不包括0
  • 原文地址:https://www.cnblogs.com/studyMoreRich/p/jvm-process.html
Copyright © 2020-2023  润新知