关于JVM(基本常识)

2023-05-16

目录

一、JVM是什么

        1、概述

二、为什么要用JVM

        1、java程序的执行流程

        2、JVM的架构

一、JVM是什么

        1、概述

                 关于JVM,在百度上的解释为:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

                简单地说,JVM是《JVM虚拟机规范》中提出来的规范,并不是具体实现,相当于“接口”,而真正实现他的是形如HotSport的“实现类”。

                从百度的定义来看,我们可以发现:JVM并不是只为Java语言服务,而是针对字节码文件,只要是字节码文件,JVM就支持。

 像java语言自不必说,还有大数据开发常用的Scala语言,Groovy语言,python等其他语言经过处理也可以转换成字节码文件,从而在JVM环境中运行。

二、为什么要用JVM

        1、java程序的执行流程

                程序执行的方式一般有三种,包括静态编译执行、动态编译执行、动态解释执行。编译指的是将程序编译成可让操作系统直接执行的机器码。在java语言中,程序的执行方式是以动态解释为主,动态编译为辅(静态编译执行类似C语言,编译成可执行文件(windows一般是exe,Linux一般为sh),里面存的都是机器码)。

                1.1字节码与机器码的区别:

                                机器码:是CPU直接读取的机器指令,运行速度非常快。

                                字节码:一种中间状态的二进制文件,需要直译器转译后才能变成机器码。   

                1.2执行流程图:

                                                     

                         如上图得出一个结论:java程序编译成的字节码文件可以做到一次编译到处使用,字节码不分操作系统,而不同的操作系统的JVM是不同的,所以只要是字节码,就能在不同的平台由不同的JVM解释成为机器码进行运行使用,所以为什么jdk的下载区分操作系统,这也体现了java语言的(.class字节码文件)强大的跨平台性和可移植性。

                1.3JDK、KRE、JVM之间的关系

                        JDK主要包括了编译器等开发工具和JRE两部分,JRE包含了JVM和运行类库。

                有关OpenJDK和OracleJDK的区别

                        在命令行中使用命令        java -version   通过查看结果进行区分

                                ①若为下图所示:

                                 则表示该JDK为OracleJDK,其中HotSpot为JVM的实现,HotSpot为JVM规范的商用产品,除此之外还有Oracle JRockitIBMJ9;Server为该JVM的运行模式,JVM有两种运行模式,分别为Client模式和Server模式;对于这两种模式,他们是互补的关系,区别在于Client模式启动速度较快,Server模式启动较慢; 但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。 因为Server模式启动的JVM采用的是重量级的虚拟机,对程序进行了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。

                                ②若结果为

                                        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),则为OpenJDK,OpenJDK和OracleJKD的区别主要在于:OpenJDK最早为SUN公司进行开发维护,在SUN公司被Oracle公司收购之后,Oracle也就成了唯一的维护者,OracleJDK是在OpenJdk的基础上构建实现的,他们之间的技术差别其实并不大;OpenJDK可免费商用,而OracleJKD个人使用免费,商用需要付费。

        2、JVM的架构

               

                 2.1基于JVM架构的JVM程序执行流程:

                        首先,由java编译器(javac)将java源代码.java文件编译成为java字节码.class文件,该字节码文件可能存在于网络、内存、硬盘等地方,而JVM都有方式可以将其加载到类装载器中,进行字节码验证等操作,若为非法字节码文件,则会被丢弃,之后再通过对于热点代码的判断,在java解释器和即时编译器之间进行协调选择执行,然后转换成操作系统可识别的机器码运行程序。

                2.2java解释器和编译器(JIT)之间的协调配合流程:

                在一些商用JVM实现中(这里举例HotSpot) ,字节码转换为机器码的操作最初是由解释器interpretor执行的,但是当一个代码或者代码块执行的次数(如一个方法的频繁调用和循环体的多次执行)很多时,如果每次都进行解释,那么对于空间会造成浪费和拥挤,也会降低JVM的性能,导致程序的执行缓慢,而JIT(Just In Time Compiler)很好的解决了这个问题,在JIT中(参照上图的JVM架构图),探测器检测并判断哪些代码为热点代码,并标记,然后将他们编译成与本地平台相关的机器码,并进行代码的优化,提高了程序执行的效率;JIT是属于在运行时进行编译的动态编译,这种编译方市因为编译发生在方法执行过程之中,因此形象的称为栈上替换(On Stack ReplacementOSR),即方法栈帧还在栈上,方法就被替换 了

                2.3热点代码的探测有两种方式,分别是基于采样的热点探测基于计数器的热点探测

  • 基于采样的热点探测:虚拟机会周期性地检查各个线程的栈顶,如果发现某些方法经常出现在栈顶,那这个方法就是热点方法这种探测方法的好处是实现简单高效,还可以很容易地获取方法调用关系(将调用堆栈展开即可),缺点是难以精确地确认一个方法的热度,容易因为受到线程阻塞或别的 外界因素的影响而扰乱热点探测。
  • 基于计数器的热带探测:虚拟机会为每个方法(甚至是代码块)建立计数器,统计方法的执行次数,如果执行次数超过一定的阀值(通常情况下为10000次,也可以自定义),就认为它是热点方法这种统计方法实现复杂一些,需要为每个方法建立并维护计数器,而且不能直接获取到方法的调用关系,但是它的统计结果相对更加精确严谨。

                

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于JVM(基本常识) 的相关文章

  • STM32F103C8T6驱动SG90舵机--通过延时

    前言 最近博主在尝试驱动SG90舵机的时候 xff0c 发现网上教程都是通过定时器的方式 xff0c 还要进行各种配置 xff0c 太麻烦了 xff0c 于是自己用延时简单写了一下 xff0c 也能用 舵机的控制 舵机控制就是需要一个20m
  • MyBatis-Plus 分页设置不生效

    分页不生效的原因都是拦截器的问题 添加拦截器有两种情况 在配置类上加拦截器 64 Configuration public class MyBatisPlusConfig 新增分页拦截器 xff0c 并设置数据库类型为mysql 64 Be
  • 【关于使用SpringJUnit4ClassRunner单元测试报错问题】

    关于使用SpringJUnit4ClassRunner单元测试报错问题 今天单元测试如下的代码的时候发现项目老是报错 xff1a package com yhb jsxn service import java text SimpleDat
  • Arch linux使用yay安装软件时有效性检查错误

    错误 xff1a 一个或多个文件没有通过有效性检查 span class token operator 61 61 span span class token operator gt span 正在验证 span class token b
  • 无人驾驶(四)---远程桌面控制工具: NoMachine踩坑记录

    NoMachine for mac是一款免费的远程桌面访问工具 xff0c 这款软件的连接到远程桌面后延迟可以非常低 xff0c NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力 xff0c 打破空间和时间的障碍 xff0c 让您
  • ubuntu 20.04安装配置ssh远程服务中出现的一些问题及总结

    0 安装配置过程参考 56条消息 ubuntu20 04开启SSH远程登录 从此开始低调范 的博客 CSDN博客 ubuntu开启ssh远程登录 1 输入sudo apt get install openssh server提示Readin
  • OSPF综合实验配置

    1 R4为ISP 其他只能配置IP地址 xff0c R4与其他所有直连设备间使用公有IP 与R4相连的路由器R3 5 6 7都要做NAT 保证底层私网能ping通公网 xff1b R4直连的路由器有缺省指向R4 xff0c 每台路由器都要有
  • 双向重发布--路由策略实验报告

    题目要求 xff1a 1 两个协议间进行多点双向重发布 2 R7环回没有宣告在OPSF中 xff0c 而是后期重发布进入 xff1b 3 解决环路 xff0c 所有路径选择最优 xff0c 且存在备份 一 配置底层IP地址 R3 int g
  • VLAN实验

    实验拓扑 实验配置 1 将接口划入vlan 2 配置路由器 xff0c 通过池塘下发地址 测试 pc2可以访问pc4 pc5 pc6 pc5不能访问pc6 pc1可以访问2 4 5 6
  • TCP三次握手四次挥手(图解)

    TCP三次握手 TCP连接的建立是一个三次握手的过程 如图所示 xff1a 主机A xff08 通常也称为客户端 xff09 发送一个标识了SYN的数据段 xff0c 表示期望与服务器A建立连接 xff0c 此数据段的序列号 xff08 s
  • kali换源详细步骤

    1 进入sources list文件编辑模式 2 把kali原有的源注释掉 xff0c 把阿里源放进去 deb span class token property https span span class token punctuatio
  • C/C++中的1<<n什么意思?

    1 lt lt 2 1的二进制是00000001 lt lt 意思是将二进制编码向左移动2位并将空位补0 即00000001转化为00000100 61 4 同理 1 gt gt n 为将二进制码向右移动n位
  • Linux 文本文件编码GBK转UTF-8

    Linux服务器中调用Oracle卸数工具sqluldr2 xff0c 数据库编码为GBK 需要卸UTF 8的数据文件出来 xff0c 如果某个字段为中文 xff0c 因为GBK为两个字节 xff0c UTF 8为三个字节 xff0c 同样
  • PHP-RCE绕过的姿势总结

    文章目录 前言一 命令执行空格过滤取反绕过命令分隔符黑名单绕过 xff08 比如flag字符 xff09 拼接编码单双引号的绕过 二 代码执行linux中的直接查看文件内容工具通过命令行写入webshell无数字字母绕过webshell无回
  • 一些文件目录架构知识

    在Linux内所有的数据都是以文件的形式来呈现 xff0c 因此 xff0c 在Linux系统中最重要的地方就在于目录树架构 目录树架构 xff1a 指以根目录 xff08 用斜线 表示 xff09 为主 xff0c 然后向下呈现为分支状的
  • date、cal、bc命令简单的使用

    在Linux系统中的命令是严格区分大小写的 xff0c 换句话说就是 xff0c 在Linux环境中字母大小写是不一样的东西 date 显示日期与时间 用法 xff1a 直接在命令行模式中输入 date 敲回车 xff1a 格式化输出功能
  • 几个常见处理目录的命令

    xff5e cd 切换目录 进入当前使用者 debian11 的家目录 xff1a 或者 xff1a cd 去到目前的上层目录 xff1a cd 去到指定的文件的目录 xff1a cd 绝对路径 回到刚刚那个目录 xff1a cd pwd
  • Win10系统下安装JDK8笔记

    一 下载安装包 1 浏览器搜索Oracle的官网 xff1a https www oracle com xff0c 进入如下页面 xff1a 2 点击头部标题栏上的 Products 产品 xff0c 此时会有二级标题显示出来 xff0c
  • 关于Easyexcel读取EXCEL合并单元格信息

    关于Easyexcel读取EXCEL合并单元格信息 1 excel模版 span class token annotation punctuation 64 Configuration span span class token keywo
  • 安装Anaconda之后cmd打不开

    安装Anaconda之后cmd就打不开了 xff0c 原因是AutoRun命令被改为了if exist 按win 43 r xff0c 输入regedit打开注册表编辑器 xff0c 顶部输入 xff1a 计算机 HKEY CURRENT

随机推荐