什么是Java中的JVM(Java虚拟机)?它如何工作?
Java中的JVM,全称Java Virtual Machine(Java虚拟机),是Java程序的运行环境,也是Java语言的核心和基础。它是一个虚拟的计算机,具有完善的硬体架构,如处理器、堆栈、寄存器等,以及相应的指令系统。通过解释Java字节码来运行Java程序,JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM的主要作用是提供了一个安全、独立于硬件和操作系统的运行环境,使Java程序可以在任何支持JVM的平台上运行。它主要具有以下特点:
1、平台无关性:JVM使得Java程序可以在不同的操作系统和硬件平台上运行,实现了“一次编写,到处运行”的愿景。
2、安全性:JVM通过内存管理、字节码验证等方式,确保Java程序的安全执行,防止恶意代码的执行。
3、高效性:虽然JVM的跨平台性可能会带来一些性能损失,但通过即时编译器(JIT)等技术,JVM可以优化代码执行,提高程序运行效率。
JVM的工作原理可以分为三个阶段:加载、链接和初始化。
1、加载阶段:类加载器根据类的全限定名查找并加载类的字节码文件,将其转换为JVM内部的数据结构,并在方法区中生成对应的Class对象。
2、链接阶段:链接阶段包括验证、准备和解析三个步骤。验证是对字节码进行验证,确保其符合JVM规范;准备是为类的静态变量分配内存,并设置默认初始值;解析是将符号引用转换为直接引用,即将类、字段和方法的引用解析为内存地址。
3、初始化阶段:在类的初始化阶段,JVM会执行类的初始化方法,对静态变量进行赋值和静态代码块的执行。
在程序执行过程中,JVM首先将Java源文件编译为Java字节码文件。然后,JRE(Java运行环境)加载这些字节码文件到JVM的内存区。接着,JVM的执行引擎解释或编译这些类文件。在解释执行阶段,JVM将字节码解释成机器码并运行程序。为了提高效率,JVM也提供了即时编译器(JIT),将字节码编译为本地机器码,使程序运行更快。
此外,JVM还提供了类加载器和运行时数据区等功能。类加载器的最终产品是位于堆中的类对象,它封装了类在方法区内的数据结构,并向Java程序提供了访问方法区内数据结构的接口。运行时数据区则包括方法区、堆、Java虚拟机栈、本地方法栈和程序计数器等部分,用于存储和管理程序运行时的各种数据。
继续深入地了解JVM的工作机制。
首先,让我们详细讨论一下JVM的内存结构,这是理解其工作原理的关键。JVM的内存结构大致可以分为以下几个部分:
1、方法区(Method Area):方法区是JVM中存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的地方。它是线程共享的,并且被所有的线程共同维护。
2、堆(Heap):堆是JVM用来存储对象实例的地方。几乎所有Java对象实例都在这里分配内存。堆是线程共享的,因此所有的线程都可以访问任何对象实例。同时,堆内存的管理由JVM的垃圾收集器负责,当对象不再被引用时,垃圾收集器会自动回收其占用的内存。
3、Java虚拟机栈(Java Virtual Machine Stacks):每个线程在创建时都会分配一个虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法在执行时都会创建一个栈帧,用于存储该方法的局部变量等信息。栈帧随着方法的执行而压入和弹出栈,实现了方法的调用和返回。
4、程序计数器(Program Counter Register):这是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
5、本地方法栈(Native Method Stack):本地方法栈与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
在JVM运行程序时,上述的内存结构会被用来存储和管理程序的数据。程序计数器会指向当前需要执行的指令,JVM的解释器或即时编译器会根据指令来操作数据。当需要创建新的对象时,JVM会在堆中为其分配内存。当方法被调用时,会在Java虚拟机栈中创建一个新的栈帧来存储该方法的局部变量等信息。
同时,JVM的垃圾收集器会定期扫描堆内存,找出不再被引用的对象,并释放其占用的内存。这是JVM内存管理的重要部分,它使得Java程序员无需关心内存的分配和回收,从而大大简化了编程工作。
相关文章:
什么是Java中的JVM(Java虚拟机)?它如何工作?
Java中的JVM,全称Java Virtual Machine(Java虚拟机),是Java程序的运行环境,也是Java语言的核心和基础。它是一个虚拟的计算机,具有完善的硬体架构,如处理器、堆栈、寄存器等,以及相应…...

OmniGraffle Pro for mac 出色的图形设计软件
OmniGraffle Pro是一款非常出色的图形设计软件,它主要适用于Mac和iPad平台,可以用来轻松绘制各种精美的图表、示意图和界面设计。 软件下载:OmniGraffle Pro for mac中文注册激活版 以下是OmniGraffle Pro的一些主要特点和功能: 界…...

代码随想录阅读笔记-二叉树【合并二叉树】
题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节…...
Day35:学习尚上优选项目
学习计划:完成尚硅谷的尚上优选项目 学习进度:尚上优选项目 知识点: 四、 搭建平台管理端前端环境 权限管理模块-用户管理 开发为用户分配角色接口用户管理前端测试 权限管理模块-菜单管理 菜单管理需求菜单表设计开发菜单管理CRUD接口开…...
c模板编程c/c++20240401
c模板编程 #include<iostream> //#include<string> //#include<algorithm> template <typename T> T max(T a, T b) { return (a > b) ? a : b; } int main() { int i max(1, 2); // 返回 2 float f max(3.14f, 2.72f); // 返回 3…...

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题
【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题 文章目录 demo工程out_of_box文件调试bin文件名称需要注意的问题附录:结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导…...

连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案
1. 问题背景 调整redis的配置后,启动程序时, 会报如下错误: [redis://172.16.0.8xxx]: ERR This instance has cluster support disabledSuppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster supp…...
什么是json?json可以存放哪几种数据类型
JSON指的是JavaScript对象表示法(avaScript Object Notation),是轻量级的文本数据交换格式,独立于语言: JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言ÿ…...

网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】
目录 前提知识 1. 理解源ip,目的ip和Macip 2. 端口号 3. 初识TCP,UDP协议 4. 网络字节序 5. socket 编程 sockaddr类型 一,基于udp协议编程 1. socket——创建套接字 2. bind——将套接字强绑定 3. recvfrom——接受数据 4. s…...
有关数据开发项目中使用HIVE由于无法update和delete的场景下,如何解决数据增量的思路
解决数据增量问题的思路在Hive中 在数据开发项目中,使用Hive进行数据处理时,由于Hive不支持update和delete语句,处理数据增量可能会变得有些棘手。然而,有几种策略和技术可以帮助我们解决这个问题,并确保数据增量的高…...

两数之和-考察哈希表的运用
题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target,请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同…...

视觉检测系统,外观细节无可挑剔
在传统行业中,利用人工检测来检测产品外观缺陷依然是主流,但由于竞争的加剧,对企业生产效率的要求也越来越高。传统的检测产品外观缺陷问题的方法就是透过人工目检,或者工人采用游标卡尺等工具检测,此种方式检测速度慢…...
C++中string容器的字符串操作
目录 1.c_str() 返回C常量字符串 2.date() 返回C常量字符串 3.substr() 构造子串 4.find() 正向查找(查找失败返回npos) 5.rfind() 逆向查找(查找失败返回npos) 6.find_first_of() 正向查找匹配的字符 7.find_last_of() 逆向…...

Java编程使用CGLIB动态代理介绍与实战演示
文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中,CGLIB (Code Generation Library) 是一个强大的高性能代码生成库,它通过生…...

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片
一、后端直接返回图片url 当图片字段接口直接返回的是图片url,可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…...

iOS开发进阶(十三):脚手架创建iOS项目
文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期,需要搭建项目基本框架,为此离不开辅助工具,即脚手架。当然,IDE也可以实现新建空白项目,但是其新建后的项目结构可能不符合预期设计࿰…...

手机无线投屏到windows11电脑
1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...

linux 环境安装配置
安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…...

Git常用语句
设置用户名 git config --global user.name "用户名" git config --global user.email "邮箱"查看git用户信息 cat ~/.gitconfig初始化本地库 git initclone指定分支的代码 git clone -b my_branch gitgitlabxxxxxxxxxxxxxxxxxxxxxx.gitpush三件套 gi…...

坦克大战_java源码_swing界面_带毕业论文
一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java,内置碰撞检测算法,线程,安全集合,一切皆对象思想等,是java进阶…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...