• JVM原理(一)JVM通识、JVM架构


    一、JVM通识

    学习JVM的目的

    • 面试重灾区,我们必须搞懂它。
    • 生产过程中,肯定会面临JVM调优相关问题,需要也必须搞懂它。
    • 打基础,想搞懂我们java赖以生存的环境长什么样子,提升对Java知识点的理解。

    1.1 程序的执行方式

    主要有三种:静态编译执行、动态编译执行和动态解释执行。

    注意:此处所说的编译指的是编译成可让操作系统直接执行的机器码

    静态编译执行:C,C++
    动态解释执行(看一行翻译一行执行):JVM
    动态编译执行(运行中进行编译):JVM

    JVM即采用了动态解释又采用了动态编译执行。

    1.2. 为什么使用JVM

    看下面这个图:
    在这里插入图片描述

    可以看到JVM帮我们屏蔽了操作系统。

    C语言是直接编译成机器码,但是编译机器码时需要知道目标操作系统,windows操作系统编译之后的机器码是无法在linux系统上执行

    即C语言多次运行不同的操作系统需要多次编译,而java一次编译到处运行,依赖jvm虚拟机,由它屏蔽操作系统的差异

    1.3 字节码和机器码的区别

    机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。

    字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

    1.4 JDK、JRE与JVM的关系

    在这里插入图片描述

    JDK包含了JRE,JRE是java程序的运行环境。

    JDK:java开发工具包,既包含了JRE,也包含一些编译器等开发工具,例如javac、javap命令
    JRE:java程序运行环境
    JVM:属于JRE中

    1.5 OracleJDK和OpenJDK

    1.5.1 查看JDK的版本

    通过java -version我们可以查看jdk版本

    (1) 如果是SUN/OracleJDK, 显示信息为:

    [root@localhost ~]# java -version
    java version "1.8.0_162"
    Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
    
    • 1
    • 2
    • 3
    • 4

    说明:

    • Java HotSpot(TM) 64-Bit Server VM 表明, 此JDK的JVM是Oracle的64位HotSpot虚拟机, 运行在Server模式下(虚拟机有Server和Client两种运行模式).
    • Java SE Runtime Environment (build 1.8.0_162-b12) 是Java运行时环境(即JRE)的版本信息.

    (2) 如果OpenJDK, 显示信息为:

    [root@localhost ~]# java -version
    openjdk version "1.8.0_144"
    OpenJDK Runtime Environment (build 1.8.0_144-b01)
    OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
    
    • 1
    • 2
    • 3
    • 4

    1.5.2 OpenJDK 的来历

    Java由SUN公司(Sun Microsystems, 发起于美国斯坦福大学, SUN是Stanford University Network的缩写)发明, 2006年SUN公司将Java开源, 此时的JDK即为OpenJDK.

    也就是说, OpenJDK是Java SE的开源实现, 它由SUN和Java社区提供支持, 2009年Oracle收购了Sun公司, 自此Java的维护方之一的SUN也变成了Oracle .

    大多数JDK都是在OpenJDK的基础上编写实现的, 比如IBM J9, Azul Zulu, Azul Zing和Oracle JDK. 几乎现有的所有JDK都派生自OpenJDK, 它们之间不同的是许可证:

    • OpenJDK根据许可证GPL v2发布;
    • Oracle JDK根据Oracle二进制代码许可协议获得许可。

    1.5.3 Oracle JDK的来历

    Oracle JDK之前被称为SUN JDK, 这是在2009年Oracle收购SUN公司之前, 收购后被命名为Oracle JDK。

    实际上, Oracle JDK是基于OpenJDK源代码构建的, 因此Oracle JDK和OpenJDK之间没有重大的技术差异。

    Oracle的项目发布经理Joe Darcy在OSCON 2011 上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的, 两者共用了大量相同的代码(如下图)
    在这里插入图片描述
    注意: 图中提示了两者共同代码的占比要远高于图形上看到的比例, 所以我们编译的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的.

    1.5.4 Oracle JDK与OpenJDK的区别

    • OpenJDK使用的是开源免费的FreeType, 可以按照GPL v2许可证使用.GPL V2允许在商业上使用;
    • Oracle JDK则采用JRL(Java Research License,Java研究授权协议) 放出.JRL只允许个人研究使用,要获得Oracle JDK的商业许可证,需要联系Oracle的销售人员进行购买。

    1.6 JVM和Hotspot的关系

    • JVM是《JVM虚拟机规范》中提出来的规范。
    • Hotspot是使用JVM规范的商用产品,除此之外还有Oracle JRockit、IBM的J9也是JVM产品

    JRockit是Oracle的JVM, 从Java SE 7开始, HotSpot和JRockit合并为一个JVM。

    1.7 JVM和Java的关系

    在这里插入图片描述

    jvm只认识class文件,但不是只有java文件可以编译成class文件!

    1.8 JVM的运行模式

    JVM有两种运行模式:Server模式与Client模式

    两种模式的区别在于:

    • Client模式启动速度较快,Server模式启动较慢;
    • 但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。
    • 因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。

    客户端程序用client模式即可

    二、JVM架构

    在这里插入图片描述

    JVM架构分为四部分

    • class文件
    • 类加载子系统
    • 运行时数据区
    • 执行引擎

    未来也会按照四部分依次讲解。

  • 相关阅读:
    【必知必会的MySQL知识】③DML语言
    非凡十年,且看临工重机的“数智化”之变!
    Windows如何将软件安装在移动硬盘上?
    leetcode669. 修剪二叉搜索树(java)
    市面上最适合跑步用的耳机有哪些、分享五款最优秀的跑步耳机
    74道高级Java面试合集,java开发模式面试题
    Flutter 的状态管理
    专利非正常申请,需要我们注意什么
    双周赛114(模拟、枚举 + 哈希、DFS)
    redis<二>spring使用redis,配置远程登录和密码
  • 原文地址:https://blog.csdn.net/m0_67401055/article/details/126743951