zoukankan      html  css  js  c++  java
  • JVM学习笔记第一章:JVM与Java结构

    ------------恢复内容开始------------

      目录:

        1、Java及JVM简介
        2、Java发展的重大事件
        3、虚拟机与Java虚拟机
        4、JVM的整体结构
        5、Java代码执行流程
        6、JVM的架构模型
        7、JVM的生命周期
        8、JVM的发展历程

    1、Java及JVM简介

     Java是一门跨平台的语言,运行Java程序需要依靠JVM,我们都知道Java运行的流程是先编译为class文件,然后再由JVM解释执行,就像下面的图一样:

    我们Java的特点就是一处编译,处处运行,那么我们处处运行所依靠的就是JVM虚拟机,JVM虚拟机只要求你给它符合JVM规范的字节码文件,那么你只需要在你的平台上装上适合你平台的JVM,然后我们不需要关系代码,直接将字节码文件让JVM运行就行了。

     

    但是你可能不知道JVM的强大之处,JVM它不仅仅可以用来运行Java,还可以运行其他其他语言,如果你没去了解过,可能你会不信,但是事实就是这样的,如下图:


    从这里我们可以得知,JVM可以看作一个运行的容器,它运行的东西就是字节码文件,但是字节码文件从哪里来,它最初是什么语言,这些都不重要,只要字节码文件符合了JVM给出的规范(具体规范可查看官网),那么就可以运行。

    那么既然JVM可以运行多种语言,那么以后的趋势就可能变成多语言混合开发,让各个语言使在他们最擅长的地方,正所谓没有最好的语言,只有最适合的语言,那么我们混合开发在不同的场景使用不同的语言,岂不美哉吗?

    需要注意哈,Java可能不是最吊的语言,但是JVM一定是最吊的虚拟机

    看到这里你可能还会有疑问,Java语言本身和JVM到底啥关系?

      最初Java出来的时候,JVM(Java Virtual Machine)就伴随着出现,以前却是JVM是用来搞Java的,但是随着JVM不断地迭代更新,现在的JVM不仅仅可以用来执行Java,执行的字节码文件只要符合JVM规范即可。

        通俗易懂点:原来Java是JVM的女朋友,但是随着JVM的成长,JVM现在想给更多的女孩一个家,嗯,就这样。

    2、Java发展的重大事件

       1):1990年,在sun公司中,由Patrick Naughton、MikeSheridan及James Gosling领导的小组Green Team,开发出的新语言,命名为Oak,后期改名为Jav 1a

       2):1995年,sun正式发布Java和HotJava产品,Java首次公开亮相

       3):1996年,在1月23日sub发布了JDK1.0

       4):1998年,JDK1.2版本发布。同时,sun发布了jsp/servlet、EJB规范,以及将Java分成了J2EE,J2SE,J2ME。这表明了Java开始向企业、桌面应用和移动设备领域挺进。

       5):2000年,JDK1.3发布,Java HotSpot Virtual Mechanical正式发布,成为Java默认的虚拟机。

       6):2002年,JDK1.4发布,古老的Classic虚拟机退出了舞台。

       7):2003年年底,Java平台的Scala正式发布,同年Grovy也加入了Java阵营。

       8):2004年,JDK1.5发布。同时JDK1.5改名为JDK5.0
       9):2006年,JDK1.6发布,同年,Java开源并建立了OpenJDK,然后HotSpot就成为了OpenJDK的默认虚拟机。

       10):2007年,Java平台迎来了新伙伴Clojure

       11):2008年,Oracle收购EBA,得到了JRockit虚拟机

       12):2009年,Twitter宣布把后台大部分程序从Ruby迁移到Scala,这又是Java平台的又一次大规模应用。

         13):2010年,Oracle收购了Sun,获得Java商标和最具价值的HotSpot虚拟机,此时,Oracle拥有了占有市场份额最高的两款虚拟机,HotSpot和JRockit,并未来计划进行整合为HotRickit(但是后面其实没有整合,只是将JRockit中一些优秀的部分借鉴到了HotSpot中)。

       14):2011年,JDK7发布,在jdk1.7u4中,正式启用了新的垃圾回收器G1

       15):2017年,JDK9发布,将G1设置为默认,替代了CMS

        同年,IBM的J9虚拟机开源,并形成现在的Open J9社区。

          16):2018年,Android的Java侵权案判决,Goole赔偿Oracle19亿美元

         同年,Oracle宣告JavaEE成为历史名词,JDBC、JMS、Servlet赠与予Eclipse基金会。

              同年,JDK11发布,LTS版本的JDK,发布革命性的ZGC,调整JDK授权许可

      17):2019年,JDK12发布,加入RedHat领导开发的Shenandoah GC

    3、虚拟机与Java虚拟机

     虚拟机:

      虚拟机就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟的计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机。

      系统虚拟机就是VmWare这种,完全对物理计算机的仿真。

      程序虚拟机就是JVM这种,专门为执行单个计算机程序而设计。

      无论是系统虚拟机还是物理虚拟机 ,都会收到虚拟机提供的资源限制中。

    Java虚拟机:

      Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。

      JVM平台的各种语言共享Java虚拟机带来的跨平台性、优秀的垃圾回收机制、以及可靠的即时编译器。

      Java技术的最核心部分都是JVM(Java Virtual Machine)虚拟机,因为所有的程序都需要运行在JVM中

    Java虚拟机的作用:

      Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令。每一条Java指令,Java虚拟机规范中都有详细的定义,比如如果存操作数,取操作数,处理结果存放在哪等。

    Java虚拟机的在计算机中的位置:

      

        JVM是在操作系统之上的,它并不会直接操作硬件。

    4、JVM的整体结构

     

    JVM整体结构的一个简图。

    5、Java代码执行流程

     

    首先Java源码由Java编译器翻译为class字节码文件,然后将字节码文件交由Java虚拟机解释运行,首先是由类加载器加载,然后校验字节码文件合法,然后由解析器和即时编译器进行执行(HotSpot才是这样的)。

    课程中的解释:

      1、编译器编译过程中,任何一个节点执行失败就会造成编译失败。

      2、虽然各个平台的JVM虚拟机内部实现细节不同,但是它们共同执行的字节码内容却是一样的。

      3、JVM的主要任务就是讲字节码装载到其内部,解释/编译为对应平台上的机器指令(即:汇编语言)执行。

       4、Java虚拟机使用类加载器(Class Loader)装载class文件。

      5、类加载完成之后,会进行字节码校验,字节码校验通过只有JVM解释器会把字节码翻译为机器码(即汇编语言)交由系统执行。

      6、并不是所有代码都是解释执行的,比如HotSpot虚拟机,它就是配合着JIT(即时编译器)做代码缓存一起用的。

    6、JVM的架构模型

    JVM的架构模型大致分为两种:

      基于栈的指令集架构、基于寄存器的指令集架构。

    区别这两种架构之间的区别:

      基于栈的指令集架构:

        1:设计和实现更简单,适用于资源受限的系统

        2:避开了寄存器的分配难题,使用零地址指令方式分配

        3:指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译容易实现。(但是指令数量比寄存器多很多)

        4:不需要硬件支持,可移植性好,更好实现跨平台

      基于寄存器的指令集架构:

          1:典型的应用是x86的二进制指令集:比如传统的PC以及Android的Daalik虚拟机

        2:指令集架构完全依赖硬件,可移植性差

        3:性能优秀和执行更高效

        4:话费更少的指令去完成一项操作。(但是单个指令的大小比基于栈的更大)

        5:在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈架构的指令集却是以零地址指令为主

      举例一个操作图:

      

    7、JVM的生命周期

     

     

    8、JVM的发展历程

     Sun classic VM

    Exact VM

    HotSopt VM

    JRoickt

     

    J9 

    CDC/CLDC HotSpot

     

    Azul VM

    Liquid VM

    Apach Hermony

     Microsoft JVM

     TaoBaoJVM

     

    Dalvik VM

    其他 

     

    Graal VM 

    本文仅仅是记录笔记,切勿当真。

  • 相关阅读:
    【Log历练手册】Spring事务管理不能提交异常
    【网络安全】如何使用OpenSSL工具生成根证书与应用证书
    【网络安全】如何使用OpenSSL工具生成根证书与应用证书
    【JAVA笔记——器】Spring Aop 实现Log日志系统——基本实现
    jdbc连接池配置方法
    用于读/写配置的工具,下面列出了各种配置(从最高优先级到最低优先级)
    文件复制Util写法,可以适用于多种条件
    记录一个工作中遇到的问题,svn拉的项目,pom.xml报错
    layui的js写法,部分代码
    JDBCUtil连接数据库的写法
  • 原文地址:https://www.cnblogs.com/daihang2366/p/12814958.html
Copyright © 2011-2022 走看看