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都会消灭一大部分对象,剩余的对象再经过复制算法复制到另一个幸存区
如果这个对象在幸存区经历了多次复制都存活了下来,就会晋升到老生代,老生代使用的就是标记-整理算法了。
相关文章:

JVM部分内容
1.JVM内存区域划分 为什么要划分内存区域,JAVA虚拟机是仿照真实的操作系统进行设计的,JVM也就仿照了它的情况,进行了区域划分的设计。 JAVA进程也就是JAVA虚拟机会从操作系统申请内存空间给进程使用,JVM内存空间划分,…...
paddlehub搭建ocr服务
搭建环境: Ubuntu20.041080Ti显卡 由于GPU硬件比较老,是Pascal架构,只能支持到paddle2.4.2版本,更高版本无法支持;同时,因为paddle老版本的依赖发生了变化,有些地方存在冲突,花费了…...

python-leetcode 68.有效的括号
题目: 给定一个只包括“(”),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合,…...
人性的裂痕:社会工程学如何成为网络安全的隐形战场
引言 在技术高度发达的今天,网络安全防护墙看似坚不可摧,但黑客却总能找到一条“捷径”——利用人性的弱点。这种被称为“社会工程学”的攻击手段,不依赖复杂的代码漏洞,而是通过心理操纵和信息欺骗,让受害者主动交出…...
ObservableCollection序列化,和监听链表内元素变化
1.ObservableCollection序列化 情景:定义了A类、B类; A类里面有ObservableCollection<B>类型的属性,假设这个属性名称为BList; ObservableCollection<MotionIntervalSegmentation> motionIntervalSegmentation; [B…...

NLP学习路线图(四):Python编程语言
引言 自然语言处理(Natural Language Processing, NLP)是人工智能领域最引人注目的分支之一。从智能客服到机器翻译,从舆情分析到聊天机器人,NLP技术正在重塑人机交互的边界。本文将结合Python编程语言,带您走进NLP的…...
matlab实现无线通信组
无线通信组网涉及多个节点之间的通信,通常需要考虑节点的布局、信号传输、路径损耗、干扰等问题。在MATLAB中,可以通过模拟节点的位置、信号强度、路径损耗等因素来实现一个简单的无线通信组网程序。 1. 节点布局 首先,我们需要定义网络中的…...
基于单片机的室内采光及可燃气体泄漏报警装置设计
标题:基于单片机的室内采光及可燃气体泄漏报警装置设计 内容:1.摘要 随着人们对室内环境安全和舒适度要求的提高,设计一种能实时监测室内采光和可燃气体泄漏情况并及时报警的装置具有重要意义。本设计基于单片机实现室内采光及可燃气体泄漏报警功能,采用…...

Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
一、问题背景:旧技术的瓶颈 在传统爬虫架构中,我们通常部署任务在本地机器或虚拟机中,搭配定时器调度任务。虽然这种方式简单,但存在以下明显缺陷: 固定IP易被封禁:目标网站如拼多多会通过IP频率监控限制…...

从单体到分布式:深入解析Data Mesh架构及其应用场景与价值
Data Mesh(数据网格)是一种新兴的数据架构范式,旨在解决传统集中式数据平台的可扩展性、敏捷性和治理问题。它强调领域驱动的分布式数据所有权、自助数据平台以及跨组织的协作,使数据成为产品,并通过去中心化的方式提高…...

AI大模型ms-swift框架实战指南(十三):Agent智能体能力构建指南
系列篇章💥 No.文章1AI大模型ms-swift框架实战指南(一):框架基础篇之全景概览2AI大模型ms-swift框架实战指南(二):开发入门之环境准备3AI大模型ms-swift框架实战指南(三)…...

LLM最后怎么输出值 解码语言模型:从权重到概率的奥秘
LM Head Weights(语言模型头部权重):左侧的“LM Head Weights”表示语言模型头部的权重矩阵,它是模型参数的一部分。权重矩阵与输入数据进行运算。Logits(未归一化对数概率):经过与LM Head Weig…...

Leetcode百题斩-回溯
回溯是一个特别经典的问题,也被排在了百题斩的第一部分,那么我们接下来来过一下这个系列。 这个系列一共八道题,偶然间发现我两年前还刷到这个系列的题,回忆起来当时刚经历淘系大变动与jf出走海外事件,大量同事离职闹…...

超小多模态视觉语言模型MiniMind-V 训练
简述 MiniMind-V 是一个超适合初学者的项目,让你用普通电脑就能训一个能看图说话的 AI。训练过程就像教小孩:先准备好图文材料(数据集),教它基础知识(预训练),再教具体技能…...

边缘云的定义、实现与典型应用场景!与传统云计算的区别!
一、什么是边缘云? 边缘云是一种分布式云计算架构,将计算、存储和网络资源部署在靠近数据源或终端用户的网络边缘侧(如基站、本地数据中心或终端设备附近),而非传统的集中式云端数据中心。 核心特征&…...
HarmonyOS 鸿蒙应用开发基础:父组件和子组件的通信方法总结
在鸿蒙开发中,ArkUI声明式UI框架提供了一种现代化、直观的方式来构建用户界面。然而,由于其声明式的特性,父组件与子组件之间的通信方式与传统的命令式框架有所不同。本文旨在详细探讨在ArkUI框架中,父组件和子组件通信的方法总结…...
小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解下
我们将继续计算机视觉内容的讲解。 我们已经知道了计算机视觉,用在什么地方,如何用Pytorch来处理数据,设定一些基础的设置以及模型。下面,我们将要解释剩下的部分,包括以下内容: 主题内容Model 1 :加入非线性实验是机器学习的很大一部分,让我们尝试通过添加非线性层来…...

Scrapy爬取heima论坛所有页面内容并保存到MySQL数据库中
前期准备: Scrapy入门_win10安装scrapy-CSDN博客 新建 Scrapy项目 scrapy startproject mySpider # 项目名为mySpider 进入到spiders目录 cd mySpider/mySpider/spiders 创建爬虫 scrapy genspider heima bbs.itheima.com # 爬虫名为heima ,爬…...
HarmonyOS NEXT~鸿蒙系统下的Cordova框架应用开发指南
HarmonyOS NEXT~鸿蒙系统下的Cordova框架应用开发指南 1. 简介 Apache Cordova是一个流行的开源移动应用开发框架,它允许开发者使用HTML5、CSS3和JavaScript构建跨平台移动应用。随着华为鸿蒙操作系统(HarmonyOS)的崛起,将Cordova应用适配到…...

com.alibaba.fastjson2 和com.alibaba.fastjson 区别
1,背景 最近发生了一件很奇怪的事:我们的服务向第三方发送请求参数时,第三方接收到的字段是首字母大写的 AppDtoList,但我们需要的是小写的 appDtoList。这套代码是从其他项目A原封不动复制过来的,我们仔细核对了项目…...
探索数据结构的时间与空间复杂度:编程世界的效率密码
在计算机科学的世界里,数据结构是构建高效算法的基石。而理解数据结构的时间复杂度和空间复杂度,则是评估算法效率的关键。无论是优化现有代码,还是设计新的系统,复杂度分析都是程序员必须掌握的核心技能。本文将深入探讨这两个重…...
std::ranges::views::stride 和 std::ranges::stride_view
std::ranges::views::stride 是 C23 中引入的一个范围适配器,用于创建一个视图,该视图只包含原始范围中每隔 N 个元素的元素(即步长为 N 的元素)。 基本概念 std::ranges::stride_view 是一个范围适配器,接受一个输…...

了解Android studio 初学者零基础推荐(2)
在kotlin中编写条件语句 if条件语句 fun main() {val trafficLight "gray"if (trafficLight "red") {println("Stop!")} else if (trafficLight "green") {println("go!")} else if (trafficLight "yellow")…...
矩阵短剧系统:如何用1个后台管理100+小程序?技术解析与实战应用
引言:短剧行业的效率革命 2025年,短剧市场规模已突破千亿,但传统多平台运营模式面临重复开发成本高、用户数据分散、内容同步效率低等痛点。行业亟需一种既能降本增效又能聚合流量的解决方案——“矩阵短剧系统”。通过“1个后台管理100小程…...

C# 初学者的 3 种重构模式
(Martin Fowlers Example) 1. 积极使用 Guard Clause(保护语句) "如果条件不满足,立即返回。将核心逻辑放在最少缩进的地方。" 概念定义 Guard Clause(保护语句) 是一种在函数开头检查特定条件是否满足&a…...

MySQL 数据类型深度全栈实战,天花板玩法层出不穷!
在 MySQL 数据库的世界里,数据类型是构建高效、可靠数据库的基石。选择合适的数据类型,不仅能节省存储空间,还能提升数据查询和处理的性能 目录 编辑 一、MySQL 数据类型总览 二、数值类型 三、字符串类型 四、日期时间类型 五、其他…...

前端vscode学习
1.安装python 打开Python官网:Welcome to Python.org 一定要点PATH,要不然要自己设 点击install now,就自动安装了 键盘winR 输入cmd 点击确定 输入python,回车 显示这样就是安装成功了 2.安装vscode 2.1下载软件 2.2安装中文 2.2.1当安…...
自动驾驶传感器数据处理:Python 如何让无人车更智能?
自动驾驶传感器数据处理:Python 如何让无人车更智能? 1. 引言:为什么自动驾驶离不开数据处理? 自动驾驶一直被誉为人工智能最具挑战性的应用之一,而其背后的核心技术正是 多传感器融合与数据处理。 一辆智能驾驶汽车,通常搭载: 激光雷达(LiDAR) —— 3D 环境感知,…...
从电商角度设计大模型的 Prompt
从电商角度设计大模型的 Prompt,有一个关键核心思路:围绕具体业务场景明确任务目标输出格式,帮助模型为运营、客服、营销、数据分析等工作提效。以下是电商场景下 Prompt 设计的完整指南,包含通用思路、模块范例、实战案例等内容。…...
利用 SQL Server 作业实现异步任务处理:一种简化系统架构的实践方案
在中小型企业系统架构中,很多业务场景需要引入异步任务处理机制,例如: 订单完成后异步生成报表; 用户操作后触发异步推送; 后台批量导入数据后异步校验; 跨系统的数据同步与转换。 传统做法是引入消息…...