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

news2024/9/27 22:41:03

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

今天我们来讲一下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.coloradmin.cn/o/1551108.html

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

相关文章

香港 4月7日「比特币新资产 Runes 协议」线下沙龙报名开启!

比特币减半在即&#xff0c;聚焦新资产、布局新赛道。 香港时间 2024 年 4 月 7 日&#xff0c;聚焦「比特币新资产 & Runes 协议」的《New Asset Issuance and Settlement on Bitcoin》主题沙龙将于「香港海富中心」欢迎大家的到来&#xff01; 我们邀请了比特币新资产生…

题目:摆花(蓝桥OJ 0389)

问题描述&#xff1a; 题解&#xff1a; #include <bits/stdc.h> using namespace std; using ll long long; const int N 105; const ll p 1e6 7; ll a[N], dp[N][N];int main() {int n, m; cin >> n >> m;for(int i 1; i < n; i)cin >> a[i…

IDEA Android新建项目基础

title: IDEA Android基础开发 search: 2024-03-16 tags: “#JavaAndroid开发” 一、构建基本项目 在使用 IDEA 进行基础的Android 开发时&#xff0c;我们可以通过IDEA自带的新建项目功能进行Android应用开发基础架构的搭建&#xff0c;可以直接找到 File --> New --> …

【机器学习-08】参数调优宝典:网格搜索与贝叶斯搜索等攻略

超参数是估计器的参数中不能通过学习得到的参数。在scikit-learn中&#xff0c;他们作为参数传递给估计器不同类的构造函数。典型的例子有支持向量分类器的参数C&#xff0c;kernel和gamma&#xff0c;Lasso的参数alpha等。 ​ 在超参数集中搜索以获得最佳cross validation交叉…

Java开发过程中如何进行进制换换

最近由于工作上的需要&#xff0c;遇到进制转换的问题。涉及到的进制主要是十进制、十六进制、二进制转换。 1、十进制转十六进制、二进制 调用java自带的api,测试十进制转16进制、2进制 package com.kangning.common.utils.reflect;/*** 十进制 转 十六进制* 十进制 转 二进…

黑群晖Docker安装aria2-pro

前言 最近买了星际蜗牛C款当Nas&#xff0c;来满足我的存储需求&#xff0c;在之前我写过一篇docker安装aria2-pro的文章&#xff0c;既然买了nas那当然也要安装一个aria2-pro做下载器 1.安装 Container Manager 套件 可以在套件中心搜索docker找到 2.下载aria2-pro镜像 打…

力扣热门算法题 89. 格雷编码,92. 反转链表 II,93. 复原 IP 地址

89. 格雷编码&#xff0c;92. 反转链表 II&#xff0c;93. 复原 IP 地址&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.24 可通过leetcode所有测试用例。 目录 89. 格雷编码 解题思路 完整代码 Python Java 92. 反转链表…

利用Tensor在jetson orin 上加速YOLOv5

一、第一种方法&#xff0c;需要下载各种包&#xff1a; 要用到一个大佬的开源&#xff0c;GitHub地址如下&#xff1a; https://github.com/wang-xinyu/tensorrtx/tree/master/yolov51. 安装pycuda&#xff0c;在线安装pycuda pip3 install pycuda 2. Windows操作&#xf…

Ubuntu Desktop 更改默认应用程序 (Videos -> SMPlayer)

Ubuntu Desktop 更改默认应用程序 [Videos -> SMPlayer] References System Settings -> Details -> Default Applications 概况、默认应用程序、可移动介质、法律声明 默认应用程序&#xff0c;窗口右侧列出了网络、邮件、日历、音乐、视频、照片操作的默认应用程序…

2024全行业数字化转型企业建设解决方案PPT合集(附下载)

精品推荐&#xff0c;2024全行业数字化转型企业建设解决方案PPT合集&#xff0c;精品PPT源格式共21份。 点击直达星球下载地址&#xff08;文末领取优惠券&#xff09;&#xff1a;2024全行业数字化转型企业建设解决方案PPT合集 1.制造业数字化转型解决方案及应用.pptx 2.医院…

Java代码基础算法练习-求一个三位数的各位数字之和-2024.03.27

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字之和 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240327 {public static voi…

langchin-chatchat部分开发笔记(持续更新)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

Matlab进阶绘图第47期—气泡分组蝴蝶图

气泡分组蝴蝶图是分组蝴蝶图与气泡图的组合——在分组蝴蝶图每组柱子上方添加大小不同的气泡&#xff0c;用于表示另外一个数据变量&#xff08;如每组柱子值的和&#xff09;的大小。 本文利用自己制作的BubbleButterfly工具&#xff0c;进行气泡分组蝴蝶图的绘制&#xff0c…

从接口发现到文件上传getshell

0x01 信息收集 通过fofa&#xff0c;子域名收集等相关工具搜索域名 定位到站点&#xff1a;htps://xx..edu.cn/x/xx/ 0x02 寻找接口 通过f12寻找相关的js&#xff0c;发现有其他的页面 0x03 拼接路径 https://xx.xx.edu.cn/xx/xx/repairResgister 之后未授权获取到注册用户的页…

【群晖】解决docker容器启动出现 database is locked 错误

【群晖】解决docker容器启动出现 database is locked 错误 问题描述 升级DSM 7.2 V3版本后docker中的大量容器出现虽然显示启动状态&#xff0c;但是webStation中服务是禁用中。 因此选择手动重启容器&#xff0c;但是发现容器无法启动&#xff0c;提示了以下错误&#xff1…

盏多多生物现已加入2024第七届燕窝天然滋补品展

参展企业介绍 广东省盏多多生物科技有限公司是一家从事食品销售,食品销售,食品进出口等业务的公司&#xff0c;成立于2018年12月07日&#xff0c;公司坐落在广东省&#xff0c;详细地址为&#xff1a;惠州市东江三路45号悦榕湾27层05号&#xff08;仅限办公&#xff09;;经国家…

课堂练习:环境体验——Linux 文件操作命令

任务描述 第二个任务就是了解Linxu的文件查看命令&#xff0c;文件编辑基本命令。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.文件查看命令。 2.文件编辑基本命令。 文件查看命令 我们要查看一些文本文件的内容时&#xff0c;要使用文本编辑器来查看…

解决NRF52832正常添加OTA代码后无法进入app一直运行在bootloader的问题!

问题现象描述&#xff1a; SDK版本17.1.0 在 mergehex工具 合并以下文件setting.hex bootloader.hex app.hex sortdevice.hex 之后烧录固件第一次运行 程序一直运行在bootloader&#xff0c;蓝牙名称显示 DFUTARG &#xff0c;必须要进行一次OTA才进入APP 注意&#xff1a;如…

补单系统平台第三方接口,电商平台数据市场接口api提供

补单系统平台第三方接口&#xff0c;电商平台数据市场接口api提供 部分数据参数

电缆故障测试仪的原理和组成部件分别是什么?

电缆故障测试仪是专为检测电缆线路中的各种故障而设计制造的精密电子设备&#xff0c;广泛应用于电力、通信、石油化工、航空航天等领域。这类仪器的工作原理和组成相对复杂&#xff0c;下面将详细阐述。 电缆故障测试仪的工作原理 电缆故障测试仪的核心原理通常涉及电磁波反…