理解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 {
    @Override
    protected 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.mfbz.cn/a/497539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop面试重点

文章目录 1. Hadoop 常用端口号2.Hadoop特点3.Hadoop1.x、2.x、3.x区别 1. Hadoop 常用端口号 hadoop2.xhadoop3.x访问HDFS 端口500709870访问 MR 执行情况端口80888088历史服务器1988819888客户端访问集群端口90008020 2.Hadoop特点 高可靠&#xff1a;Hadoop底层维护多个数…

京东电商实时数据采集:京东数据API接口海量数据采集京东商品详情页SKU实时采集

京东数据api接口&#xff1a;京东电商数据如何采集&#xff1f; 用户行为日志采集 &#xff1a;这种方法通常用于记录用户在网站上的行为&#xff0c;如点击、浏览等&#xff0c;以帮助分析用户行为和优化用户体验。通用数据采集 &#xff1a;可以通过数据直通车等方式进行&am…

数字孪生关键技术及体系架构

摘要&#xff1a; 数字孪生以各领域日益庞大的数据为基本要素&#xff0c;借助发展迅速的建模仿真、人工智能、虚拟现实等先进技术&#xff0c;构建物理实体在虚拟空间中的数字孪生体&#xff0c;实现对物理实体的数字化管控与优化&#xff0c;开拓了企业数字化转型的可行思路…

SpringBoot+Prometheus+Grafana实现应用监控和报警

一、背景 SpringBoot的应用监控方案比较多&#xff0c;SpringBootPrometheusGrafana是目前比较常用的方案之一。它们三者之间的关系大概如下图&#xff1a; 关系图 二、开发SpringBoot应用 首先&#xff0c;创建一个SpringBoot项目&#xff0c;pom文件如下&#xff1a; <…

本地部署大模型的几种工具(上-相关使用)

目录 前言 为什么本地部署 目前的工具 vllm 介绍 下载模型 安装vllm 运行 存在问题 chatglm.cpp 介绍 下载 安装 运行 命令行运行 webdemo运行 GPU推理 ollama 介绍 下载 运行 运行不同参数量的模型 存在问题 lmstudio 介绍 下载 使用 下载模型文件…

Git版本管理使用手册 - 8 - 合并分支、解决冲突

合并整个开发分支 切换到本地test分支&#xff0c;选择右下角远程开发分支&#xff0c;选择Merge into Current。然后提交到远程test仓库。 合并某次提交的代码 当前工作区切换成test分支&#xff0c;选择远程仓库中的dev开发分支&#xff0c;选择需要合并的提交版本右击&a…

机器学习优化算法(深度学习)

目录 预备知识 梯度 Hessian 矩阵&#xff08;海森矩阵&#xff0c;或者黑塞矩阵&#xff09; 拉格朗日中值定理 柯西中值定理 泰勒公式 黑塞矩阵&#xff08;Hessian矩阵&#xff09; Jacobi 矩阵 优化方法 梯度下降法&#xff08;Gradient Descent&#xff09; 随机…

Hive-技术补充-ANTLR的真实语法世界

一、上下文 上一篇博客<Hive-技术补充-ANTLR语法编写>&#xff0c;我们了解了如何使用ANTLR语法来表达词法结构和语法结构&#xff0c;下面我们循循渐进的处理身边用过的一些文件或语言&#xff1a; CSV、JSON、DOT、Cymbol、R 二、解析CSV文件 有这样一份csv文件 …

【详细讲解PostCSS如何安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

HarmonyOS 应用开发之UIAbility组件基本用法

UIAbility组件的基本用法包括&#xff1a;指定UIAbility的启动页面以及获取UIAbility的上下文 UIAbilityContext。 指定UIAbility的启动页面 应用中的UIAbility在启动过程中&#xff0c;需要指定启动页面&#xff0c;否则应用启动后会因为没有默认加载页面而导致白屏。可以在…

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

Jupyter开启远程服务器(最新版)

Jupyter Notebook 在本地进行访问时比较简单&#xff0c;直接在cmd命令行下输入 jupyter notebook 即可&#xff0c;然而notebook的作用不止于此&#xff0c;还可以用于远程连接服务器&#xff0c;这样如果你有一台服务器内存很大&#xff0c;但是呢你又不喜欢在linux上进行操作…

【文本】正则 | 正则表达式收录

1、匹配数字加右括号 1&#xff09;正则 \d\) 2&#xff09;效果 ~~

探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

title: 探索多种数据格式&#xff1a;JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构&#xff0c;不同的数据格…

CSS(二)---【常见属性、复合属性使用】

零.前言 本篇文章主要阐述CSS常见属性、复合属性&#xff0c;更多前置知识请见作者其它文章&#xff1a; CSS(一)---【CSS简介、导入方式、八种选择器、优先级】-CSDN博客 1.CSS属性 CSS的属性有上百个&#xff0c;但是我们并不需要全部学习&#xff0c;只要我们学习一部分…

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

UI的设计

一、RGB888的显示 即红色&#xff0c;绿色&#xff0c;蓝色都为8位&#xff0c;即通常说的24位色。可以很好显示各种过渡颜色。从硬件上&#xff0c;R、G、B三基色的连接线各需要有8根&#xff0c;即24根数据线&#xff1b;软件上存储的数据量也需要24位&#xff0c;即3个字节&…

Android和IOS应用开发-Flutter应用让屏幕在 app 运行期间保持常亮的方法

文章目录 Flutter应用让屏幕在 app 运行期间保持常亮的方法方法一&#xff1a;使用系统插件方法二&#xff1a;使用 Widgets注意事项 Flutter应用让屏幕在 app 运行期间保持常亮的方法 在 Flutter 开发中&#xff0c;可以使用以下两种方法让屏幕在 app 运行期间保持常亮&#…

数据结构(六)——图

六、图 6.1 图的基本概念 图的定义 图&#xff1a;图G由顶点集V和边集E组成&#xff0c;记为G (V, E)&#xff0c;其中V(G)表示图G中顶点的有限非空集&#xff1b;E(G) 表示图G中顶点之间的关系&#xff08;边&#xff09;集合。若V {v1, v2, … , vn}&#xff0c;则用|V|…

Stable Diffusion WebUI 图生图(img2img):图生图/涂鸦绘制/局部重绘/有色蒙版/上传蒙版/批量处理/反推提示词

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本篇文章我们介绍 Stable Diffusion WebUI 的图生图功能&#xff0c;主要包括&#xff1a;图生图、图生图&#xff08…
最新文章