当前位置: 首页 > news >正文

JVM详解:垃圾回收机制

java作为大型服务开发的主流语言,其运行会占用大量的内存空间,那么合理的使用有限的服务器资源至关重要。和大多数翻译性语言一样,java的运行环境jvm也内置垃圾回收机制,其通过一些合理的算法组合,定时来对堆中保存的不可达的临时实例进行清除,来保证运行环境的内存空间。

首先我们要清楚,一切的垃圾回收都是针对于堆内存的,堆内存的作用是存储所有的临时对象(即使其可能存活时间较长),而垃圾回收则是查看这些临时对象时候到了可以被清除的时候。

垃圾回收算法

jvm中的垃圾回收设计多种算法的组合使用,具体如下:

1. 标记清除法

标记清除法通过从根节点开始,寻找实例对象引用,并进行标记,而对于未被标记的实例对象则会在清除阶段进行清除。根节点并非只有一个,java代码中,或jvm中存在的生命周期和jvm声明周期一致的内存引用都有可能垃圾回收寻找并标记对象的根节点,如方法中初始化的一个实例,静态变量,方法区中常量池中的常量,线程对象,jvm中保存的一些实例等。

在这里插入图片描述

2. 标记整理法

整理算法的原理简单,但不好口述。首先整理算法也需要对所有可达对象进行标记,过程和标记清除法一直,而整理阶段,整理算法是从内存的两侧开始查找,一侧查找没有被标记的可删除或已经删除当空闲的区域,而另一侧则查找被标记的可达对象,将可达对象放入覆盖可删除或已经删除的空闲区域,当两侧查找到相同位置时,则证明查找完成,所有的可达对象都已经被整理到了内存的一侧,而另一侧将被全部清除。
在这里插入图片描述

3. 复制算法

复制算法的原理更加简单,且高效,但代价是只能使用一半的内存空间。复制算法将堆内存分为两个部分,其中一侧为活动区,一侧为空闲区,活动区的内存正常保存对象实例,而空闲区完全空闲。当垃圾回收开始时,依旧会查找互动区的可达对象,不同的时此时不会执行标记操作,而是直接将其放入空闲区,等到整个活动区查找完成后,删除活动区的所有内容,活动区和空闲区身份替换,以此类推。

在这里插入图片描述

4. 分代收集算法

分代收集算法相对复杂,其将堆内存分为两个区域,一个是年轻代 (Young Generation),一个是老年代 (Old Generation)。当一个实例被创建时,会被放入年轻代 (Young Generation)中,随着垃圾回收的不断进行,年轻代 (Young Generation)中一部分实例一直存活,当这个次数达到一个阀值时,则认为这个实例可能存活时间较长,则会放入老年代 (Old Generation)中。老年代 (Old Generation)中的垃圾回收频率较低,所以通常使用标记清除法或标记整理法。而年轻代 (Young Generation)会频繁的进行垃圾回收,通常会选择复制算法,确保对java服务的性能影响较小。

年轻代 (Young Generation)中的复制算法和上面说的复制算法有些许不同,年轻代 (Young Generation)中的复制算法将年轻代 (Young Generation)内存分为了两个区域,分别是E区(Eden)和S区(Survivor),其中S区被分为S0和S1,E区永远为活动区,而S区则是一个活动区一个空闲区。当一个实例对象创建时会直接被放入E区。垃圾回收开始时,会扫描E区和S区的活动区中的可达对象,并将可达对象放入S区的空闲区,然后清空E区和S区的活动区。大多数的实例对象在使用一次后就会被销毁,而少部分的存活对象则被保存在S区中等待被清除或进入老年代 (Old Generation)。通过这种方式不仅有效的节省内存,而切还能够利用到复制算法的高效性,提高性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

操作系统通过分页解决了外部碎片问题,但这不意味着jvm的内存就没有外部碎片问题了,因为操作系统操作的是真实的内存地址,而jvm操作的是虚拟的连续内存地址,如果对这一块不了解,可以看我的操作系统相关文章。

标记清楚法会引起外部碎片问题,而标记整理和复制算法都不会,图片画的很清晰了,这里就不说了。

垃圾回收器(GC)

对于不同的垃圾回收算法的合理利用,可以出现不同的效果,jvm提供了多种垃圾回收器,需要根据实际情况选择最合适的一款使用。所有的垃圾回收机都会使用分代收集算法,但具体实现有一些不同。

了解GC之间的差异,我们需要了解两个重要的概念,分别的吞吐量和停顿(STW)。吞吐量指的是GC在执行回收工作时用的时间长短,时间越少证明吞吐量就会越高,而停顿则是说停止用户线程的时间。说到这就有了第一个嗯题,为什么要停止用户线程,用户线程和GC之间两个线程执行不就可以了吗?

无论是用户线程,还是GC线程,都是在操作堆中的对象实例,而处理两个线程对于堆中实例的操作都是耗时操作,所以有的GC为了维持垃圾回收时间更短,则会选择直接将线程停止,然后专心进行垃圾回收,这样会让整体效率变高,但用户侧会感受到明显卡顿。有的GC则相反。

针对这两个概念,我们就可以了解各个GC的区别,并择优选择合适的GC。

1. Serial GC(串行垃圾回收器)

串行垃圾回收器的所有工作是在一个线程中完成,并且会在垃圾回收的整个过程暂停用户线程的进行。其在老年代中使用的标记整理算法,新生代中使用复制算法。

其资源消耗最少,但吞吐量低,停顿时间长,在小型服务,并且资源有限的情况下可以尝试。

2. Parallel GC(并行垃圾回收器)

并行垃圾回收器采用多线程垃圾回收机制,其致力于提高吞吐量,而不管停顿时间。新生代采用的复制算法,老年代采用的标记整理法。这种架构使得其可以更快的垃圾回收速度,但用户停顿感依旧明显,停顿时间较长

3. CMS GC(Concurrent Mark-Sweep,标记清除回收器)

不同于其他的GC,CMS致力于老年代的区域回收,其新生代的回收依赖于并行垃圾回收器的新生代垃圾回收器部分。也就是说CMS老年代使用自身的标记清除法,而新生代则使用并行垃圾回收器的复制算法。

CMS致力于缩短用户线程的停顿时间,也就是说在CMS对老年代进行垃圾回收时,会尽可能的让用户线程与垃圾回收线程一同执行,其具体操作主要分为初始标记,并发标记,重新标记以及并发清除四个阶段:

  • 初始标记;初始标记时使用单线程标记根节点
  • 并发标记:并发标记是使用多线程,从根节点开始,标记可达实例。此步骤和用户线程同时执行。
  • 重新标记:重新标记是使用多线程对修改的引用,重新标记。此步骤需要讲用户线程暂停,但由于是对修改过的引用重新标记,所以停顿时间较短。
  • 并发清除:多线程并发清除不可达实例。无需暂停用户线程。

重新标记时是如何知道哪些引用被修改过呢?

JVM在管理自身的虚拟内存时使用和操作系统相同的分页管理模式,在JVM中称其为卡片,JVM使用了卡表记录每一个卡片的初始引用,类似于操作系统的页表。当一个实例修改时,会触发JVM的写屏障,会将修改的目标卡片在页表中标记为脏。比如A引用B改为了A引用C,那么A所在的卡片就会标记为脏。在重新标记时就会顺着A再次查找,标记C为可达引用,防止被垃圾回收器清除

4. G1 GC(Garbage First)

相较于其他的垃圾回收器,G1的机制相对来说比较复杂。其并不在简单的区分堆内存为新生代还是老年代,而是将整个堆内存分为若干份,每一份都可能是老年代,Eden区或S区。G1针对这些区域垃圾回收分为三种类型,分别是新生代垃圾回收,混合垃圾回收,全局回收。

1. 新生代垃圾回收

触发时机

当存在新生代Eden区占用内存为满时,则会触发新生代回收。

原理

新生代回收只会对Eden区以及S区实例进行回收,整个过程为复制算法,将E区复制到S区,删除E区,S区到达一定次数后转移至老年区,但和其他时候不同的时,转移到老年区的实例会被立即标记为可达,后续会说原因

3. 混合垃圾回收

触发时机

混合垃圾回收的触发条件时老年代空间使用率大于一半时触发。

原理

混合垃圾回收会将新生代和老年代一起进行回收,对于新生代则是和新生代垃圾回收一致,全部进行扫描回收。而对于老年代,则会对扫描结果进行排序,清理垃圾比例靠前的若干老年代。

垃圾混合回收的扫描和清除阶段也是分开的,触发时机不同。老年代内存利用率为一半时只会触发清理,只有当整个堆内存利用率为一半时,才会触发标记扫描,而老年代清除则是不断复用上一次的扫描结果,这也是为什么转移到老年代的实例会被立即标记为可达的原因,方式新的老年代实例被误删。整个标记过程和CMS基本一致。

3. 全局清除

触发时机

全局清除的触发时机有多种可能,如堆内存耗尽,混合垃圾回收并没有将老年代内存利用率控制住,老年代内存爆满等等,总结来说就是当堆内存已经快要饱满,可能无法正常工作的极端情况才会使用全局清除,全局清除会造成较长时间的停顿,JVM会尽量避免使用全局清除。

以上四种GC是在Java8中可以使用的,其中G1在Java8中为实验性GC,除此之外还有ZGC(Z Garbage Collector)和Shenandoah GC其在Java11中才可以使用。这里暂时先不说了。

相关文章:

JVM详解:垃圾回收机制

java作为大型服务开发的主流语言,其运行会占用大量的内存空间,那么合理的使用有限的服务器资源至关重要。和大多数翻译性语言一样,java的运行环境jvm也内置垃圾回收机制,其通过一些合理的算法组合,定时来对堆中保存的不…...

【单片机的结构和组成】

目录 1、中央处理单元(CPU):2、存储器:3、输入/输出(I/O)接口:4、定时器/计数器:5、模拟-数字转换器(ADC):6、数字-模拟转换器(DAC&am…...

上下文信息、全局信息、局部信息

摘要 在计算机视觉中,上下文信息(contextual information)是一个核心概念,它指的是一个像素或一个小区域周围的环境或背景信息。这种信息对于模型理解图像中对象的相对位置、大小、形状,以及与其他对象的关系至关重要…...

Ansible--自动化运维工具

Ansible自动化运维工具介绍 1.Ansible介绍 Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。…...

【每日一题】142.环形链表II

最近有点懈怠了,因为连续出差,身心俱疲,实在是没有空做题。 这道题的思路是快慢指针,需要对环形的链表进行数学公式的计算。 根据这个公式可以推断出一个数学结论,当快慢指针相遇的时候,快指针从起点再出发…...

YOLO系列论文综述(从YOLOv1到YOLOv11)【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】

目录 1 前言2 YOLO在不同领域的应用3 物体检测指标和NMS3.1 mAP和IOU3.2 mAP计算流程3.2.1 VOC 数据集3.2.2 微软 COCO 数据集 3.3 NMS 1 前言 最近在做目标检测模型相关的优化,重新看了一些新的论文,发现了几篇写得比较好的YOLO系列论文综述&#xff0…...

TailwindCss 总结

目录 一、简介 二、盒子模型相关 三、将样式类写到一个类里面apply 四、一款TailWind CSS的UI库 一、简介 官方文档:Width - TailwindCSS中文文档 | TailwindCSS中文网 Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类…...

【开源项目】2024最新PHP在线客服系统源码/带预知消息/带搭建教程

简介 随着人工智能技术的飞速发展,AI驱动的在线客服系统已经成为企业提升客户服务质量和效率的重要工具。本文将探讨AI在线客服系统的理论基础,并展示如何使用PHP语言实现一个简单的AI客服系统。源码仓库地址:ym.fzapp.top 在线客服系统的…...

MySQL原理简介—11.优化案例介绍

大纲 1.禁止或改写SQL避免自动半连接优化 2.指定索引避免按聚簇索引全表扫描大表 3.按聚簇索引扫描小表减少回表次数 4.避免产生长事务长时间执行 1.禁止或改写SQL避免自动半连接优化 (1)业务场景介绍 (2)SQL性能问题分析 (3)SQL性能调优 (1)业务场景介绍 某互联网公司…...

Http 响应协议

HTTP的响应协议 响应数据格式 响应行 响应数据的第一行,包括协议、状态码、描述 响应头 从响应数据格式的第二行开始,也是以key:value的格式 响应体 和响应头之间有一个空行,是响应数据格式的最后一部分,用于存放响应的数据 常见响…...

实现 Browser 客户端下载 XML 文件功能

后端 使用 io.BytesIO 方法 创建一个字节缓冲区在不需要磁盘文件的情况下进行文件操作打包为 zip 压缩包(上图代码)in_memory_zip.seek(0) 数据写入ZIP后文件指针会停留在缓冲区的末尾将文件指针重置回开头make_response() 方法用于创建HTTP响应的函数.g…...

Matlab以一个图像分类例子总结分类学习的使用方法

目录 前言 导入数据 训练学习 导出训练模型 仿真测试 总结 前言 最近在尝试一些基于Simulink的边沿AI部署,通过这个案例总结Matlab 分类学习功能的使用。本案例通过输入3000张28*28的灰度图像,训练分类学习模型。并验证训练好的模型最后部署到MCU。 导入数据 如下图是…...

AI-agent矩阵营销:让品牌传播无处不在

矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...

HDMI转VGA方案 LT8612UX(HDMI2.0) LT8612SX LT8511EX LT8522EX LT8612EX_e(HDMI1.4)

一、产品概述 LT8612UX是一款高性能的HDMI至HDMI&VGA转换器,由龙迅半导体公司推出。它能够将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号,同时输出8通道I2S和SPDIF信号,实现高质量的7.1声道音频。该转换器采用最新的ClearEdge技术&…...

零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu

1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统, 内核是Linux操作系统, 具有Ubuntu特色的可视…...

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中,车牌识别(LPR)技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力,为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…...

第二十二课 Vue中的组件切换

Vue中的组件切换 :is 操作符可以用于组件的切换&#xff0c;配合component标签可以实现根据不同的组件名进行组件的切换效果 组件切换实例 1&#xff09;:is与component实现组件切换 <div id"app"><button click"checks()">点击切换组件&l…...

抖音短视频矩阵源代码部署搭建流程

抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力&#xff0c;以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...

【Linux】线程同步与互斥

文章目录 1. 线程互斥1.1 进程线程间的互斥相关背景概念1.2 互斥量mutex1.3 相关操作1.4 互斥量实现原理1.5 互斥量的封装 2. 线程同步2.1 条件变量2.2 生产者消费者模型2.3 基于BlockingQueue的生产者消费者模型2.4 信号量2.5 基于环形队列的生产消费模型 3. 线程池3.1 日志3.…...

设计模式-原型模式

背景 克隆羊&#xff1a;有一只羊&#xff0c;有各种属性&#xff1a;姓名&#xff0c;年龄……&#xff0c;现在要克隆10只和这只羊一模一样的羊。 传统方法&#xff1a; 定义一个羊类&#xff0c;在客户端调取原型羊的信息&#xff0c;根据信息创建10个属性相同的羊。 问…...

异或操作解决一些问题

前提&#xff1a; 异或操作符合交换律&#xff0c;结合律&#xff08;因为其根本上来抽象理解&#xff0c;就是查看所有项二进制数相同位是否有奇数个1&#xff0c;对运算结果二进制数而言&#xff0c;没有该位为0&#xff0c;有该位为1&#xff0c;与顺序无关&#xff09;。 …...

Rust中Tracing 应用指南

欢迎来到这篇全面的Rust跟踪入门指南。Rust 的tracing是一个用于应用程序级别的诊断和调试的库。它提供了一种结构化的、异步感知的方式来记录日志和跟踪事件。与传统的日志记录相比&#xff0c;tracing能够更好地处理复杂的异步系统和分布式系统中的事件跟踪&#xff0c;帮助开…...

Java与C#

Java和C#&#xff08;C Sharp&#xff09;是两种流行的面向对象编程语言&#xff0c;它们在很多方面非常相似&#xff0c;因为它们都受到了类似的编程范式和语言设计理念的影响。然而&#xff0c;它们之间也存在一些重要的区别。 平台依赖性&#xff1a; Java&#xff1a;Java是…...

Docker 部署 MongoDB

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode&#x1f4ab; Gitee &#x1f…...

【C语言】字符串左旋的三种解题方法详细分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;方法一&#xff1a;逐字符移动法&#x1f4af;方法二&#xff1a;使用辅助空间法&#x1f4af;方法三&#xff1a;三次反转法&#x1f4af;方法对…...

Android导出Excel

poi org.apache.poi:poi-ooxml:4.x&#xff1a; 不支持Android使用&#xff0c; 不支持原因&#xff1a;Android底层库不支持xml所需的bean类&#xff0c;使用即报错only supported starting with Android O (–min-api 26) org.apache.poi:poi-ooxml:5.2.0&#xff1a; 支持A…...

【学术讲座】视觉计算中的深度学习方法 AIGC图像视频生成模型的推理加速

视觉计算中的深度学习方法 发展历程 backbone 强化学习、LLM等&#xff1a;有监督 && 无监督的结合 目标检测 图像分割 网络结构搜索 搜索方法 1&#xff1a;强化学习 2&#xff1a;强化学习 3&#xff1a;梯度算法 结构选择的作用 1&#xff1a;开放环境感知网络…...

华为OD机试真题---智能驾驶

华为OD机试中的“智能驾驶”题目是一道涉及广度优先搜索&#xff08;BFS&#xff09;算法运用的题目。以下是对该题目的详细解析&#xff1a; 一、题目描述 有一辆汽车需要从m * n的地图的左上角&#xff08;起点&#xff09;开往地图的右下角&#xff08;终点&#xff09;&a…...

视频质量评价SimpleVQA

目录 一、研究意义例子 二、介绍三、文章解读3.1 论文动机3.2论文思路3.3方法3.3.1网络框架3.3.2公式解读3.3.3核心创新3.3.4理解 &#xff01;&#xff01;&#xff01;作者对模型的改进本人算法框体视频抽帧美学特征提取网络&#xff1a;3.3.5实验细节&#xff1a; 四、代码复…...

浏览器插件基于nativeMessaging通信

上一篇文章介绍了基于nativeMessaging启动本地程序&#xff0c;使用官方demo是支持双向通信&#xff0c;demo启动的程序是python写的&#xff0c;现在基于Qt程序进行说明。 消息传递协议 Chrome 会在单独的进程中启动每个原生消息传递主机&#xff0c;并使用标准输入 (stdin)…...

解决 MySQL 8.x 身份验证问题的最佳实践20241126

MySQL 8.x 身份验证问题的深入解析与实践解决方案 &#x1f3af; 引言 &#x1f58b;️ MySQL 是全球最受欢迎的开源数据库之一&#xff0c;随着 MySQL 8.x 的发布&#xff0c;引入了更安全的身份验证插件 caching_sha2_password&#xff0c;显著提升了数据库的安全性和性能。…...

对于GC方面,在使用Elasticsearch时要注意什么?

大家好&#xff0c;我是锋哥。今天分享关于【对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; 对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…...

各种排序算法

前置知识 排序: 按照递增或者递减的顺序把数据排列好 稳定性: 值相等的元素在排序之后前后顺序是否发生了改变 内部排序: 数据放在内存上 外部排序: 数据放在磁盘上 内部排序 基于比较的排序 几大排序算法 1. 堆排序 特点: 思想: 1. 创建大根堆,把所有元素放在大根堆里…...

前端-Git

一.基本概念 Git版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…...

用nextjs开发时遇到的问题

这几天已经基本把node后端的接口全部写完了&#xff0c;在前端开发时考虑时博客视频类型&#xff0c;考虑了ssr&#xff0c;于是选用了nextJs&#xff0c;用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…...

Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

yum install 报错: Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#xff0c;无法连接&#xff0c;需要替换为阿里云。 cd /etc/yum.repos.d/ 找到 CentOS-SCLo-scl.repo 和…...

HCIA笔记3--TCP-UDP-交换机工作原理

1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间&#xff1f; &#xff08;a&#xff09; 为了实现可靠的关闭 &#xff08;b&#xff09;为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…...

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…...

C语言指针作业

//8-29 第八章作业 //3.输入10个整数,将其中最小的数第一个数对换,把最大的数与最后一个数对换 //写3个函数:①输人10个数;②进行处理;③输出10个数。 //①输人10个数&#xff0c; //方法一&#xff1a;数组索引 void main() {int arr[10];int *p arr;//printf("请输入…...

区块链:比特币-Binance

写在前面&#xff1a;相对于Tran和BNB而言&#xff0c;Binance不支持智能合约&#xff1b;大约每 10分钟 生成一个新区块 一、认识Binance 官方网站&#xff1a;Blockchain Explorer - Bitcoin Tracker & More | Blockchain.com 官方文档&#xff1a;Authentication – I…...

数据工程流程

** 数据工程流程图** #mermaid-svg-ArT55xCISSfZImy3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ArT55xCISSfZImy3 .error-icon{fill:#552222;}#mermaid-svg-ArT55xCISSfZImy3 .error-text{fill:#552222;stroke…...

使用Python和Pybind11调用C++程序(CMake编译)

目录 一、前言二、安装 pybind11三、编写C示例代码四、结合Pybind11和CMake编译C工程五、Python调用动态库六、参考 一、前言 跨语言调用能对不同计算机语言进行互补&#xff0c;本博客主要介绍如何实现Python调用C语言编写的函数。 实验环境&#xff1a; Linux gnuPython3.10…...

基于springboot的县市级土地使用监控系统的设计与实现

文末获取本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;文末可获取&#xff0c;系统界面在最后面。 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的…...

Hot100 - 最大子数组和

Hot100 - 最大子数组和 最佳思路&#xff1a;动态规划 时间复杂度&#xff1a;O(n) 代码&#xff1a; class Solution {public int maxSubArray(int[] nums) {int sum 0;int ans Integer.MIN_VALUE;for (int i 0; i < nums.length; i) {// 如果 sum > 0&#xff0c…...

Matlab 深度学习 PINN测试与学习

PINN 与传统神经网络的区别 与传统神经网络的不同之处在于&#xff0c;PINN 能够以微分方程形式纳入有关问题的先验专业知识。这些附加信息使 PINN 能够在给定的测量数据之外作出更准确的预测。此外&#xff0c;额外的物理知识还能在存在含噪测量数据的情况下对预测解进行正则…...

[STM32]从零开始的STM32 FreeRTOS移植教程

一、前言 如果能看到这个教程的话&#xff0c;说明大家已经学习嵌入式有一段时间了。还记得嵌入式在大多数时候指的是什么吗&#xff1f;是的&#xff0c;我们所说的学习嵌入式大部分时候都是在学习嵌入式操作系统。从简单的一些任务状态机再到复杂一些的RTOS&#xff0c;再到最…...

软件团队的共担责任

问责制被认为是个人与其社会系统之间的纽带&#xff0c;它创造了一种将个人与其行为和绩效联系起来的身份关系。在入门系列的第一篇文章《超越工具和流程&#xff1a;成功软件开发团队的策略》中&#xff0c;我们介绍了问责制的概念&#xff0c;并提出了以下定义&#xff1a; …...

代码美学:MATLAB制作渐变色

输入颜色个数n&#xff0c;颜色类型&#xff1a; n 2; % 输入颜色个数 colors {[1, 0, 0], [0, 0, 1]}; createGradientHeatmap(n, colors); 调用函数&#xff1a; function createGradientHeatmap(n, colors)% 输入检查if length(colors) ~ nerror(输入的颜色数量与n不一…...

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…...

大模型中常见的微调方法有哪些?

我整理了1000道算法面试题&#xff1a; 获取 这里说的微调主要是指参数微调&#xff0c;参数微调的方法主要有以下几种&#xff1a; - Adapter 在预训练模型每一层(或某些层)中添加Adapter模块(如上图左侧结构所示)&#xff0c;微调时冻结预训练模型主体&#xff0c;由Ada…...