java进阶1——JVM

java进阶——JVM

1、JVM概述
作用

Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对 应平台上的机器码指令行,每一条 java 指令,java 虚拟机中都有详细定义,如怎么取操 作数,怎么处理操作数,处理结果放在哪儿。

特点:

一次编译到处运行

自动内存管理

自动垃圾回收功能

现在的 JVM 不仅可以执行 java 字节码文件,还可以执行其他语言编译后的字节码文件,是一 个跨语言平台.

在这里插入图片描述

JVM的位置

在这里插入图片描述

JVM 是运行在操作系统之上的,它与硬件没有直接的交互。

在这里插入图片描述

构成部分:
JVM 整体组成可分为以下四个部分:

1.类加载器(ClassLoader)

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

3.执行引擎(Execution Engine)

4.本地库接口(Native Interface)

简图:

在这里插入图片描述

详细图:

在这里插入图片描述

各个组成部分的用途

程序在执行之前先要把 java 代码转换成字节码(class 文件),jvm 首先需要 把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中 的运行时数据区(Runtime Data Area) ,而字节码文件是 jvm 的一套指 令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析 器执行引擎(ExecutionEngine) 将字节码翻译成底层系统指令再交由 CPU 去执行,而这个过程中需要调用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与 功能。

而我们通常所说的 JVM 组成指的是运行时数据区(Runtime Data Area),因为通常需要程序员调试分析的区域就是“运行时数据区”,或者 更具体的来说就是“运行时数据区”里面的 Heap(堆)模块。

Java 代码的执行流程

在这里插入图片描述

在这里插入图片描述

Java 编译器编译过程中,任何一个节点执行失败就会造成编译失败。虽然各个 平台的 java 虚拟机内部实现细节不尽相同,但是它们执行的字节码内容却是一 样的。 JVM 主要任务就是负责将字节码装载到其内部,解释/编译为对应平台上的机器 指令执行。JVM 使用类加载器(Class Loader)装载 class 文件。 类加载完成后,会进行字节码校验,字节码校验通过之后 JVM 解释器会把字节 码翻译成机器码交由操作系统执行。 但不是所有的代码都是解释执行,JVM 对此作了优化,比如 HotSpot 虚拟机, 它本身提供了 JIT(Just In Time)编译器.

JVM 架构模型

Java 编译器输入的指令流基本上是一种基于栈的指令集架构,另一种指令集架构 是基于寄存器的指令集架构.

基于栈式架构的特点

设计和实现更简单,适用于资源受限的系统. 使用零地址指令方式分配,其执行过程依赖于操作栈,指令集更小,编译器容易实 现.不需要硬件支持,可移植性好,更好实现跨平台.

基于寄存器式架构特点:

指令完全依赖于硬件,可移植性差.

性能优秀,执行更高效.

完成一项操作使用的指令更少.

在这里插入图片描述

使用 javap -v class 文件可以将 class 文件反编译为指令集.

所以由于跨平台的设计,Java 指令集都是根据栈来设计的,不同 CPU 架构不同,

所以不能设计为基于寄存器的.

优点是跨平台,指令集小,编译器容易实现.

缺点是性能下降,实现同样功能需要更多的指令.

2、JVM结构-类加载

类加载子系统

在这里插入图片描述

作用:

类加载器子系统负责从文件系统或者网络中加载 class 文件。

主负责加载类, 有执行引擎执行,存放在方法区(元空间)

扮演者的是一个快递员的角色

在这里插入图片描述

  1. class file 存在于硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板 在执行的时候是要加载 JVM 当中来,根据这个模板实例化出 n 个一模一样的实 例.

  2. class file 加载到 JVM 中,被称为 DNA 元数据模板,放在方法区中.

  3. 在.class–>JVM–>最终称为元数据模板,此过程就要有一个运输工具(类加 载器 Class Loader),扮演一个快递员的角色.

类加载过程

在这里插入图片描述

1.加载

根据类的地址,从硬盘上读取类的信息,

将信息读入到方法区,生成Class类的对象

2.链接

验证: 验证字节码文件格式是否是当前虚拟机所支持的文件格式,语法格式

准备: 为静态成员分配默认值(int 默认值0) 注意static final在编译期间赋值

解析: 将字节码中符号引用 替换 成 直接引用

例如: 编写代码 方法1 中调用 方法2 (符号引用)

类加载到内存后把符号的引用地址 换成 内存的地址引用

3.初始化

类什么时候初始化

1 )创建类的实例,也就是 new 一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName(“”))

5)初始化一个类的子类(会首先初始化子类的父类)

类的初始化顺序

先初始化静态的,多个静态的按照从上向下的顺序执行,

如果类有父类,则先初始化父类的静态,然后是子类.

如果是创建对象,先调用父类的构造方法,然后是子类自己的构造方法

类加载器

在这里插入图片描述

站在JVM的角度划分: 启动类加载器(不是java语言写的),

其他类加载(都是java语言写的)

站在开发者的角度:

启动类加载器(引导类加加载器)

这个类加载器使用 C/C++语言实现,嵌套在 JVM 内部.它用来加载 java 核心类

库.

负责加载扩展类加载器和应用类加载器

加载<JAVA_HOME>lib

扩展类加载类器

是由java语言实现的 继承自ClassLoader

负责加载 E:ProgramFilesJavajdk1.8.0_261jrelibext

应用程序类加载器(系统类加载器)

Java 语言编写的,由 sun.misc.Launcher$AppClassLoader 实现.

派生于 ClassLoader 类.

负责加载用户类

用户自定义类加载器(例如tomcat)

双亲委派机制

在这里插入图片描述

类的加载时按需加载,使用时才会加载.

类加载时,加载器都会将类交给父级类加载器加载.

如果所有的父级加载没有找到类,

则一级一级的向下委派查找.

如果都找不到,那么就会抛出异常.

目的: 为了安全考虑 避免了用户自己写的类覆盖了系统中的类.

类的主动使用和被动使用
主动使用会触发类的初始化

new

使用静态变量 静态方法

反射加载类

执行main方法

子类被初始化 父类也会触发初始化

被动使用不会触发了类的初始化

仅仅使用类的静态常量 而且是直接赋字面量的那种

将类作为数组的类型声明使用时不会触发初始化

3、JVM 运行时数据区

堆,方法区(元空间) 主要用来存放数据 是线程共享的.

程序计数器,本地方法栈,虚拟机栈 是运行程序的,是线程私有的.

程序计数器

jvm中的程序计数器不是cpu中的寄存器, 可以理解为计数器.

是一块非常小的内存空间,运行速度是最快的,不会出现内存溢出情况.

作用:记录当前线程中的方法执行的位置. 以便于cpu在切换执行时,记录程序执行的为位置.

在运行时数据区中唯一一个不会出现内存溢出的区域.

本地方法栈

当我们在程序中调用本地方法时,会将本地方法加载到 本地方法栈中执行.

也是线程私有的, 如果空间不够,也会出现栈溢出错误. hashCode();

虚拟机栈

背景: java为了移植性好(跨平台) 所以将运行程序的设计架构为栈结构运行, 而不是依赖于cpu的寄存器架构.

栈是运行时的单位(加载方法运行),

而堆是存储的单位(存储对象的).

作用运行方法 一个方法就是一个栈帧. 栈帧中包含( 局部变量(基本类型,引用地址) 方法地址,返回地址)

栈中的操作 入栈,出栈
栈中异常 StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。 递归调用方法次数过多

栈中存储方法运行时需要的数据

栈的运行原理 第一个方法被加载 入栈 在方法中调用了其他方法, 另一个方法入栈 方法运行结束后出栈.

栈帧的结构:
局部变量表: 方法参数,定义的局部变量, 基本值类型直接存值, 引用类型存地址.

操作数栈

动态链接

方法返回地址

4、Java 堆

5、方法区

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

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

相关文章

搭建集成开发环境PyCharm

1.下载安装Python&#xff08;建议下载并安装3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾选“Add Python 3.9 to PATH”复选框&#xff0c;表示将Python的路径增加到环境变量中 2.安装集成开发环境Pycharm http://www.jetbrains.com/pycharm/…

vue2-v-if和v-for的优先级

vue2-v-if和v-for的优先级 1.v-if和v-for的作用 v-if是条件渲染&#xff0c;只有条件表达式true的情况下&#xff0c;才会渲染v-for是基于一个数组来渲染一个列表&#xff0c;在v-for的时候&#xff0c;保证给每个元素添加独一无二的key值&#xff0c;便于diff算法进行优化 …

通过C/C++编程语言实现“数据结构”课程中的链表

引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…

《redis4.0 通信模块源码分析(一)》

【redis导读】redis作为一款高性能的内存数据库&#xff0c;面试服务端开发&#xff0c;redis是绕不开的话题&#xff0c;如果想提升自己的网络编程的水平和技巧&#xff0c;redis这款优秀的开源软件是很值得大家去分析和研究的。 笔者从大学毕业一直有分析redis源码的想法&…

开源安全一站式构建!开启企业开源治理新篇章

在如今信息技术日新月异、飞速发展的数字化时代&#xff0c;开源技术如同一股强劲的东风&#xff0c;为企业创新注入了源源不断的活力&#xff0c;然而&#xff0c;正如一枚硬币有正反两面&#xff0c;开源技术的广泛应用亦伴随着不容忽视的挑战。安全风险如影随形&#xff0c;…

DeePseek结合PS!批量处理图片的方法教程

​ ​ 今天我们来聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;实现图片的批量处理。 传统上&#xff0c;批量修改图片尺寸、分辨率等任务往往需要编写脚本或手动处理&#xff0c;而现在有了AI的辅助&#xff0c;我们可以轻松生成PS脚本&#xff0c;实现自动化处…

13.代理模式(Proxy Pattern)

定义 代理模式&#xff08;Proxy Pattern&#xff09; 是一种结构型设计模式&#xff0c;它通过提供一个代理对象来控制对目标对象的访问。代理对象作为客户端与目标对象之间的中介&#xff0c;间接地访问目标对象的功能。代理模式可以在不改变目标对象的情况下增加一些额外的…

DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解决方法

在使用DBeaver连接MySQL数据库时&#xff0c;如果遇到“Access denied for user ip (using password: YES)”的错误提示&#xff0c;说明用户认证失败。此问题通常与数据库用户权限、配置错误或网络设置有关。本文将详细介绍解决此问题的步骤。 一、检查用户名和密码 首先&am…

Python进行模型优化与调参

在数据科学与机器学习领域,模型的优化与调参是提高模型性能的重要步骤之一。模型优化可以帮助提高模型的准确性和泛化能力,而合理的调参则能够充分发挥模型的潜力。这篇教程将重点介绍几种常用的模型优化与调参方法,特别是超参数调整和正则化技术的应用。这些技术能够有效地…

Verilog基础(三):过程

过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的,所以任何电路都可以表示为模块和赋值语句的某种组合. 然而,有时这不是描述电路最方便的方法. 两种always block是十分有用的: 组合逻辑: always @(…

2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;一级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 点击下列哪个按钮&#xff0c;可以将红框处的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 标…

C++【深入 STL--list 之 迭代器与反向迭代器】

接前面的手撕list(上)文章&#xff0c;由于本人对于list的了解再一次加深。本文再次对list进行深入的分析与实现。旨在再一次梳理思路&#xff0c;修炼代码内功。 1、list 基础架构 list底层为双向带头循环链表&#xff0c;问题是如何来搭建这个list类。可以进行下面的考虑&am…

如何打开vscode系统用户全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用户配置文件&#xff0c;它存储了 编辑器的个性化设置&#xff0c;包括界面布局、代码格式化、扩展插件、快捷键等&#xff0c;是用户全局配置&#xff08;影响所有…

wordpress外贸独立站常用询盘软件

LiveChat LiveChat是一家提供实时聊天软件的公司&#xff0c;帮助企业通过其平台与客户进行即时通讯&#xff0c;提高客户满意度和忠诚度。他们的产品允许企业在网站、应用程序或电子邮件等多个渠道与客户互动&#xff0c;从而提升客户体验并促进销售增长。 LiveChat的软件特…

STM32 ADC模数转换器

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a;0~3.3V&#xff0…

(2025,LLM,下一 token 预测,扩散微调,L2D,推理增强,可扩展计算)从大语言模型到扩散微调

Large Language Models to Diffusion Finetuning 目录 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微调的高斯扩散 3.2 架构 4. 主要实验结果 5. 结论 1. 概述 本文提出了一种新的微调方法——LM to Diffusion (L2D)&#xff0c;旨在赋予预训练的大语言模型&#xff08;…

DeepSeek 与 ChatGPT 对比分析

一、技术背景与研发团队 ChatGPT 由 OpenAI 开发&#xff0c;自 2015 年 OpenAI 成立以来&#xff0c;经过多年的技术积累和迭代&#xff0c;从 GPT-1 到 GPT-4o&#xff0c;每一次升级都带来了技术上的突破。OpenAI 拥有雄厚的技术实力和海量的数据、强大的算力支持&#xff…

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…

DeepSeek R1技术报告关键解析(8/10):DeepSeek-R1 的“aha 时刻”,AI 自主学习的新突破

1. 什么是 AI 的“aha 时刻”&#xff1f; 在强化学习过程中&#xff0c;AI 的推理能力并不是线性增长的&#xff0c;而是会经历一些关键的“顿悟”时刻&#xff0c;研究人员将其称为“aha 时刻”。 这是 AI 在训练过程中突然学会了一种新的推理方式&#xff0c;或者能够主动…

python:递归函数与lambda函数

递归函数&#xff1a;1.函数内调用自己 2.有一个出口 1.递归 一.有出口时 def sum(num):if num1:return 1return numsum(num-1) asum(3) print(a) #num3 3sum(2) #num2 2sum(1) #num1是返回1 #即3sum(2&#xff09;即32sum(1)即321运行结果 6 二.无出口时 def sum(num)…