理解JVM:从字节码到程序运行

大家好,我是程序员大猩猩。

今天我们来讲一下JVM,好多面试者在面试的时候,都会被问及JVM相关知识。那么JVM到底是什么,要理解它到底是出于什么原因?

JVM俗称Java虚拟机,它是一个抽象的计算机,是提供一个可以运行java程序的软件环境。

JVM主要的任务是加载字节码文件(Java文件编译后的.class文件)、验证字节码、执行字节码。

首先看看JVM的结构模型:

图片

  1. 类加载器(Class Loader

  • 负责将.class文件加载到JVM中

  • JVM预定义了三个类加载器:Bootstrap Class Loader、Extension Class Loader和System Class Loader。

  • 可以自定义类加载器。

如何自定义类加载器呢? 重新ClassLoader类并重写了findClass方法

public class CustomClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {try {// .... } catch (IOException e) {throw new ClassNotFoundException(name);}}public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {CustomClassLoader loader = new CustomClassLoader();Class<?> clazz = loader.findClass("com.example.MyClass");Object instance = clazz.newInstance();System.out.println("Loaded class: " + instance.getClass().getCanonicalName());}
}

那么实现自定义类加载器可以用来干什么呢?

  • 实现热部署,即在运行时重新加载类的修改版本。

  • 加密类文件,然后在加载时解密。

  • 从非标准位置(如数据库、网络或其他专用格式)加载类文件。

2. 运行时数据区(Runtime Data Area):

  1. 方法区(Method Area)

    1.  被所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    2.  当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

  2. 堆(Heap)

    1. Java虚拟机管理的内存中最大的一块,被所有线程共享,在虚拟机启动时创建。

    2. 唯一的目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

    3. 垃圾回收器管理的主要区域,因此也被称作“GC堆”

  3. 栈(Stack)

    1. 每个线程创建时都会创建一个虚拟机栈,其生命周期与线程相同。

    2. 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行时,都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

    3. 局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向代表对象的句柄或其他与此对象相关的位置)和返回地址。

  4. 程序计数器(Program Counter Register)

    1. 存储当前线程执行的字节码的地址。每个线程都有一个程序计数器,是线程私有的。

    2. 执行Java方法时,程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果是本地方法,程序计数器的值则为空(Undefined)。

  5. 本地方法栈(Native Method Stack)

    1. 为使用Java Native Interface(JNI)的本地方法服务。

    2. Native方法栈也会在栈深度溢出或栈扩展失败时抛出StackOverflowError和OutOfMemoryError异常。

3. 执行引擎(Execution Engine):

  1. 字节码加载:

    • 类加载器将.class文件加载到JVM的方法区。

    • 执行引擎通过方法区的字节码来执行程序。

  2. 解释执行:

    • 字节码最初是通过解释器逐条解释执行的。

    • 解释器快速地将字节码转换成对应的机器指令,然后执行。

  3. 即时编译(Just-In-Time Compilation,JIT):

    • 为了提高执行效率,现代JVM通常包含一个即时编译器(JIT编译器)。

    • JIT编译器将热点代码(即执行频率高的代码)编译成机器码,并将其存储起来,以便后续可以直接执行编译后的机器码,而不是再次解释执行。

    • 这种混合使用解释执行和编译执行的方法称为“即时编译”。

  4. 优化:

    • JIT编译器在编译字节码时,会进行各种优化,如方法内联、逃逸分析、循环展开等,以提高执行效率。

4.本地库接口(Native Interface):

  • 执行引擎支持JNI,允许Java代码调用其他语言编写的本地库(如C/C++库)。

  • 通过JNI,Java程序可以执行本地方法,这些方法通常是用C/C++等语言编写的,并编译成了本地机器码。

5.垃圾回收器(Garbage Collector):

  • 负责自动管理内存,回收不再使用的对象占用的内存。

  • 减轻了开发者手动管理内存的负担。

  • 执行引擎与垃圾回收器紧密合作,确保在执行过程中,不再使用的对象可以被及时回收,从而释放内存资源。

6.本地方法库(Native Method Libraries):

  • 提供了一系列本地方法,供Java程序调用。

  • 这些方法通常是用C/C++等语言编写的。

JVM的设计允许Java程序在不同的平台上运行,而无需为每个平台编译一个版本。

Java程序首先被编译成字节码,然后由JVM在各个平台上解释执行或编译执行。

这使得Java语言具有“一次编写,到处运行”(Write Once, Run Anywhere)的特性。

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

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

相关文章

蓝桥杯2017年第十三届省赛真题-承压计算

一、题目 承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。 每块金属原料的外形、尺寸完全一致&#xff0c;但重量不同。 金属材料被严格地堆放成金字塔形。 7 5 8 7 8 8 …

腾讯云4核8g服务器多少钱?2024轻量和CVM收费价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

5.6 物联网RK3399项目开发实录-Android开发之(wulianjishu666)

物联网入门到项目实干案例下载&#xff1a; https://pan.baidu.com/s/1fHRxXBqRKTPvXKFOQsP80Q?pwdh5ug --------------------------------------------------------------------------------------------------------------------------------- U-Boot 使用 前言 RK U-B…

AMD本月发布的成本优化型Spartan UltraScale+ FPGA系列

随着 FPGA 在更多应用中的使用&#xff0c;AMD 推出了最新的成本、功耗与性能平衡的系列产品。为了扩展其可编程逻辑产品组合&#xff0c;AMD最近推出了最新的成本优化型 Spartan FPGA 系列。随着 FPGA 应用于越来越多的产品和设备&#xff0c;设计人员可能经常发现自己正在寻找…

Git,GitHub,Gitee,GitLab 四者有什么区别?

目录 1. Git 2. GitHub 3. Gitee 4. GitLab 5. 总结概括 1. Git Git 是一个版本管理工具&#xff0c;常应用于本地代码的管理&#xff0c;下载完毕之后&#xff0c;我们可以使用此工具对本地的资料&#xff0c;代码进行版本管理。 下载链接&#xff1a; Git - Downlo…

Eclipse+Java+Swing实现斗地主游戏

一. 视频演示效果 java斗地主源码演示 ​ 二.项目结构 代码十分简洁&#xff0c;只有简单的7个类&#xff0c;实现了人机对战 素材为若干的gif图片 三.项目实现 启动类为Main类&#xff0c;继承之JFrame&#xff0c;JFrame 是 Java Swing 库中的一个类&#xff0c;用于创建窗…

【计算机图形学】3D Implicit Transporter for Temporally Consistent Keypoint Discovery

对3D Implicit Transporter for Temporally Consistent Keypoint Discovery的简单理解 文章目录 1. 现有方法限制和文章改进2. 方法2.1 寻找时间上一致的3D特征点2.1.1 3D特征Transporter2.1.2 几何隐式解码器2.1.3 损失函数 2.2 使用一致特征点的操纵 1. 现有方法限制和文章改…

阿里云CentOS7安装Hadoop3伪分布式

ECS准备 开通阿里云ECS 略 控制台设置密码 连接ECS 远程连接工具连接阿里云ECS实例&#xff0c;这里远程连接工具使用xshell 根据提示接受密钥 根据提示写用户名和密码 用户名&#xff1a;root 密码&#xff1a;在控制台设置的密码 修改主机名 将主机名从localhost改为需要…

HarmonyOS 应用开发之Want的定义与用途

Want 是一种对象&#xff0c;用于在应用组件之间传递信息。 其中&#xff0c;一种常见的使用场景是作为 startAbility() 方法的参数。例如&#xff0c;当UIAbilityA需要启动UIAbilityB并向UIAbilityB传递一些数据时&#xff0c;可以使用Want作为一个载体&#xff0c;将数据传递…

如何在Flutter中进行网络请求?

Hello&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff0c;你们的好朋友&#xff01;今天&#xff0c;我想和大家分享一下在Flutter中如何进行网络请求。Flutter作为一个跨平台的开发框架&#xff0c;网络请求是其实现数据交互的重要一环。下面&#xff0c;我将详细介绍几种…

构建一个基础的大型语言模型(LLM)应用程序

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

docker部署-RabbitMq

1. 参考 RabbitMq官网 docker官网 2. 拉取镜像 这里改为自己需要的版本即可&#xff0c;下面容器也需要同理修改 docker pull rabbitmq:3.12-management3. 运行容器 docker run \ --namemy-rabbitmq-01 \ -p 5672:5672 \ -p 15672:15672 \ -d \ --restart always \ -…

java算法day37 | 贪心算法 part06 ● 738.单调递增的数字 ● 968.监控二叉树

738.单调递增的数字 思路&#xff1a; 从后向前遍历&#xff0c;如果前一个数比后一个数大&#xff0c;则前一个数-1&#xff0c;后面的数都变成9. 思路不难&#xff0c;但实现的代码还是有一点繁琐的。 以下是用List实现的代码。 class Solution {public int monotoneIncrea…

【群晖】部署UptimeKuma监控服务

【群晖】部署UptimeKuma监控服务 点击标题查看原文 本文讲解在群晖系统中使用docker方式部署UptimeKuma服务并通过外网地址正确访问 配置及版本 DSM&#xff1a;7.2&#xff08;7.x以上均可&#xff09; UptimeKuma&#xff1a;louislam/uptime-kuma:latest 安装 docker中下…

Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174

Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试&#xff0c;其中超过 4000 个可以启动并进入游戏&#xff0c;其中大约 340…

SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索

需求 产品希望我们这边能够实现用户上传PDF、WORD、TXT之内得文本内容&#xff0c;然后用户可以根据附件名称或文件内容模糊查询文件信息&#xff0c;并可以在线查看文件内容。 一、环境 项目开发环境&#xff1a; 后台管理系统springbootmybatis_plusmysqles 搜索引擎&#…

springdata框架对es集成

什么是spring data框架 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elasticsearch…)的…

ssh 公私钥(github)

一、生成ssh公私钥 生成自定义名称的SSH公钥和私钥对&#xff0c;需要使用ssh-keygen命令&#xff0c;这是大多数Linux和Unix系统自带的标准工具。下面&#xff0c;简单展示如何使用ssh-keygen命令来生成具有自定义名称的SSH密钥对。 步骤 1: 打开终端 首先&#xff0c;打开我…

对话 Mines of Dalarnia: Web3 游戏创新,社区驱动与公链共建

作者&#xff1a;stellafootprint.network 嘉宾&#xff1a;Manfred Pack&#xff0c;Mines of Dalarnia 游戏开发总监 采访者&#xff1a;Alex Cooper&#xff0c;Footprint Analytics 北美社区与 BD 负责人 在区块链游戏领域&#xff0c;去中心化和玩家经济正在颠覆传统游戏…

泛型,数据结构,集合

文章目录 泛型介绍解决问题好处使用通配符泛型的下限泛型的上限 数据结构定义常见的数据结构栈(先进后出)队列(先进先出)数组结构链表结构哈希表结构 集合List集合特点特有方法子类及其底层数据结构LinkedList集合 Set集合特点没有特有方法子类及其底层数据结构LinkedHashSet集…