JAVA虚拟机(JVM)学习

入门

什么是JVM

JVM:Java Virtual Machine,Java虚拟机。
JVM是JRE(Java Runtime Environment)的一部分,安装了JRE就相当于安装了JVM,就可以运行Java程序了。JVM的作用:加载并执行Java字节码(.class)文件。

常见的JVM

在这里插入图片描述
在这里插入图片描述
Java虚拟机要实现Java虚拟机规范,它定义了Java虚拟机的结构、指令集、类文件格式、类加载器、字节码执行引擎等方面的内容。

JVM结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

执行引擎Execution Engine

JVM执行引擎通常由两个主要组成部分构成:解释器和即时编译器(Just-In-Time Compiler,JIT Compiler)。

解释器:当Java字节码被加载到内存中时,解释器逐条解析并直接执行字节码指令。
即时编译器(JIT Compiler):即时编译器将字节码动态地编译为本地机器码,之后再执行。即时编译器根据运行时的性能数据和优化技术,对经常执行的热点代码进行优化,从而提高程序的性能。即时编译器可以将经过优化的代码缓存起来,以便下次再次执行时直接使用。
在这里插入图片描述

本地方法接口Native Interface

本地接口的作用是融合不同的编程语言为 Java 所用。当Java代码调用本地方法(被native所修饰的方法)时,JVM会将控制权转移到本地方法实现所在的本地库本地库是一个包含本地方法实现的动态链接库(DLL - windows函数库)或共享对象文件(SO - Linux函数库)。它是使用其他编程语言编写的,通常是为了与底层操作系统或硬件进行交互。本地库可以通过JNI加载到JVM中,并提供给Java代码调用。
例如Thread类中有一些标记为native的方法 操作底层操作系统线程

本地方法栈Native Method Stack

本地方法栈(Native Method Stack):本地方法栈存储了从Java代码中调用本地方法时所需的信息。是线程私有的。
本地方法栈是JVM专门为调用非Java语言方法而设计的,它与操作系统和硬件交互,通过JNI为Java程序提供更强大的功能。每个线程都有自己的本地方法栈,保证本地方法的调用是独立且线程安全的。

PC寄存器(程序计数器PC Register)

PC寄存器(程序计数器,Program Counter Register)是JVM中线程私有的一块小内存区域。用于记录当前线程正在执行的字节码指令的地址或行号。它类似于一个指针,指向线程正在执行的字节码指令的下一条指令。
在这里插入图片描述

类加载器ClassLoader

类加载器(ClassLoader)是JVM的一个关键组件,用于动态加载、链接和初始化Java类。它的主要职责是在程序运行时将类的字节码加载到JVM中,以便JVM可以执行这些类。类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。每个 Java 类都有一个引用指向加载它的 ClassLoader。数组类不是通过 ClassLoader 创建的(数组类没有对应的二进制字节流),是由 JVM 直接生成的。
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,即双亲委派模型

虚拟机栈stack

栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,每个线程都有自己的栈,它的生命周期是跟随线程的生命周期,线程结束栈内存也就释放,是线程私有的。线程上正在执行的每个方法都各自对应一个栈帧(Stack Frame)。
JVM对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”或者“后进先出”原则。
一个线程中只能由一个正在执行的方法(当前方法),因此对应只会有一个活动的当前栈帧。
在这里插入图片描述
栈溢出(StackOverflowError):通常在递归调用

栈帧

栈帧是一个内存区块,是一个数据集,包含方法执行过程中的各种数据信息。
在这里插入图片描述

局部变量表(Local Variables)

也叫本地变量表。存储方法参数和方法体内的局部变量:8种基本类型变量、对象引用(reference)。

操作数栈(Operand Stack)

作用:也是一个栈,在方法执行过程中根据字节码指令记录当前操作的数据,将它们入栈或出栈。用于保存计算过程的中间结果,同时作为计算过程中变量的临时存储空间。

public class OperandStackDemo {public static void main(String[] args) {int i = 15;int j = 8;int k = i + j;}
}

在这里插入图片描述
在这里插入图片描述

动态链接(Dynamic Linking)

作用:可以知道当前帧执行的是哪个方法。指向运行时常量池中方法的符号引用。程序真正执行时,类加载到内存中后,符号引用会换成直接引用。
在这里插入图片描述

方法返回地址(Return Address)

可以知道调用完当前方法后,上一层方法接着做什么,即“return”到什么位置去。存储当前方法调用完毕后下一条指令的地址

完整一个线程内存结构在这里插入图片描述
java -Xss 可以设置栈大小

方法区Method Area

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

堆heap

堆是线程共享

堆、栈、方法区的关系

在这里插入图片描述

HotSpot是使用指针的方式来访问对象:

  • 内存用于存放对象和数组
  • 中会存放指向对象类型数据的地址
  • 中会存放指向堆中的对象的地址在这里插入图片描述

堆空间

一个Java程序运行起来对应一个进程,一个进程对应一个JVM实例,一个JVM实例中有一个运行时数据区。
在 Java 虚拟机(JVM)中,堆空间是管理 Java 对象的内存区域。堆空间的主要作用是动态分配和管理 Java 对象的内存,在JVM启动的时候被创建,并且一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。

堆空间划分

堆内存逻辑上分为三部分:

  • Young Generation Space 新生代/年轻代 Young/New
  • Tenured generation space 老年代/养老代 Old/Tenured
  • Permanent Space/Meta Space 永久代/元空间 Permanent/Meta

新生代又划分为:

  • 伊甸园区(Eden space)
  • 和幸存者区(Survivor space) 。
    幸存者区有两个:
  • S0区(Survivor 0 space)
  • S1区(Survivor 1 space)

堆内存内部空间所占比例:

  • 新生代与老年代的默认比例: 1:2
  • 伊甸园区与幸存者区的默认比例是:8:1:1

配置堆大小
-Xms600m -Xmx600m -Xmn200m

  • Xms表示堆的起始内存,等价于-XX:InitialHeapSize,默认是物理电脑内存的1/64。

  • Xmx表示堆的最大内存,等价于-XX:MaxHeapSize,默认是物理电脑内存的1/4。
    通常会将-Xms和-Xmx配置相同的值,目的是为了在Java垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小,从而提高性能。

JDK1.8及之后堆空间

在这里插入图片描述

堆空间工作流程

学不明白的了解即可

垃圾回收GC

在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,Java中为了简化对象的释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器
在这里插入图片描述
线程不共享的部分,都是伴随着线程的创建而创建,线程的销毁而销毁。因此线程不共享的程序计数器、虚拟机栈、本地方法栈中没有垃圾回收。

方法区的垃圾回收

方法区中能回收的内容主要就是不再使用的类。判定一个类可以被卸载。需要同时满足下面三个条件:
1、此类所有实例对象没有在任何地方被引用,在堆中不存在任何该类的实例对象以及子类对象。
2、该类对应的 java.lang.Class 对象没有在任何地方被引用。
3、加载该类的类加载器没有在任何地方被引用。

堆的垃圾回收

Java堆中的对象是否能被回收,是根据对象是否被引用来决定的。如果对象被引用了,说明该对象还在使用,不允许被回收。

垃圾判断

判断堆上的对象是否被引用方法:引用计数法(已摒弃)和可达性分析法。

可达分析法

将一系列GC Root的集合作为起始点,按照从上至下的方式搜索所有能够被该合集引用到的对象(是否可达),并将其加入到该和集中,这个过程称之为标记(mark),被标记的对象是存活对象。 最终,未被探索到的对象便是死亡的,可以回收的。
在这里插入图片描述

垃圾回收算法

当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收。有以下算法:
标记-清除算法(Mark-Sweep)
复制算法(Copying)
标记压缩算法(Mark-Compact)
分代收集算法(Generational-Collection)

垃圾收集器

如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现
七款经典垃圾收集器:
在这里插入图片描述
算法和收集器了解即可

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

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

相关文章

【数据结构与算法】——堆(补充)

前言 上一篇文章讲解了堆的概念和堆排序,本文是对堆的内容补充 主要包括:堆排序的时间复杂度、TOP 这里写目录标题 前言正文堆排序的时间复杂度TOP-K 正文 堆排序的时间复杂度 前文提到,利用堆的思想完成的堆排序的代码如下(包…

什么是柜台债

柜台债(柜台债券业务)是指通过银行等金融机构的营业网点或电子渠道,为投资者提供债券买卖、托管、结算等服务的业务模式。它允许个人、企业及机构投资者直接参与银行间债券市场的交易,打破了以往仅限机构参与的壁垒。以下是综合多…

【Android读书笔记】读书笔记记录

文章目录 一. Android开发艺术探索1. Activity的生命周期和启动模式1.1 生命周期全面分析 一. Android开发艺术探索 1. Activity的生命周期和启动模式 1.1 生命周期全面分析 onPause和onStop onPause后会快速调用onStop,极端条件下直接调用onResume 当用户打开新…

Java对象内存结构详解

Java对象内存结构详解 Java对象在JVM内存中的存储结构可以分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。以下是64位JVM(开启压缩指针)下…

【TI MSPM0】Printf重定向学习

一、新建工程 通过XDS110与电脑进行通信。 选择这两个引脚 需要添加这两个头文件 在程序中添加这三个函数即可对printf进行重定向 二、封装函数 另一种方法 封装一个函数,定义一个数组

深度强化学习基础 0:通用学习方法

过去自己学习深度强化学习的痛点: 只能看到各种术语、数学公式勉强看懂,没有建立清晰且准确关联 多变量交互关系浮于表面,有时候连环境、代理控制的变量都混淆 模型种类繁多,概念繁杂难整合、对比或复用,无框架分析所…

asm汇编源代码之-字库转换程序

将标准的16x16点阵汉字库(下载16x16汉字库)转换成适合VGA文本模式下显示的点阵汉字库 本程序需要调用file.asm中的子程序,所以连接时需要把file连接进来,如下 C:\> tlink chghzk file 调用参数描述如下 C:\> chghzk ; 无调用参数,转换标准库文件(SRC16.FNT)为适合VGA…

uniapp转换markdown

效果 AI智能体 微信小程序 流式 1.安装Node.js 参考:2024最新版Node.js下载安装及环境配置教程(非常详细)_node.js 安装-CSDN博客 2.需要克隆项目到本地或直接到项目地址下载压缩包。 参考:uniapp中解析markdown支持网页和小程序_uniapp ma…

用java代码如何存取数据库的blob字段

一.业务 在业务中我们被要求将文件或图片等转成 byte[] 或 InputStream存到数据库的Blob类型的字段中. 二.Blob类型介绍 在 MySQL 中,Blob 数据类型用于存储二进制数据。MySQL 提供了四种不同的 Blob 类型: TINYBLOB: 最大存储长度为 255 个字节。BL…

qemu(2) -- 定制开发板

1. 前言 qemu支持自定义开发板,本文就记录一下折腾的过程。基于qemu-10.0.0-rc3添加x210vb3s开发板。 2. 添加板卡文件 网上参考了一些文章,有些文章使用的版本和我的不一样,折腾起来费了点时间,最后发现还是直接参考qemu中已有…

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM) 问题模板解题思路1. 导入必要的库2. 加载数据3. 划分训练集和测试集4. 数据预处理5. 定义算法及其参数6. 存储算法和对应指标7. 训练模型并计算指标8. 找…

CPU(中央处理器)

一、CPU的定义与核心作用 CPU 是计算机的核心部件,负责 解释并执行指令、协调各硬件资源 以及 完成数据处理,其性能直接影响计算机的整体效率。 核心功能: 从内存中读取指令并译码。执行算术逻辑运算。控制数据在寄存器、内存和I/O设备间的…

上层 Makefile 控制下层 Makefile 的方法

在复杂的项目中,通常会将项目划分为多个模块或子项目,每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例,实现上层 Makefile 对下层 Makefile 的控制。 直接调用&#xff1…

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…

使用python获取电脑硬盘信息

import psutil# 获取硬盘信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"设备: {partition.device}")print(f"挂载点: {partition.mountpoint}")print(f"文件系统类型: {partitio…

HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一种数据库查询优化技术,通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况,因为它可以在索引扫描阶段就排除不符合全部条件的数据行,而不是将所有可能匹配的记录加载到服务器层再进行…

idea在线离线安装插件教程

概述 对于小白来说,刚使用idea时,还有很多不懂的地方,这里,简单介绍下如何安装插件。让小白能容易上手全盘idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安装 3.1、在线安装 输入想搜索的内容&#x…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中,内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新,深入剖析消防体系内部管理的痛点,以自主研发的消防一体化安全管控平台,为行业发展提供了创…

ES6学习03-字符串扩展(unicode、for...of、字符串模板)和新方法()

一、字符串扩展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.