Java虚拟机

Java虚拟机(Java Virtual Machine,简称JVM)是运行Java程序的虚拟计算机环境,它在Java编程语言中扮演着非常重要的角色。以下是关于Java虚拟机的详细介绍:

 

 

1\.基本概念

 

Java虚拟机是一种抽象的计算机,它有自己指令集、寄存器、堆栈和垃圾回收机制等。它的主要作用是将Java字节码(Java程序编译后的中间代码)转换为机器码,从而在不同的操作系统和硬件平台上运行Java程序。Java虚拟机的出现使得Java语言具有了“一次编写,到处运行”(Write Once,Run Anywhere,简称WORA)的特性,大大提高了Java程序的可移植性。

 

 

2\.架构

 

Java虚拟机的架构主要包括以下几个部分:

 

 

• 类加载器(Class Loader)

 

• 类加载器的主要职责是将字节码文件(.class文件)加载到JVM的内存中,并将其转换成一个java.lang.Class对象。JVM通过类加载器来实现类的加载机制,从而保证了Java程序的动态性和安全性。类加载器分为启动类加载器、扩展类加载器和应用程序类加载器。启动类加载器负责加载Java的核心类库(如java.lang.、java.util.等),它是JVM的一部分,用本地代码实现;扩展类加载器负责加载Java的扩展类库(如JAR文件中的类);应用程序类加载器负责加载用户定义的类。

 

 

• 运行时数据区(Runtime Data Area)

 

• 运行时数据区是JVM运行时的内存空间,它被划分为以下几个部分:

 

• 程序计数器(Program Counter Register):程序计数器是一块较小的内存空间,它用于记录当前线程所执行的字节码指令的地址。如果正在执行的是本地方法(Native Method),程序计数器的值为undefined。程序计数器是线程私有的,每个线程都有自己的程序计数器,它们之间互不影响。

 

• Java虚拟机栈(Java Virtual Machine Stacks):Java虚拟机栈是线程私有的,它用于存储方法调用过程中的局部变量表、操作数栈、动态链接、方法出口等信息。每个线程在创建时都会创建一个Java虚拟机栈,栈中的每个栈帧对应一次方法调用。当线程执行一个方法时,会创建一个新的栈帧并将其压入栈顶;当方法执行完毕后,栈帧被弹出。如果线程请求的栈深度大于虚拟机所允许的深度,将会抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,当栈扩展时无法申请到足够的内存,将会抛出OutOfMemoryError异常。

 

• 本地方法栈(Native Method Stacks):本地方法栈与Java虚拟机栈类似,它为本地方法(用非Java语言编写的代码,如C语言)服务。本地方法栈的结构和实现依赖于具体的JVM实现,有些JVM实现将本地方法栈和Java虚拟机栈合二为一。与Java虚拟机栈一样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

 

• Java堆(Java Heap):Java堆是JVM中最大的一块内存区域,它是线程共享的,用于存储对象实例和数组。几乎所有的对象实例都在Java堆中分配内存。Java堆是垃圾收集器(Garbage Collector,简称GC)的主要工作区域,垃圾收集器通过回收堆中不再使用的对象来释放内存空间。如果Java堆中没有足够的内存来分配给新创建的对象,将会抛出OutOfMemoryError异常。Java堆的大小可以通过JVM启动参数(如-Xms和-Xmx)来设置。

 

• 方法区(Method Area):方法区是线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区在JVM启动时创建,当方法区无法满足内存分配需求时,将会抛出OutOfMemoryError异常。在HotSpot虚拟机中,方法区也被称为“永久代”(Permanent Generation),但在JDK 8及以后版本中,永久代被元空间(Metaspace)所取代。元空间使用本地内存(而不是JVM的堆内存),从而避免了方法区的内存溢出问题。

 

 

• 执行引擎(Execution Engine)

 

• 执行引擎是JVM的核心部分,它负责执行字节码指令。执行引擎的主要任务是将字节码指令转换为机器码并执行。执行引擎的实现方式有多种,如解释执行、即时编译(Just-In-Time,JIT)等。解释执行是将字节码指令逐条解释成机器码并执行,这种方式的优点是简单,但执行效率较低;即时编译是将字节码指令编译成机器码后再执行,这种方式的优点是执行效率高,但需要消耗一定的编译时间。JVM会根据程序的运行情况动态地选择执行方式,以达到最佳的性能。

 

 

3\.工作原理

 

Java程序的运行过程大致如下:

 

 

  1. 编译阶段

 

• Java源代码文件(.java文件)通过Java编译器(javac)被编译成字节码文件(.class文件)。字节码文件是Java程序的中间代码,它与具体的硬件平台和操作系统无关,这使得Java程序具有良好的可移植性。

 

 

  2. 加载阶段

 

• JVM的类加载器将字节码文件加载到内存中,并将其转换成一个java.lang.Class对象。类加载器会按照一定的顺序(如双亲委派模型)来加载类,从而保证类的加载过程的正确性和安全性。

 

 

  3. 链接阶段

 

• 链接阶段包括验证、准备和解析三个步骤。

 

• 验证:验证阶段的主要目的是确保加载的字节码文件符合Java语言规范,没有安全问题。验证的内容包括字节码文件的格式、类的结构、方法的签名等。

 

• 准备:准备阶段主要是为类的静态变量分配内存空间,并设置默认初始值。例如,如果一个类中有一个静态变量int a,那么在准备阶段会为其分配4个字节的内存空间,并将其初始值设置为0。

 

• 解析:解析阶段主要是将字节码文件中的符号引用(如类名、方法名、字段名等)转换为直接引用(如内存地址)。例如,当字节码文件中出现一个方法调用时,解析阶段会将该方法的符号引用转换为该方法在内存中的地址。

 

 

  4. 初始化阶段

 

• 初始化阶段主要是执行类的构造器()方法,对类的静态变量进行初始化。构造器方法是由类的静态变量赋值语句和静态代码块(static{})合并而成的。初始化阶段是类加载过程的最后一个阶段,只有当类被真正使用时(如创建对象、调用静态方法等),才会执行初始化阶段。

 

 

  5. 执行阶段

 

• JVM的执行引擎开始执行字节码指令,将字节码指令转换为机器码并执行。执行引擎会根据程序的运行情况动态地选择执行方式(如解释执行、即时编译等),以达到最佳的性能。

 

 

4\.重要性

 

 

• 可移植性:Java虚拟机使得Java程序能够在不同的操作系统和硬件平台上运行,而无需重新编译。只要目标平台上安装了相应的Java虚拟机,就可以运行Java程序,大大提高了Java程序的可移植性。

 

• 安全性:Java虚拟机通过类加载器、字节码验证等机制,对Java程序进行严格的检查和限制,从而保证了Java程序的安全性。例如,类加载器可以防止恶意代码的加载,字节码验证可以防止非法操作和安全漏洞。

 

• 性能优化:Java虚拟机提供了多种性能优化机制,如即时编译、垃圾回收等。即时编译可以将字节码指令编译成高效的机器码,从而提高程序的执行效率;垃圾回收可以自动回收不再使用的对象,从而避免内存泄漏问题,提高程序的性能和稳定性。

 

Java虚拟机是Java语言的核心组成部分,它为Java程序的运行提供了强大的支持和保障。通过深入了解Java虚拟机的工作原理和架构,可以更好地理解Java程序的运行机制,从而提高Java程序的开发效率和性能。

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

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

相关文章

C++ map容器总结

map基本概念 简介: map中所有元素都是pair pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值) 所有元素都会根据元素的键值自动排序 本质: map/multimap属于关…

23种设计模式-代理(Proxy)设计模式

代理设计模式 🚩什么是代理设计模式?🚩代理设计模式的特点🚩代理设计模式的结构🚩代理设计模式的优缺点🚩代理设计模式的Java实现🚩代码总结🚩总结 🚩什么是代理设计模式…

UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器,通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片,改名为五weaponIcon,勾选SizeToContent,锚点放在右下角,对齐改…

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…

【RAG综述系列】之 RAG 相关背景和基本原理

系列文章: 【RAG综述系列】之 RAG 相关背景和基本原理 【RAG综述系列】之 RAG 特点与挑战以及方法与评估 【RAG综述系列】之 RAG 先进方法与综合评估 【RAG综述系列】之 RAG 应用和未来方向 正文: 检索增强生成(Retrieval-Augmented Gen…

德昂观点:如何看待MicroStrategy改名为Strategy?

2025年2月,纳斯达克上市公司MicroStrategy(股票代码:MSTR)宣布更名为“Strategy”,并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新,更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…

计算机视觉算法实战——手术导航:技术、应用与未来

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 手术导航中的计算机视觉:领域介绍 计算机视觉在手术导航领域的应用代表了现代医学与人工智…

Java全栈面试宝典:内存模型与Spring设计模式深度解析

目录 一、JVM内存模型进阶篇 🔥 问题13:堆与栈的六大维度对比 内存结构对比图 核心差异对照表 🔥 问题14:三区联动内存模型解析 代码内存分配图解 三区协作流程图 二、Spring设计模式全景解析 🌟 Spring框架七…

FALL靶场通关攻略

1,下载好靶机后打开,通过kali扫描靶机ip和端口,得到靶机ip为192.168.50.144 2,扫描目录 3,访问靶机 4,访问扫描到的test.php,得到缺少GET请求参数的提示 5,使用FUZZ来扫出参数为file 6&#xff…

《C++11:bind绑定器与function包装器》

CSTL中提供了bind1绑定器,通常与函数对象一起使用。 函数对象是重载了operator()函数的对象。 将二元函数对象operator()的第一个参数绑定为固定的x来构造一元函数对象。返回绑定了第一个参数的函数对象。 将二元函数…

JS 防抖与节流

防抖 核心思想:延迟执行,只有在事件触发的频率降低到一定程度后才会执行,而且如果事件持续触发,之前地所有执行都会被取消。 有的操作是高频触发的,但是其实只需要一次触发。比如短时间内多次缩放页面resize&#xff0…

【C/C++算法】从浅到深学习--- 简单模拟算法(图文兼备 + 源码详解)

绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论​: 本篇是一些简单的模拟算法,其中模拟的本质就是就是根据题目意思进行代码的…

​​解锁 JavaScript DOM:节点操作的核心方法与最佳实践

引言 在当今动态化的 Web 世界中,用户早已不满足于静态的网页展示,而是期待流畅的交互体验——点击按钮弹出菜单、滚动页面加载数据、实时搜索过滤内容……这些功能的背后,都离不开 ​JavaScript DOM(文档对象模型)操…

Android 12系统源码_系统启动(二)Zygote进程

前言 Zygote(意为“受精卵”)是 Android 系统中的一个核心进程,负责 孵化(fork)应用进程,以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程,后续所有…

精华贴分享|从不同的交易理论来理解头肩形态,殊途同归

本文来源于量化小论坛策略分享会板块精华帖,作者为孙小迪,发布于2025年2月17日。 以下为精华帖正文: 01 前言 学习了一段时间交易后,我发现在几百年的历史中,不同门派的交易理论对同一种市场特征的称呼不一样&#x…

C++智能指针万字详细讲解(包含智能指针的模拟实现)

在笔试,面试中智能指针经常出现,如果你对智能指针的作用,原理,用法不了解,那么可以看看这篇博客讲解,此外本博客还简单模拟实现了各种指针,在本篇的最后还应对面试题对智能指针的知识点进行了拓…

学习threejs,使用多面体(IcosahedronGeometry、TetrahedronGeometry、OctahedronGeometry等)

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.PolyhedronGeometry …

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…

网络运维学习笔记(DeepSeek优化版) 022 HCIP-Datacom路由概念、BFD协议详解与OSPF第一课

文章目录 路由概念、BFD协议详解与OSPF第一课一、路由协议优先级与选路原则1.1 路由协议优先级对照表1.2 路由选路核心原则 二、BFD(Bidirectional Forwarding Detection,双向转发检测)的配置与应用2.1 双向心跳探测(双端配置&…