JVM之JVM的组成

Java 虚拟机(JVM)是 Java 程序的运行核心,它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。

类加载系统(Class Loading System)

类加载系统负责在程序运行时动态地将 Java 类加载到 JVM 中。它主要包含以下三个类加载器以及类加载的过程:

  • 启动类加载器(Bootstrap Class Loader):由原生代码(如 C++)实现,负责加载 Java 的核心类库,如java.lang包下的类,它是所有类加载器的根。
  • 扩展类加载器(Extension Class Loader):负责加载 Java 的扩展类库,通常是jre/lib/ext目录下的类。
  • 应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载用户类路径(classpath)上的类,是我们日常开发中最常用的类加载器。

运行时数据区(Runtime Data Area)

运行时数据区是 JVM 在运行时所管理的内存区域,可分为以下几个部分:

  • 方法区(Method Area)
    • 所有线程共享的内存区域,用于存储已被 JVM 加载的类信息、常量、静态变量等数据。在 JDK 1.8 之前,方法区也被称为永久代(Permanent Generation),而在 JDK 1.8 及以后,方法区由元空间(Metaspace)替代,元空间使用本地内存,不再受 JVM 堆内存的限制。
  • 堆(Heap)
    • 所有线程共享的内存区域,是 JVM 中最大的一块内存区域,用于存储对象实例和数组。堆内存会被垃圾回收器(Garbage Collector)管理,当对象不再被引用时,会被垃圾回收器回收以释放内存。堆可以进一步分为新生代(Young Generation)和老年代(Old Generation),新生代又可细分为 Eden 区和两个 Survivor 区。
  • 虚拟机栈(Java Virtual Machine Stacks)
    • 每个线程都有自己独立的虚拟机栈,它是线程私有的。虚拟机栈用于存储方法执行时的栈帧(Stack Frame),每个栈帧包含局部变量表、操作数栈、动态链接和方法返回地址等信息。当一个方法被调用时,会创建一个新的栈帧并压入栈中,方法执行完毕后,该栈帧会从栈中弹出。
  • 本地方法栈(Native Method Stacks)
    • 与虚拟机栈类似,也是线程私有的,不过它是为执行本地方法(使用native关键字修饰的方法)服务的。本地方法通常是用其他语言(如 C、C++)实现的,用于与操作系统进行交互。
  • 程序计数器(Program Counter Register)
    • 每个线程都有一个独立的程序计数器,它是线程私有的。程序计数器用于记录当前线程执行的字节码指令的地址,当线程执行 Java 方法时,它记录的是正在执行的虚拟机字节码指令的地址;当线程执行本地方法时,程序计数器的值为空(Undefined)。

执行引擎(Execution Engine)

执行引擎负责执行字节码指令,它将字节码指令解释或编译成机器码,然后在操作系统上运行。执行引擎主要有以下几种执行方式:

  • 解释器(Interpreter):逐行解释字节码指令并执行,优点是启动速度快,不需要提前编译,但执行效率相对较低。
  • 即时编译器(Just-In-Time Compiler,JIT):将热点代码(经常执行的代码)编译成机器码,提高执行效率。JIT 编译器在运行时动态编译,编译后的机器码可以重复使用。
  • 垃圾回收器(Garbage Collector):执行引擎还负责垃圾回收的工作,它会自动回收不再使用的对象所占用的内存,以避免内存泄漏。常见的垃圾回收器有 Serial、Parallel、CMS、G1 等。

本地方法接口(Native Method Interface,NMI)

本地方法接口允许 Java 程序调用本地方法,本地方法是使用其他语言(如 C、C++)编写的方法。通过本地方法接口,Java 程序可以与操作系统、硬件设备等进行交互,扩展 Java 的功能。本地方法库是一系列本地方法的集合,它包含了实现本地方法的具体代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…

大白话Vue 双向数据绑定的实现原理与数据劫持技术

咱们来好好唠唠Vue双向数据绑定的实现原理和数据劫持技术,我会用特别通俗的例子给你讲明白。 啥是双向数据绑定 你可以把双向数据绑定想象成一个神奇的“同步器”。在网页里有两部分,一部分是数据,就像你记在小本本上的信息;另一…

java后端开发day18--学生管理系统

(以下内容全部来自上述课程) 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性:id,姓名,年龄,家庭住址 3.添加功能 键盘录入每一个学生信息并…

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨:啥时候写的?是我写的么?疑惑重重… 所以说,好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步:第一步:申请域名并映射到外网IP &#xff0…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本,而结构化数据的方法通常是让 LLM 编写和执行 DSL(例如 SQL)中的查询。 我们将演练在使用基于 langchain 链 &#x…

利用机器学习实现实时交易欺诈检测

以下是一个基于Python的银行反欺诈AI应用示例代码,演示如何利用机器学习实现实时交易欺诈检测。该示例使用LightGBM算法训练模型,并通过Flask框架构建实时检测API: python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preproc…

最好的Git实践指南(Windows/Linux双系统详解)

Git最佳实践指南:从入门到熟练(Windows/Linux双系统详解) 一、环境搭建与基础配置(适用Windows/Linux) 1.1 Git安装与验证 # Windows系统安装(推荐Chocolatey包管理) # 直接下载git二进制文件…

Python零基础学习第二天(条件语句,循环语句)

Python零基础学习第二天:流程控制与模块导入 一、流程控制结构 1. 条件语句(if, elif, else) 条件语句用于根据不同的条件执行不同的代码块。基本形式如下: if 条件1: # 当条件1为True时执行这里的代码 elif 条件2: # 当前面的条…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(三) 实现注册 登录接口

1.划分文件夹 在src目录下创建controllers middleware models routes controllers 放具体的方法 signup login middleware 里面是中间件 请求的验证 models 放对象实体 routes 处理访问路径像/signup /login 等等 2. 接口开发 系统的主要 有用户认证 和 消息 2种类型…

使用Socket编写超牛的http服务器和客户端(一)

实现一个高性能的基于 IOCP(I/O Completion Ports)的 HTTP 服务器,支持多线程、动态线程池调整和路由处理。 主要功能和特性 IOCP 模型: 使用多个 IOCP 句柄(IOCP_COUNT),将客户端连接均匀分配到不同的 IOCP 上,减少线程竞争。 工作线程使用 GetQueuedCompletionStatu…

podman加速器配置,harbor镜像仓库部署

Docker加速器 registries加速器 [rootlocalhost ~]# cat /etc/redhat-release CentOS Stream release 8 [rootlocalhost ~]# cd /etc/containers/ [rootlocalhost containers]# ls certs.d policy.json registries.conf.d storage.conf oci registries.conf re…

MOE结构解读和deepseek的MoE结构

不管dense还是MoE(Mixture of Experts)都是基于transformer的。 下面回顾下解码器块的主要架构: 注意力机制-层归一化&残差连接-FFN前馈神经网络-层归一化&残差连接。 dense模型是沿用了这个一架构,将post-norm换为pre-no…

C#与AI的交互(以DeepSeek为例)

C#与ai的交互 与AI的交互使用的Http请求的方式,通过发送请求,服务器响应ai生成的文本 下面是完整的代码,我这里使用的是Ollama本地部署的deepseek,在联网调用api时,则url会有不同 public class OllamaRequester {[Se…

第九节: Vue 3 中的 provide 与 inject:优雅的跨组件通信

文章目录 前言什么是 provide 和 inject?provide 的基本使用inject 的基本使用provide 提供响应式数据数据provide 提供修改数据的方法provide 提供只读响应数据provide 使用symbol作为注入名inject 默认值总结 前言 在 Vue 3 中,provide 和 inject 是一…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

Linux系统中ssh远程登录协议

目录 一、SSH协议概述 二、SSH协议工作原理 三、ssh服务与配置文件 3.1、openssh 3.2、ssh命令 3.3、服务端配置 四、基于密钥验证的免交互登录 4.1、客户端生成密钥 4.2、将公钥拷贝至服务器 4.3、验证免密登录 一、SSH协议概述 SSH&#xff08;Secure Shell&#x…

vue2 ruoyi websocket轮询

文章目录 前言一、websocket和心跳是什么&#xff1f;二、使用步骤1.2.监听变化3.关闭 总结 前言 websocket&#xff0c;实现与后端通讯&#xff0c;使用心跳机制&#xff0c;断联自动恢复。 一、websocket和心跳是什么&#xff1f; WebSocket WebSocket 是一种网络通信协议&a…

LangChain大模型应用开发:LangGraph快速构建Agent工作流应用

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大规模应用开发中的LangGraph快速构建Agent工作流应用。 通过对前几次对LangChain的技术分享。我们知道LangChain作为一个强大的工具集&#xff0c;为开发者们提供了丰富的资源和便…

学习FreeRTOS推荐几篇质量高的文章

学习FreeRTOS是一个非常好的选择&#xff0c;因为它是一个广泛使用的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;特别适合嵌入式系统开发。以下是一些高质量的文章和视频资源&#xff0c;帮助你入门和深入学习FreeRTOS&#xff1a; 文章推荐 FreeRTOS官方文档 链接…

深入理解Redis:数据类型、事务机制及其应用场景

在当今快速发展的技术领域中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;已经被广泛应用于各种场景&#xff0c;从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性&#xff0c;如事务处理、持久化选项、高…