Jvm基础(一)
目录
- JVM是什么
- 运行时数据区域
- 线程私有
- 1.程序计数器
- 2.虚拟机栈
- 3.本地方法栈
- 线程共享
- 1.方法区
- 2.堆
- 二、对象创建
- 1.给对象分配空间
- (1)指针碰撞
- (2)空闲列表
- 2.对象的内存布局
- 对象的组成
- Mark Word
- 类型指针
- 实例数据:
- 对齐填充
- 对象的访问定位
- 句柄法
- 三、垃圾收集器和内存分配策略
- 1.那些内存需要回收?
- 2.什么时候回收
- 《1》怎么判断对象死没死?
- (1) 引用计数法,我称其为(脑门刻字法)
- (2) 可达性分析算法,我称其为(平地长树法)
- 《2》再谈引用
- 强引用
- 软引用
- 弱引用
- 虚引用
- 3.如何回收
- 垃圾收集理论基础
- 垃圾收集算法
- 标记-清除
- 标记-复制
- 标记-整理
- 经典的垃圾收集器
- CMS收集器(Concurrent Mark Sweep)
- 步骤
- G1收集器
- 步骤
JVM是什么
Java虚拟机(Java Virtual Machine),用来运行.class的字节码文件。
运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。如果程序书写不当会出现OutOfMemory Error内存溢出
线程私有
线程私有的数据区域,生命周期和线程相同
1.程序计数器
是当前线程所执行的字节码文件的行号指示器,此区域是Jvm规范中唯一不会出现OOM(OutOfMemory Error)的区域
2.虚拟机栈
存放的元素是栈帧
栈帧:每个方法被执行的时候Java虚拟机会创造一个栈帧,用于存放局部变量表、动态连接、方法出口等信息。每个方法的调用过程,就是栈帧从入栈到出栈的过程。
局部变量表:存储程序编译的时候的基本数据类型,和对象引用,内部以 局部变量槽(Slot) 作为存储单位,64位长度的数据类型会占用两个变量槽的方式,其余数据类型均只占用一个 局部变量槽 。
3.本地方法栈
什么是本地方法?
本地方法就是不使用java编写的,比如C++编写的程序,只是需要传递参数。
线程共享
1.方法区
实现: 一般处于堆中的永久代
目的: 已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
元空间:位置在本地内存,jdk8以后把方法区中的信息全部转移到了元空间
2.堆
目的:用于存放对象实例
TLAB:(Thread Local Allocation Buffer):在堆中给每个线程一块属于自己的空间用于分配
二、对象创建
1.给对象分配空间
(1)指针碰撞
什么是指针碰撞?
假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump ThePointer)
什么情况下使用指针碰撞?
是否使用指针碰撞为对象分配空间,取决于java堆是否规整,而这又取决于垃圾收集器是否带有空间压缩整理能力。
(2)空闲列表
什么时候使用空闲列表
Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起
什么是空闲列表?
虚拟机维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。
2.对象的内存布局
对象的组成
对象由对象头、实例数据,对齐填充三部分组成,重点介绍一下对象头
首先对象头由:Mark Word和类型指针(指向对象类信息的一个指针)组成,如果对象是数组,那么对象头中还有一部分用来存放数组长度的区域。
Mark Word
**什么是Mark Word **
Mark Word是一个有着动态定义的数据结构,是用于存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等
例如
Mark Word的32个比特存储空间中的25个比特用于存储对象哈希码,4个比特用于存储对象分代年
龄,2个比特用于存储锁标志位,1个比特固定为0

如下:

类型指针
是一个指向对象所在类的指针
实例数据:
对象真正存储的用用信息
对齐填充
不是必然存在的,起到占位符的作用,使得对象的整个长度为8字节的整数倍
对象的访问定位
句柄法
句柄池:在java堆中划分出一部分
句柄法:Java栈本地变量表中的reference-----》句柄池------》方法区中的创建对象的类/对象实例数据

直接指针:Java栈本地变量表中的reference指向对象实例数据指向方法区中的创建对象的类

优点:访问少一次指针定位
缺点:如果很多reference都指向了一个对象实例,那么要更改对象实例的地址的时候,需要更改很多个reference
三、垃圾收集器和内存分配策略
1.那些内存需要回收?
堆和方法区
2.什么时候回收
简单来说是回收死亡的对象
《1》怎么判断对象死没死?
(1) 引用计数法,我称其为(脑门刻字法)
描述:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一(在脑门上刻的字加1);当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
缺点: 难以解决对象之间相互引用的问题
(2) 可达性分析算法,我称其为(平地长树法)
描述:可以使用引用链连接到GC Roots(地面)的对象,可以认为其是长在地上,该对象不会被回收,只有使用引用链连接不到GC Roots的对象(无根浮萍)才是需要被回收的。
可以被认为是GC Roots的对象
| 项目 | 例子 |
|---|---|
| ·在虚拟机栈(栈帧中的本地变量表)中引用的对象 | 譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。 |
| ·在方法区中类静态属性引用的对象 | 譬如Java类的引用类型静态变量。 |
| ·在方法区中常量引用的对象 | 譬如字符串常量池(String Table)里的引用。 |
| ·在本地方法栈中JNI(即通常所说的Native方法)引用的对象。 | |
| ·Java虚拟机内部的引用 | 如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。 |
| ·所有被同步锁(synchronized关键字)持有的对象。 | |
| ·反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。 |
《2》再谈引用
强引用
例子“Object obj=new Object()
只要强引用还在就垃圾收集器就永远不会被不回收
软引用
生命周期: 系统将要发生内存溢出时回收
描述对象: 还有用,但非必须的对象
例子
SoftReference<String> sr = new SoftReference<String>(new String("hello"));
System.out.println(sr.get());
弱引用
生命周期: 垃圾收集器一工作就会被回收
描述对象 : 非必须对象,但是它的强度比软引用更弱一些
例子
WeakReference<String> sr = new WeakReference<String>(new String("hello"));System.out.println(sr.get());System.gc(); //通知JVM的gc进行垃圾回收System.out.println(sr.get());
虚引用
作用:被虚引用的对象在被垃圾收集器回收时会收到一个系统通知
3.如何回收
垃圾收集理论基础
强分代假说: 熬过越多次垃圾收集过程的对象就越难以消亡。
弱分带假说: 绝大多数对象都是朝生夕灭的
跨带引用理论假说: 跨带引用相对于同代引用来说仅占极少数。
垃圾收集算法
标记-清除
步骤:
算法分为“标记”和“清除”两个阶段:
首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,
也可以反过来,标记存活的对象,统一回收所有未被标记的对象。
缺点:
1.执行效率不稳定
2.内存碎片化严重
优点:
简单高效
标记-复制
算法描述
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
优点: 简单高效
缺点: 是将可用内存缩小为了原来的一半

标记-复制算法的改进
改进理论: 针对具备“朝生夕灭”特点的对象,提出了一种更优化的半区复制分代策略,现在称为 “Appel式回收” 。
应用区域: 主要用于新生代收集器。
Appel式回收的具体做法:
是把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1,也即每次新生代中可用内存空间为整个新生代容量的90%(Eden的80%加上一个Survivor的10%),只有一个Survivor空间,即10%的新生代是会被“浪费”的。当然,98%的对象可被回收仅仅是“普通场景”下测得的数据,任何人都没有办法百分百保证每次回收都只有不多于10%的对象存活,因此Appel式回收还有一个充当罕见情况的“逃生门”的安全设计,当Survivor空间不足以容纳一次Minor GC之后存活的对象时,就需要依赖其他内存区域(实际上大多就是老年代)进行分配担保(Handle Promotion)。
分配担保: 存活数量超过Survivor的话,存活对象直接进入老年代
标记-整理
算法描述: 标记所有存活对象,让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存

经典的垃圾收集器
CMS收集器(Concurrent Mark Sweep)
目的: 以获取最短回收停顿时间为目标的
基于标记-清除算法实现的
缺点:
1.CMS收集器对处理器资源非常敏感(和用户线程并发运行)
2.无法处理“浮动垃圾”(Floating Garbage)
3.会有大量空间碎片产生。
4.:要是CMS运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次“并发失败”,会冻结用户线程的执行,临时启用Serial Old收集器来重新进行老年代的垃圾收集,导致停顿时间就很长了。
步骤
(1)初始标记(CMS initial mark)
(2)并发标记(CMS concurrent mark)
(3)重新标记(CMS remark)
(4)并发清除(CMS concurrent sweep)
由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
G1收集器
**实现方式:**收集器面向局部收集的设计思路和基于Region的内存布局形式。
主要面向服务端应用的垃圾收集器。
面向局部收集
基于Region
通过原始快照(SATB)算法来实现的
步骤
(1)初始标记
(2)并发标记
(3)最终标记
(4)筛选收回
相关文章:
Jvm基础(一)
目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据:对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…...
深入理解FFmpeg--软/硬件解码流程
FFmpeg是一款强大的多媒体处理工具,支持软件和硬件解码。软件解码利用CPU执行解码过程,适用于各种平台,但可能对性能要求较高。硬件解码则利用GPU或其他专用硬件加速解码,能显著降低CPU负载,提升解码效率和能效。FFmpe…...
新的铸造厂通过 PROFIBUS 技术实现完全自动化
钢铁生产商某钢以其在厚钢板类别中极高的产品质量而闻名。其原材料(板坯连铸机)在钢铁厂本地生产,该厂最近新建了一座垂直连铸厂。该项目的一个主要目标是从一开始就完全自动化这座新工厂和整个铸造过程,以高成本效率实现最佳产品…...
【UE5.1】NPC人工智能——04 NPC巡逻
效果 步骤 一、准备行为树和黑板 1. 对我们之前创建的AI控制器创建一个子蓝图类 这里命名为“BP_NPC_AIController_Lion”,表示专门用于控制狮子的AI控制器 2. 打开狮子蓝图“Character_Lion” 在类默认值中将“AI控制器类”修改为“BP_NPC_AIController_Lion” 3…...
计算机视觉主流框架及其应用方向
文章目录 前言一、计算机视觉领域的主要框架1、深度学习框架1.1、TensorFlow1.2、PyTorch 2、神经网络模型2.1、卷积神经网络(CNN)2.2、循环神经网络(RNN) 二、框架在计算机视觉任务中的应用1、TensorFlow1.1、概述:1.…...
群晖 搭建alist 记录
docker搭建 使用docker-compose 创建一个 docker-compose.yml version: 3.5services:qbittorrent:image: linuxserver/qbittorrent:latestcontainer_name: qbittorrent# network_mode: hostenvironment:- PUID1000- PGID100- TZAsia/Shanghai- WEBUI_PORT8181 # 将外部端口…...
【北航主办丨本届SPIE独立出版丨已确认ISSN号】第三届智能机械与人机交互技术学术会议(IHCIT 2024,7月27)
由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT 2024)将定于2024年7月27日于中国杭州召开。 大会面向基础与前沿、学科与产业…...
深入浅出WebRTC—NACK
WebRTC 中的 NACK(Negative Acknowledgment)机制是实时通信中处理网络丢包的关键组件。网络丢包是常见的现象,尤其是在无线网络或不稳定连接中。NACK 机制旨在通过请求重传丢失的数据包来减少这种影响,从而保持通信的连续性和质量…...
简单工厂模式、工厂模式和抽象工厂模式的区别
简单工厂模式、工厂模式和抽象工厂模式都是创建型设计模式,它们之间在目的、实现方式和适用场景上存在显著的区别。以下是对这三种模式的详细比较: 一、定义与目的 简单工厂模式(Simple Factory Pattern) 定义: 简单工…...
JVM-垃圾回收与内存分配
目录 垃圾收集器与内存分配策略 引用 对象的访问方式有哪些?(句柄和直接指针) Java的引用有哪些类型? 如何判断对象是否是垃圾? 请列举一些可作为GC Roots的对象? 对象头了解吗? mark word(hashcode、分代、锁标志位)、…...
Jolt路线图
1. 引言 a16z crypto团队2024年7月更新了其Jolt路线图: 主要分为3大维度: 1)链上验证维度: 1.1)Zeromorph:见Aztec Labs团队2023年论文 Zeromorph: Zero-Knowledge Multilinear-Evaluation Proofs from…...
NEEP-EN2-2019-Text4
英二-2019-Text4摘自赫芬顿邮报《The Huffington Post》2018年6月的一篇名为“Let’s Stop Pretending Quitting Straws Will Solve Plastic Pollution”的文章。 以下为个人解析,非官方公开标准资料,可能有误,仅供参考。(单词解释…...
docker 部署wechatbot-webhook 并获取接口实现微信群图片自动保存到chevereto图库等
功能如图: docker部署 version: "3" services:excalidraw:image: dannicool/docker-wechatbot-webhook:latestcontainer_name: wechatbot-webhookdeploy:resources:limits:cpus: 0.15memory: 500Mreservations:cpus: 0.05memory: 80Mrestart: alwayspor…...
OpenWrt安装快速入门指南
在刷新 OpenWrt 固件之前,建议进行以下准备: 1、不要急于安装,慢慢来。如果在安装过程中出现奇怪之处,请先找到答案,然后再继续。 2、准备好设备的精确型号,以便能够选择正确的OpenWrt固件。 3、手上有关…...
AIGC Kolors可图IP-Adapter-Plus风格参考模型使用案例
参考: https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus 代码环境安装: git clone https://github.com/Kwai-Kolors/Kolors cd Kolors conda create --name kolors python=3.8 conda activate kolors pip install -r requirements.txt python3 setup.py install…...
从零开始学量化~Ptrade使用教程(七)——期权相关操作
期权交易 可点击证券代码右侧的选,进入期权选择菜单。通过选择标的商品,认购期权和认沽期权中间的选项(包括代码、成交价、幅度%、隐波%、内在价值、时间价值等),以及认购期权或认沽期权,选择所需的期权标的…...
TeamViewer关闭访问密码或固定一组密码不变
TeamViewer的新UI界面变化较大,网上的一些信息已经不再有效,更新后的访问密码在如下图所示: 演示的版本为7.21.4—— 设置每次你的设备访问的密码...
iMazing 3 换手机后苹果游戏数据还有吗 换iPhone怎么转移游戏数据
当你想要更换手机,无论是选择升级到最新款iPhone,或者换到“经典”旧款iPhone,单机游戏数据的转移总是让人发愁。本文将详细介绍换手机后苹果游戏数据还有吗,以及换iPhone怎么转移游戏数据,确保你能无缝继续你的游戏体…...
正则表达式:电子邮件地址的格式详解,及常见正则表达式符号的详细解释和匹配方式
一、第一部分是对该段电子邮件的详解 var Regex /^(?:\w\.?)*\w(?:\w\.)*\w$/; 1.^:这个符号表示匹配输入字符串的开始位置。 2.(?:...):这是一个非捕获组(non-capturing group),用于将正则表达式的一部分组合在…...
AWS全服务历史年表:发布日期、GA和服务概述一览(一)
我一直在尝试从各种角度撰写关于Amazon Web Services(AWS)的信息和魅力。由于我喜欢技术历史,这次我总结了AWS服务发布的历史年表。 虽然AWS官方也通过“Whats New”发布了官方公告,但我一直希望能有一篇文章将公告日期、GA日期&…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

