什么是 Java 虚拟机(JVM)?

news/2025/1/23 1:40:00/

      Java虚拟机(JVM)是Java平台的核心组件,它是一个抽象的计算机,用于执行Java字节码。以下是关于JVM的详细介绍:

一、基本概念

  1. 字节码与JVM的关系

    • 当Java源代码(.java文件)被编译后,会生成字节码文件(.class文件)。字节码是一种中间形式的指令集,它不依赖于特定的硬件平台。JVM的作用就是将这些字节码转换为特定硬件平台上的机器码并执行。这就使得Java语言具有了“一次编写,到处运行”的特性。例如,同一个Java程序编译后的字节码可以在Windows操作系统上的JVM运行,也可以在Linux操作系统上的JVM运行,只要这些操作系统上安装了相应版本的JVM。

  2. 抽象计算机的含义

    • JVM就像一台抽象的计算机,它有自己的指令集、寄存器、堆栈等组件。这些组件共同协作来执行字节码指令。比如,JVM的堆(Heap)用于存储对象实例和数组,栈(Stack)用于存储局部变量、部分结果以及执行方法时的动态信息等。这种抽象设计使得JVM可以在不同的硬件和操作系统上实现,只要遵循JVM规范。

二、主要组成部分

  1. 类加载器(Class Loader)

    • 类加载器负责加载.class文件到JVM中。它有层次结构,包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)等。启动类加载器用于加载Java核心类库(如java.lang.*),扩展类加载器加载Java的扩展库,应用类加载器加载应用程序的类路径(classpath)上的类文件。类加载器采用双亲委派模型,当一个类加载器加载类时,会先将请求委派给父类加载器,只有当父类加载器无法加载时,才会尝试自己加载。这种机制可以保证Java核心类库的稳定性和安全性,防止被应用程序中的同名类覆盖。

  2. 运行时数据区

    • 这是JVM内存的主要部分,包括以下几个区域:

      • 堆(Heap):是JVM管理的最大内存区域,用于存储对象实例。几乎所有的对象都在这里分配内存。堆被所有线程共享,是垃圾收集的主要区域。在Java中,可以通过-Xms-Xmx参数来设置堆的初始大小和最大大小。例如,-Xms512m -Xmx1024m表示堆的初始大小为512MB,最大大小为1024MB。

      • 方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区也是线程共享的。在JDK 8及以后版本中,方法区被元空间(Metaspace)所取代,元空间使用本地内存而不是堆内存,这样可以减少垃圾回收对方法区的开销。

      • Java栈(Java Stack):每个线程创建时都会创建一个Java栈,它是线程私有的。栈中存储着一个个栈帧(Frame),每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接等信息。局部变量表存储了方法中的局部变量,操作数栈用于执行字节码指令时的计算操作。例如,当执行一个加法操作的字节码指令时,会从操作数栈中弹出两个操作数,进行加法计算后再将结果压入栈中。

      • 本地方法栈(Native Method Stack):与Java栈类似,也是线程私有的。它为本地方法(即用非Java语言编写的代码,如C语言编写的代码)服务。当Java程序调用本地方法时,会在本地方法栈中进行操作。

      • 程序计数器(Program Counter Register):是一块较小的内存空间,用于记录当前线程所执行的字节码指令的地址。如果正在执行的是Java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址;如果是本地方法,程序计数器的值为空。程序计数器是线程私有的,每个线程都有自己的程序计数器。

  3. 执行引擎

    • 执行引擎是JVM的核心部件之一,它负责执行字节码指令。主要有以下几种执行方式:

      • 解释执行:逐条将字节码指令翻译成机器码并执行。这种方式的优点是实现简单,缺点是执行效率较低。因为每次执行字节码指令都需要进行翻译。

      • 即时编译(JIT):JIT编译器会在运行时将热点代码(即执行频率较高的代码)编译成机器码。这样可以提高热点代码的执行效率。例如,一个循环体内的代码如果被频繁执行,JIT编译器就会将其编译成本地机器码,后续执行时就可以直接运行机器码,从而加快执行速度。

      • 混合执行:结合了解释执行和即时编译的优点。在程序启动初期,由于没有足够的信息来判断热点代码,通常采用解释执行。随着程序的运行,JVM会收集代码执行的统计信息,当发现热点代码时,就会启动JIT编译器进行编译,之后就采用编译后的机器码执行。

三、作用和重要性

  1. 跨平台运行

    • JVM是Java跨平台特性的关键实现。它屏蔽了不同操作系统和硬件平台之间的差异。开发者只需关注Java语言的编写,通过JVM就可以在多种平台上运行程序。这大大提高了软件的可移植性和开发效率。例如,企业级的Java应用程序可以在不同的服务器操作系统上部署,而无需对代码进行大量修改。

  2. 内存管理

    • JVM提供了自动内存管理机制,包括垃圾回收(Garbage Collection)。当对象不再被引用时,JVM的垃圾回收器会自动回收这些对象占用的内存空间。这减轻了程序员管理内存的负担,避免了像C语言中常见的内存泄漏和内存溢出等问题。不过,垃圾回收也可能带来一些性能开销,但现代JVM的垃圾回收算法已经越来越高效。

  3. 安全机制

    • JVM内置了多种安全机制。例如,类加载器可以防止恶意代码替换核心类库中的类。字节码校验器会对加载的字节码进行校验,检查字节码是否符合Java语言规范,是否存在非法的操作,如非法的类型转换等。这些安全机制可以有效防止一些常见的安全漏洞,保障Java程序的安全运行。


http://www.ppmy.cn/news/1565354.html

相关文章

Linux下PostgreSQL-12.0安装部署详细步骤

一、安装环境 postgresql-12.0 CentOS-7.6 注意:确认linux系统可以正常连接网络,因为在后面需要添加依赖包。 二、pg数据库安装包下载 下载地址:PostgreSQL: File Browser 选择要安装的版本进行下载: 三、安装依赖包 在要安…

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CI/CD) 目录 项目初始化:构建一个简单的 Node.js 应用设置 Docker 环境:容器化你的应用配置 CI/CD:自动化构建与部署上线前的最后检查:…

从零开始打造一个Java基于 Spring Boot 的旅游信息化平台

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Golang 生态学习

1. Go 语言基础 在深入 Go 语言的生态之前,首先需要掌握 Go 语言本身的核心特性。 • Go 语言官方文档:https://golang.org/doc/ Go 官方文档是学习语言基础和标准库的首选资源。 • 学习内容: • 基础语法:数据类型、控制流…

基于本地消息表实现分布式事务

假设我们有一个电商系统,包含订单服务和库存服务。当用户下单时,需要在订单服务中创建订单,同时在库存服务中扣减库存。这是一个典型的分布式事务场景,我们需要保证这两个操作要么都成功,要么都失败,以保证数据的最终一致性。 项目结构: 订单服务(Order Service)库存服务(Inv…

Kafka 和 MQ 的区别

1.概述 1.1.MQ简介 消息中间件,其实准确的叫法应该叫消息队列(message queue),简称MQ。其本质上是个队列,有FIFO的性质,即first in first out,先入先出。 目前市场上主流的MQ有三款&#xff…

python管理工具:conda部署+使用

python管理工具:conda部署使用 一、安装部署 1、 下载 - 官网下载: https://repo.anaconda.com/archive/index.html - wget方式: wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…

如何将本地电脑上的文件夹设置为和服务器的共享文件夹

将本地电脑上的文件夹设为与服务器共享的文件夹,通常是在本地开启文件共享,并配置相应的权限,使服务器可以访问该文件夹。以下以 Windows 系统为例说明具体操作步骤: 一、在本地电脑上设置共享文件夹 选择文件夹 找到需要共享的文…