当前位置: 首页 > news >正文

什么是Java虚拟机(JVM),它的作用是什么?

什么是Java虚拟机(JVM)


        Java虚拟机(Java Virtual Machine,JVM)是Java平台的关键组成部分,它是一种在不同操作系统上运行Java程序的虚拟计算机。

        JVM的作用是执行Java字节码(Java bytecode),它是由Java编译器生成的中间代码,而不是直接执行源代码。

Java虚拟机的作用


字节码执行

        JVM的主要作用是执行Java程序的字节码。在Java应用程序开发中,Java源代码首先被编译成字节码文件(.class文件),而不是本地机器码。这个字节码是一种与平台无关的中间表示,可以在任何支持Java的平台上运行。

JVM字节码的执行过程大概可以分为以下几个步骤:

  1. 装载:虚拟机启动后,通过类加载器将.class文件加载到内存中,并进行解析。
  2. 链接:将被引用的类、方法、变量等符号引用转化为直接引用,并将常量池中的符号引用替换为直接引用。
  3. 初始化:对类进行初始化。包括执行类构造器<clinit>()方法,静态变量赋值等。
  4. 解释执行:将解析后的字节码逐行解释执行,根据操作码执行相应的操作。
  5. 编译执行:如果某个方法被多次执行,JIT编译器会将其编译为本地代码,以提高执行效率。
  6. 垃圾回收:JVM自动进行垃圾回收,将不再使用的对象进行回收,释放内存空间。

总的来说,JVM字节码的执行过程包括“装载-链接-初始化-解释执行/编译执行-垃圾回收”等几个步骤,其中解释执行和编译执行是主要的执行方式。

跨平台兼容性

        JVM跨平台兼容性的原因是因为Java程序编译后生成的是字节码(ByteCode)而不是特定平台上的机器码(Machine Code)。也就是说,Java程序并不是直接翻译成本地平台上的机器码,而是转换成JVM可以识别的字节码,最终由JVM解释执行或编译成本地平台上的机器码。也就是说JVM充当了一个中间层,负责将字节码翻译成特定操作系统的机器码。

        这样做的好处是,由于Java程序并不会直接依赖于本地操作系统或硬件,所以只要有支持Java虚拟机的平台,就可以在该平台上运行Java程序,而不需要对程序进行修改。

        这种跨平台机制使得Java程序可以在多个操作系统上进行编译和执行,从而使得Java成为一种性能良好、易于移植的语言。因此,JVM被认为是一种跨平台运行的虚拟机,Java也因此而被大量使用。

内存管理

JVM中的内存主要分为以下几个部分:

  • 方法区(Method area):用于存储类的相关信息,如类的名称、方法、变量等信息。
  • 堆(Heap):用于存储对象实例以及数组,是Java程序中最大的一块内存区域,也是垃圾回收的重点区域。
  • 虚拟机栈(VM Stack):每个线程在运行时会创建一个虚拟机栈,用于存储局部变量以及方法执行的信息。
  • 本地方法栈(Native Method Stack):用于执行本地方法,和虚拟机栈类似。

        JVM的内存管理由两个部分实现:垃圾回收和内存分配。其中,垃圾回收是JVM的核心功能之一。

        垃圾回收

        JVM的垃圾回收机制主要是通过标记-清除和复制算法实现的。在JVM中,当一个对象不再被引用时,它就会被当作垃圾回收。JVM在运行时会不断扫描堆内存中的对象,标记哪些对象是活动对象,哪些对象是垃圾对象,然后清除垃圾对象,释放内存空间,以便被后续的对象使用。

        内存分配

        JVM的内存分配主要是通过分配器实现的。Java中的内存分配是动态分配的,也就是说,内存的分配和释放都是在运行时动态完成的。分配器会在堆中寻找一段足够的空间,然后将空间中的一部分分配给对象,同时标记已分配的空间,以便后续的内存分配使用。如果堆的空间不够了,就会触发垃圾回收,释放一些内存,然后再进行内存分配。

        总的来说,它通过垃圾回收(Garbage Collection)来自动管理对象的生命周期,分配和释放内存,以避免内存泄漏和提高程序的性能,保证了Java程序的可靠性和稳定性。

性能优化

JVM 的性能优化需要从多个方面入手,通过内存管理、JIT 编译器、线程管理、JIT 栈上分配和类加载机制等,通过合理地设置,可以提高代码的执行效率和系统的整体性能。这里我们主要说明JIT 编译器、线程管理、JIT 栈上分配

即时编译器(Just-In-Time ,JIT )

        在 Java 中,源代码经过编译器编译后会生成 Java 字节码,字节码是一种中间代码,在运行时需要通过解释器转换为本地机器码才能执行。这个过程会占用较多的时间,导致程序的执行速度较慢。为了解决这个问题,Java 引入了 JIT 技术。

        JIT 是 Java 虚拟机的一种优化技术,它可以将热点代码(频繁执行的代码段)编译成本地机器码,以提高程序的执行性能。JIT编译器根据程序的运行情况进行优化,将字节码转化为更高效的本地机器指令。

线程管理

        JVM 中的线程管理可以通过调整线程数和线程优先级来优化代码的执行效率。线程数的过多会导致系统资源的浪费,线程的优先级过高会导致其它线程无法获得 CPU 时间,从而降低系统的整体性能。

JIT 栈上分配

        JIT 栈上分配(Stack Allocation)是指在 Java 虚拟机中,某些对象可以在栈上分配并随着栈帧的弹出而释放,而不是在堆上动态分配和回收。这种优化技术主要用于方法的临时对象,如循环中创建的对象等,通过减少堆内存的使用和垃圾回收的频率,提高代码的执行效率。

        在 Java 中,对象的创建和销毁都是在堆内存中进行的。当对象不再使用时,JVM 会通过垃圾回收机制将其回收,并将内存释放出来。但是,在大量使用临时对象的场景中,由于堆内存管理的开销较大,频繁地创建和释放对象会导致系统性能下降。因此,JIT 栈上分配技术便应运而生。

        当 JVM 检测到某些对象只在方法的生命周期内使用,并且不会逃逸到方法外部时,就可以使用 JIT 栈上分配技术将其分配到栈上。这样一来,对象的创建和销毁都可以随着栈帧的创建和销毁而自动完成,不需要通过垃圾回收机制进行管理。这种技术可以有效地减少堆内存的使用和垃圾回收的频率,从而提高代码的执行效率。

安全性

        Java虚拟机(JVM)提供了多种安全性特性,这些特性旨在确保Java应用程序的安全性,并防止恶意代码的执行。以下是一些主要的安全性特性:

  1. 字节码验证: 在类加载的过程中,JVM会对字节码进行验证,以确保其合法性和安全性。这个验证过程包括对代码结构的检查、类型检查、访问权限检查等。它防止了一些常见的安全漏洞,如栈溢出、访问未经授权的内存等,这有助于防止恶意代码的执行。

  2. 类加载机制: JVM的类加载机制保证了类的安全性。类加载过程中执行的验证和安全检查确保加载的类不会损害JVM或底层系统的安全。

  3. 安全管理器(Security Manager): JVM提供了一个安全管理器,用于控制Java程序对系统资源的访问权限,比如文件、网络等。开发人员可以定义安全策略文件,规定哪些操作是被允许的,哪些是被拒绝的,以保护系统免受恶意代码的损害。

  4. 沙箱环境(Sandbox Environment): JVM提供了一个安全的沙箱环境,使Java程序能在受控制的环境中运行。这种环境限制了程序的访问权限,防止程序对系统的不良影响。

  5. 安全性类库: Java标准库提供了一些用于加密、数字签名、安全通信等的类和API,使开发者能够在程序中实现更高级的安全功能。

  6. 异常处理: JVM的异常处理机制可以捕获和处理各种异常,包括安全性方面的异常,确保程序在面临安全问题时能够进行适当的处理。

多线程支持

        JVM支持多线程编程,提供了线程管理和同步机制,从而提高程序的性能和吞吐量,使多线程应用程序的开发变得更加容易。

线程的创建方式:http://t.csdnimg.cn/XqPXW

类加载

        JVM的类加载是指将Java类文件加载到JVM内存中,并生成对应的Java类对象的过程。JVM的类加载器(ClassLoader)负责类加载,它将类文件读取到内存中,并将其转换为Java类对象。

        JVM的类加载器有三种:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。其中,启动类加载器和扩展类加载器是JVM自带的类加载器,而应用程序类加载器是由JVM开发人员自己编写的。

        JVM的类加载过程分为三个阶段:加载(Loading)、连接(Linking)和初始化(Initialization)。具体过程如下:

  • 加载阶段:类加载器从文件系统或者网络中读入.class文件,并生成一个对应的Class对象。

  • 连接阶段分为三个步骤:

    1. 验证(Verification):对类文件进行合法性验证,以保证类文件符合JVM规范和安全性要求。
    2. 准备(Preparation):为类的静态变量分配内存,并设置默认初始值。
    3. 解析(Resolution):将类的符号引用转换为直接引用。
  • 初始化阶段:对类进行初始化,包括执行静态变量赋值和静态代码块等。

        JVM在程序运行时动态加载类文件,这意味着可以在运行时引入新的类和库,从而实现模块化和可扩展的应用程序设计

异常处理

        在JVM中,异常处理是通过抛出(throw)和捕获(catch)异常来实现的。Java语言中的所有异常都是Throwable类或其子类的实例,分为两种类型:Checked Exception和Unchecked Exception。Checked Exception必须在代码中进行处理,而Unchecked Exception通常是由程序中的错误引起的,并且不需要进行处理。

        JVM通过栈轨迹(stack trace)来追踪异常的发生和处理过程。当异常发生时,JVM将追踪栈的状态保存到一个异常对象中,然后通过抛出异常方式将这个异常对象传递到调用栈上,直到找到一个能够处理该异常的catch块。

JVM中的异常处理机制包括以下几个步骤:

  1. 当代码中出现异常时,JVM将创建一个异常对象,并将其抛出。
  2. 异常对象将被传递到调用栈上,直到找到一个能够处理该异常的catch块。
  3. 在catch块中,程序可以对异常进行处理,例如打印日志、重新抛出异常或者返回一个默认值。
  4. 如果没有找到能够处理异常的catch块,则程序将终止,并打印异常的堆栈轨迹。

        JVM的异常机制可以使程序更加健壮和稳定,它能够帮助程序员快速定位和修复代码中的问题。同时,在编写Java程序时,我们也应该注意正确地处理异常,以便提高程序的可靠性和健壮性。

总之,Java虚拟机充当了Java程序和底层操作系统之间的重要中介,使Java的跨平台特性成为可能。它提供了内存管理、性能优化、安全性、多线程支持等关键功能,使Java成为一种流行的编程语言,广泛应用于各种应用领域,包括企业级应用、移动应用、嵌入式系统和大数据处理等。

相关文章:

什么是Java虚拟机(JVM),它的作用是什么?

什么是Java虚拟机&#xff08;JVM&#xff09; Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是Java平台的关键组成部分&#xff0c;它是一种在不同操作系统上运行Java程序的虚拟计算机。 JVM的作用是执行Java字节码&#xff08;Java bytecode&#…...

力扣876:链表的中间结点

力扣876&#xff1a;链表的中间结点 题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5]…...

三菱FX3U系列—原点回归指令

目录 一、简介 二、指令形式 1、原点指令[ZRN/DZRN] 2、带搜索的原点回归指令[DSZR] 三、回归指令运行过程 1、ZRN原点回归运行过程 2、带搜索的原点回归运行过程 四、特殊辅助继电器 五、特殊输出模块 六、总结 一、简介 用于将电机或伺服驱动器控制的轴回到预定的原…...

ES常用查询命令

一、基本命令 1、获取所有_cat命令 curl -X GET localhost:9200/_cat 2、获取es集群服务健康状态 curl -X GET localhost:9200/_cat/health?v epoch: 时间戳的 Unix 时间戳格式&#xff0c;表示快照生成的时间。 timestamp: 可读性更强的时间戳格式&#xff0c;表示快照生…...

【Qt之元对象系统】

描述 Qt的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的核心机制之一&#xff0c;它提供了运行时类型信息&#xff08;RTTI&#xff09;和信号与槽&#xff08;Signals and Slots&#xff09;机制的支持。元对象系统在Qt中扮演了很重要的角色&#xff0c;它…...

基于FPGA的EMAC模块与FIFO模块:高速数据传输与存储

基于FPGA的EMAC模块与FIFO模块&#xff1a;高速数据传输与存储 在现代社会&#xff0c;高速数据传输和存储是信息技术领域的关键问题之一。而基于FPGA的EMAC模块与FIFO模块则成为了解决这些问题的重要途径。本文将介绍这两个模块的原理、实现方法以及如何在FPGA中应用它们。 …...

大数据毕业设计选题推荐-农作物观测站综合监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

高校教务系统登录页面JS分析——长沙理工大学教务系统

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文将是本专栏最后一篇文章&#xff0c;我看了绝大多数高…...

element-ui的form校验失败

数值与字符串混淆 数值 <el-input type"number" v-model.number"form.averageFruitWeight" placeholder"请输入平均单果重"/>字符串 fruitDevelopmentStage: [{pattern: ^[-\\]?([0-9]\\.?)?[0-9]$, message: 输入必须为数字, trigge…...

java数据结构--阻塞队列

目录 一.概念 二.生产者消费者问题 三.阻塞队列接口BlockingQueue 四.基于数组实现单锁的阻塞队列 1.加锁方式 2.代码实现 3.解释说明 (1).offer添加元素 &#xff08;2&#xff09;poll取出元素 4.timeout超时时间 5.测试 五.基于数组实现双锁的阻塞队列 1.问题 …...

使用p2p实现Linux内网快速分发文件

安装opentracker 方法一&#xff1a;编译安装 参考如下官方文档进行操作即可&#xff0c;国内下载源码会比较慢 https://erdgeist.org/arts/software/opentracker/ 编译完成后会生成可执行文件opentracker和opentracker.debug 可以直接./opentracker.debug进行验证 方法二&a…...

Android Studio报错:connect refused

参考链接&#xff1a; https://blog.csdn.net/qq_43213783/article/details/113936012 参考文章中说报错主要是由于代理导致的&#xff0c;在文件->设置->外观与行为->系统设置->HTTP代理。 方法一&#xff1a; 查看打开代理&#xff08;前提是代理可以通网&#x…...

ubuntu 源码编译安装make过程很慢问题解决

一般下载的时候有两种方式 使用wget 下载后使用tar命令解压直接git clone 源代码 下载完成之后&#xff0c;进入目录&#xff0c;新建一个文件夹build&#xff0c;防止影响码源结构第三步&#xff0c;进入到build目录&#xff0c;使用cmake编译 cmake ..第四步直接make编译 …...

深度学习 opencv python 实现中国交通标志识别 计算机竞赛

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…...

希尔排序原理

目录&#xff1a; 一、希尔排序与插入排序 1&#xff09;希尔排序的概念 2&#xff09;插入排序实现 二、希尔排序实现 一、希尔排序与插入排序 1&#xff09;希尔排序的概念 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”&#xff08;Diminishing Incremen…...

测试用例的设计方法(全):判定表驱动分析方法

目录 判定表驱动分析方法 一. 方法简介 二. 实战演习 判定表驱动分析方法 一. 方法简介 1.定义&#xff1a;判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。 2.判定表的优点 能够将复杂的问题按照各种可能的情况全部列举出来&#xff0c;简明并避免遗漏。因此…...

node 第十七天 使用rsa非对称加密 实现前后端加密通信 JSEncrypt和node-rsa

什么是非对称加密 加密过程需要两个钥匙, 公钥和私钥 其中公钥用于加密明文, 私钥用于解密公钥加密的密文, 解密只可以用私钥 公钥和私钥是一对一的关系 公钥可以发送给用户, 不用担心泄露 私钥需要保存在服务端, 不能泄露 例如: 战场上&#xff0c;B要给A传递一条消息&#xf…...

Spring-依赖注入findAutowireCandidates源码实现

findAutowireCandidates()实现 1、找出BeanFactory中类型为type的所有的Bean的名字&#xff0c;根据BeanDefinition就能判断和当前type是不是匹配&#xff0c;不用生成Bean对象 2、把resolvableDependencies中key为type的对象找出来并添加到result中 3、遍历根据type找出的b…...

单页面应用与多页面应用的区别?

单页面应用&#xff08;SPA&#xff09;与多页面应用&#xff08;MPA&#xff09;的主要区别在于页面数量和页面跳转方式。单页面应用只有一个主页&#xff0c;而多页面应用包含多个页面。 单页面应用的优点有&#xff1a; 用户体验好&#xff1a;内容的改变不需要重新加载整…...

模型预处理的ToTensor和Normalize

模型预处理的ToTensor和Normalize flyfish import torch import numpy as np from torchvision import transformsmean (0.485, 0.456, 0.406) std (0.229, 0.224, 0.225)# data0 np.random.randint(0,255,size [4,5,3],dtypeuint8) # data0 data0.astype(np.float64) da…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...