JVM部分内容

1.JVM内存区域划分

为什么要划分内存区域,JAVA虚拟机是仿照真实的操作系统进行设计的,JVM也就仿照了它的情况,进行了区域划分的设计。

JAVA进程也就是JAVA虚拟机会从操作系统申请内存空间给进程使用,JVM内存空间划分,就相当于JVM进程自身从操作系统申请到内存空间,再把内存空间按照不同的功能进行分配。

1.具体划分

1.程序计数器

这是一个很小的区域,只是用来记录当前指令执行到哪个地址了。

2.元数据区

保存当前类被加载好的对象

3.栈

保存方法的调用关系。

每次调用方法,就会进入方法内部执行,当执行完毕就会返回调用位置,继续往后走。

栈这个空间不大,一般是几十几百MB,大部分情况下是够用的,少数情况下可能会出现栈溢出。

4.堆

保存new的对象

Test t = new Test();

左边的t如果是一个局部变量,t就是在栈上。如果是一个成员变量,t就是在堆上。如果是一个静态成员变量,t就是在元数据区。

右边的new Tests()一定是在堆上。

堆是JVM中最大的空间区域,往集合类里添加元素也是保存在堆里,如果堆上的对象不再使用的话,就会被释放掉(垃圾回收)。

方法元信息和类元信息都是类对象提供的,指的是一些属性,比如类叫什么名字,是不是public,继承自哪些类,实现了哪些接口......方法叫什么名字,参数有几个,返回值是什么类型......

元数据区和堆整个JAVA进程共用一份,

程序计数器和栈一个进程中可能有多份(一个线程一份)

2.类加载机制

1.类加载的步骤

类加载一共有三个阶段,其中第二个阶段又被分为3个步骤,所以一共有5个步骤。

1).加载:找到.class文件

根据类的全限定名(包名+类名,形如java.lang.String),打开文件,读取内容到内存中。

2).验证:解析,校验.class文件读到的内容是否是合法的,并且把这里的数据转成结构化的数据。.class文件这个二进制文件格式是由明确要求的。JAVA写的代码都会转到下面这个.class中,只不过会换成二进制的表现形式。

magic表示魔数,区分不同的二进制文件类型,这是一个固定值,不同的二进制文件有不同的取值

u4表示4个字节的无符号位整数,u2表示2个字节的无符号位整数。

cp_info,method_info......表示其他的结构体。

3).准备:给类对象申请内存空间,此处申请的内存空间相当于是"全0"空间。

4).解析:针对字符串常量进行初始化。

字符串常量本身就包含在.class文件中,需要把文件中的字符串常量解析出来放到内存空间里(元数据区,常量池)

5).初始化

针对刚才谈到的类对象进行最终的初始化,针对类对象的各种属性进行填充,包括类中的静态成员。如果这个类有父类,而且这个父类没有被加载,那么这个父类也会触发类加载。

6).类加载触发的时机

这里使用懒汉模式,用到哪个类就加载哪个类

1.构造某个类的实例

2.调用/使用类静态属性,静态方法

3.使用某个类的时候,如果这个类的父类还没有加载,那么就会给这个父类触发类加载

2.双亲委派模型

这个模型描述了类加载中,根据全限定类名找到.class文件的过程。

JVM中有专门的模块负责类加载,叫做类加载器。JVM提供了三种类加载器,分别是BootstrapClassLoader,ExtentionClassLoader,ApplicationClassLoader。

它们三个并不是父类子类关系,而是使用parent引用指向。这三个类加载器首当其冲的就是找.class文件

寻找过程

先从ApplicationClassLoader作为入口开始,然后把加载类的过程委托给父类完成

父类ExtentionClassLoader不会立即开始查找,而是把任务委托给它的父类完成

BootstrapClassLoader也想委托给父类,可是它没有父类,只能自己进行类加载,根据类名找标准库范围,是否存在匹配的.class文件

BootstrapClassLoader没有找到就会把任务归还给子类ExtentionClassLoader,接下来ExtentionClassLoader就会进行查找。

ExtentionClassLoader没有找到就会把任务归还给子类ApplicationClassLoader,接下来ApplicaitonClassLoader就会进行查找,没找到就抛出异常。

程序员是可以自定义类加载器的,自定义的时候可以把类加载器放到双亲委派模型当中也可以不放在里面。

3.垃圾回收机制

就是指JAVA释放内存的手段

1.GC如何回收各个区域

1.程序计数器,线程销毁,自然就释放

2.栈,方法执行结束,栈帧就结束,自然就释放

3.元数据区,类对象一般不会释放

4.堆,创建很多对象,会有旧的对象消亡。

说是“回收内存”,本质上是“回收对象”

2.找垃圾

1.引用计数

这个方案是python,php在使用

每个对象在new的时候都会搭配一个小的内存空间,这个空间保存一个整数用来计数,这个整数表示当前有多少个引用指向它。如果引用计数为0,就表示这是个垃圾。

缺点

1.内存消耗得更多,尤其是对象本身比较小时,引用计数消耗的比例就更大

2.可能出现“循环引用”的问题

此时虽然这两个对象引用计数不为0,但是它们没法使用。

2.可达性分析

这个方案是java在使用

1.以代码中的特定对象作为遍历的起点"GCROOT"

这个对象可以是,栈上的局部变量,常量池引用指向的对象,静态成员

2.尽可能进行遍历

判定某个对象是否能遍历到

3.每次访问到一个对象都会把这个对象标记为“可达”,当完成所有对象的遍历之后,没有被标记成“可达”的对象就是“不可达”。一共有多少个对象JVM是知道的,知道哪些是可达的,那么剩下的就是不可达。

可达性分析的过程是周期性的。

3.回收垃圾

1.标记-清除

把垃圾对象的内存直接进行释放,这样做会产生内存碎片问题

这样会导致空闲的内存空间不是连续的,这样是无法申请一个大一些的内存的

2.复制算法

只使用一半的内存空间,当清理垃圾时,把不是垃圾的对象拷贝到另一半,然后整体回收。

这样使用内存的利用率比较低,同时当不是垃圾的对象比较多时,复制的开销大。

3.标记-整理

解决了空间碎片和内存利用率的问题。但是内存搬运的操作开销也比较大。

4.分代回收

这是JAVA使用的方案

当某个对象经过一轮GC之后,它的年龄就会加1

针对不同年龄的对象采取不同的策略

如果某个对象年龄比较大,那么它大概率还会继续存在很久(要死早死了,之所以没死,是因为有特殊之处)

新创建的对象就放到伊甸区,绝大部分伊甸区的对象是活不过第一轮GC的。伊甸区到幸存区使用的是复制算法,因为复制的规模小,开销可控

幸存区的对象也要经历GC的扫描,每一轮GC都会消灭一大部分对象,剩余的对象再经过复制算法复制到另一个幸存区

如果这个对象在幸存区经历了多次复制都存活了下来,就会晋升到老生代,老生代使用的就是标记-整理算法了。

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

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

相关文章

os:进程与线程上

os:进程与线程上 理解进程进程的地址空间进程的抽象:进程控制块进程的用户态和内核态五状态进程模型五状态进程模型转化带挂起的进程状态模型进程调度与切换进程调度进程切换理解进程 举个栗子 程序刚开始执行时,PC的值是m,指向代码段的第一条指令。 问题:如果想要重现…

RISC-V 开发板 MUSE Pi Pro CSI测试,一把点亮ov5647摄像头

视频讲解: RISC-V 开发板 MUSE Pi Pro CSI测试,一把点亮ov5647摄像头 手上正好有一颗ov5674,看了下接口排线都是一致的,硬件条件满足的情况下,剩下的就是驱动软件的问题,直接接上CSI排线 https://bianbu-li…

应用案例 | 集成Docker,解锁 HMI/网关的定制化应用

前言 在当今竞争激烈的工业市场中,企业对于工业自动化系统的个性化需求日益增长。无论是提升生产效率、优化设备管理,还是实现智能化的生产监控,企业都希望拥有能够精准匹配自身业务流程的定制化解决方案。然而,传统HMI/网关设备…

【VLNs篇】03:VLMnav-端到端导航与视觉语言模型:将空间推理转化为问答

栏目内容论文标题End-to-End Navigation with Vision-Language Models: Transforming Spatial Reasoning into Question-Answering (端到端导航与视觉语言模型:将空间推理转化为问答)核心问题如何利用大型视觉语言模型(VLM)实现端到端的机器人…

剧本杀小程序:指尖上的沉浸式推理宇宙

在推理热潮席卷社交圈的当下,你是否渴望随时随地开启一场烧脑又刺激的冒险?我们的剧本杀小程序,就是你掌心的“推理魔法盒”,一键解锁无限精彩! 海量剧本库,满足多元口味:小程序汇聚了从古风权…

[Vue]路径跳转和路由高级设置

路由基础使用看另一篇文章:路由基础使用和路径传参 基本属性 path: /, //主路径,也就是路由路径 alias: [/myfarie], //路径别名,即访问该路径时,也会访问到该资源 name:farie //设置名字,占位符传参时需要使用 component:()>…

LeetCode 76题「最小覆盖子串」

LeetCode 76题「最小覆盖子串」是一道经典的滑动窗口算法题目,难度为困难。题目要求在给定的字符串 s 中找到包含字符串 t 所有字符的最小子串,若不存在则返回空字符串。 题目分析 输入:字符串 s 和 t(均由英文字母组成&#xf…

JMeter-Websocket接口自动化

JMeter-Websocket接口自动化 结构图 1.准备2.实现思路2.1 通过HTTP请求获取token2.2 设置循环控制、断言变量2.3 建立WebSocket连接2.4 设置While循环控制读取CSV文件数据2.4.1 csv文件设置,一般这样设置参数即可变量名称:message,expected_steps 2.5 设…

大模型在闭合性胫骨平台骨折诊疗全流程中的应用研究报告

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型预测原理及数据基础 2.1 大模型概述 2.2 数据收集与处理 2.3 模型训练与优化 三、术前预测与方案制定 3.1 骨折类型及损伤程度预测 3.2 手术时机评估 3.3 手术方案制定 3.4 …

Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位小伙伴们,大家好!今天我们要来一场技术大冒险,手把手教你如何在Linux Ubuntu系统上使用Docke…

【MySQL成神之路】MySQL插入、删除、更新操作汇总

MySQL 插入、删除和更新操作详解 一、插入数据(INSERT) 1. 基本插入语法 2. 插入多行数据 3. 从其他表插入数据 4. 插入NULL值和默认值 二、更新数据(UPDATE) 1. 基本更新语法 2. 使用子查询更新 3. 批量更新注意事项 三、删除数据(DELETE) 1. 基本删除语法 2. 清空…

亚马逊第四个机器人中心将如何降低30%配送成本?

近年来,亚马逊越来越依赖自动化技术来提升仓储效率和配送速度。2024年,亚马逊宣布其全球第四个机器人中心在美国正式投入运营,这一中心将成为改变供应链策略的新变量。据亚马逊官方消息,这一机器人中心有望帮助公司进一步削减运营…

MongoDB大数据量的优化——mongoTemplate.stream()方法使用

传统查询 在传统的 MongoDB 查询中&#xff0c;我们通常使用find方法&#xff1a; List<Document> results mongoTemplate.find(query, Document.class, "collection");这种方式会直接将查询结果全部加载到内存中&#xff0c;当数据量较大&#xff08;如百万…

JDK8中的 Stream流式编程用法优化(工具类在文章最后)

Java从JDK8起提供了Stream流这个功能&#xff0c;于是项目里出现了大量基于Stream流的写法。随着项目的进行&#xff0c;慢慢的代码中铺天盖地的都是下面的写法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

Spring Cloud生态与技术选型指南:如何构建高可用的微服务系统?

引言&#xff1a;为什么选择Spring Cloud&#xff1f; 作为全球开发者首选的微服务框架&#xff0c;Spring Cloud凭借其开箱即用的组件、与Spring Boot的无缝集成&#xff0c;以及活跃的社区生态&#xff0c;成为企业级微服务架构的基石。但在实际项目中&#xff0c;如何从众多…

Android清单文件

清单文件AndroidManifest.xml AndroidManifest.xml 配置清单文件是 每个 Android 应用的配置中心&#xff0c;系统在安装和运行应用时&#xff0c;首先会读取它。 它是 Android 应用的 “说明书”&#xff0c;主要作用是&#xff1a; 功能说明声明应用组件比如 Activity、Se…

大语言模型与人工智能:技术演进、生态重构与未来挑战

目录 技术演进:从专用AI到通用智能的跃迁核心能力:LLM如何重构AI技术栈应用场景:垂直领域的技术革命生态关系:LLM与AI技术矩阵的协同演进挑战局限:智能天花板与伦理困境未来趋势:从语言理解到世界模型1. 技术演进:从专用AI到通用智能的跃迁 1.1 三次技术浪潮的跨越 #me…

SC3000智能相机-自动存图

1、需求:SC3000智能相机开机自动存图。相机自带的相机存储空间有限,预留存图需要开启SCMVS、并手动点存图。如果工人忘了开启则不会存图,导致生产严重失误! 2、方法:利用相机提供的FTP协议,将图自动存到本地。 1、在本地建立FTP服务器。 (1)win10默认开启了FTP服务器…

Wan2.1 文生视频 支持批量生成、参数化配置和多语言提示词管理

Wan2.1 文生视频 支持批量生成、参数化配置和多语言提示词管理 flyfish 设计 一个基于 Wan2.1 文本到视频模型的自动化视频生成系统。 文件关系图 script.py ├── 读取 → config.json │ ├── 模型配置 → 加载AI模型 │ ├── 生成参数 → 控制生成质量 │ └…

Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)

在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时&#xff0c;我们提到 flannel.1 是一个 TUN 设备&#xff0c;它在数据包处理中起到了关键作用。 什么是 TUN 设备&#xff1f; TUN 设备&#xff08;Tunnel 设备&#xff09;是 Linux 系统中一种虚拟网络接口&#x…