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

【JVM详解三】垃圾回收机制

一、对象是否存活

  • 强引用:Object obj = new Object(); 只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。在不用对象的时将引用赋值为 null,能够帮助垃圾回收器回收对象。比如 ArrayList 的 clear() 方法实现。
  • 软引用(SoftReference):用来描述一些非必须但还有用的对象。在系统将要发生内存溢出异常时回收,若还没有足够的内存才会OOM。
  • 弱引用(WeakReference):也是用来描述非必须对象,强度比软引用更弱;被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器开始工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
  • 虚引用:也被称为幽灵引用或幻影引用。该引用最弱,一个对象是否有虚引用的存在完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象。为一个对象设置虚引用关联的唯一目的就是能在这个对象被垃圾收集器回收时收到一个系统通知。

1.1 引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能再被使用的。

优点:实现简单,判定效率高。

缺点:假设对象objA和objB都有字段instance,赋值令objA.instance = objB 及 objB.instance = objA,除此之外这两个对象再无任何引用,实际上这两个对象不可能再被访问,但是因为它们互相引用着对方,导致它们的引用计数器都不为0,于是引用计数器无法通知GC收集器回收它们。

1.2 可达性分析算法

基本思路是 通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,它们将会被判定为可回收对象。

GC Roots:一组必须活跃的对象
可作为GC Roots的对象包括以下几种:
  • java虚拟机栈(栈帧中的局部变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象

finalize()赋予对象重生 :

在可达性分析算法中被标记为不可达的对象,也不一定是一定会被回收,它还有第二次重生的机会。每一个对象在被回收之前要进行两次标记,一次是没有关联引用链会被标记一次,第二次是判断该对象是否覆盖finalize()方法,如果没有覆盖则真正的被定了“死刑”。

如果这个对象被jvm判定为有必要执行finalize()方法,那么这个对象会被放入F-Queue队列中,并在稍后由一个由虚拟机自动创建的、低优先级的finalizer线程去执行它。但是这里的“执行”是指虚拟机会触发这个方法,但是**并不代表会等它运行结束。虚拟机在此处是做了优化的,因为如果某个对象在finalize方法中长时间运行或者发送死循环,将可能导致F-Queue队列中其他对象永远处于等待,甚至可能会导致整个内存回收系统崩溃。

如果要在finalize方法中重生这个对象你可以按照下面代码做:

 注意!finalize()方法只会被系统调用一次,多次被gc只有第一次会被调用,因此只有一次的重生机会。

二、垃圾回收算法

2.1 标记-清除算法

算法分 “标记”和“清除”两个阶段:首先标记出所有需要所有需要回收的对象(可达性分析算法),在标记完成后统一回收所有被标记的对象。之所以说是最基础的算法,是因为后续的收集算法基于这种思路并对其不足进行改进而得到的。
不足之处:
  • 效率问题,标记和清除两个过程效率都不高
  • 空间问题,标记清除后会产生大量不连续的内存碎片,可能会导致后续程序运行过程需要分配较大对象时,无法找到足够的连续内存而不得不提前触发一次垃圾回收操作。

2.2 复制算法(年轻代GC)

缺点:对象存活率较高时就要进行更多的复制操作,效率将会变低。

最开始是将可用内存分为大小相等的两块,每次只使用其中一块,当这一块内存用完了,就将还存活的对象复制到另一块上,然后再把已使用的那块内存空间清理掉。

因这种算法代价太大,将可用内存缩小到了原来的一半,所以后续IBM公司研究发现年轻代98%的对象都是“朝生夕死”的,并不需要按1:1划分,所以对算法进行了优化。

上图是优化后的划分。这种划分每次年轻代可用内存达到90%。当我们没有办法保证每次回收都只有不多于10%的对象存活时,需要依赖老年代进行分配担保。

空间分配担保:

     在发生Minor GC(Yong GC)之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象总空间。

           如果大于,则此次Minor GC(Yong GC)是安全的。

           如果小于,jdk1.6之前:则虚拟机会查看 HandlePromotionFailure 设置值是否允许担保失败。如果 HandlePromotionFailure=true ,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。如果大于,则尝试进行一次 Minor GC(Yong GC),但这次Minor GC(Yong GC)依然是有风险的,失败后会重新发起一次 Full GC;如果小于或者HandlePromotionFailure=false,则改为直接进行一次 Full GC。

但是在jdk1.6 update 24之后 -XX:-HandlePromotionFailure 不起作用了,只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MinorGC,否则FullGC。

2.3 标记-整理算法

首先标记出所有需要所有需要回收的对象(可达性分析算法),然后让所有存活对象都向一端移动,然后直接清理端边界以外的内存。

2.4 分代收集算法

根据对象的存活周期将不同的内存划分成几块,一般是把 java 堆划分成年轻代和年老代,这样可以根据各个年代的特点分别采用最适当的收集算法。新生代一般选用复制算法,年老代一般选用“标记---清除”或者“标记---整理”算法。

 核心参数:

  • -XX:NewSize :指定新生代初始大小。
  • -XX:MaxNewSize :指定新生代最大大小。
  • -XX:NewRatio :是年老代 新生代相对的比例,比如NewRatio=2,表明年老代是新生代的2倍。老年代占了heap的2/3,新生代占了1/3。
  • -XX:SurvivorRatio :配置的是在新生代里面Eden和一个Survivor比例。
-XX:SurvivorRatio=8表示新生代的Eden占8/10,S1和S2各占1/10.
  • -XX:MaxTenuringThreshold用来定义年龄的阈值,达到阈值进入年老代。默认15。
  • -XX:PretenureSizeThreshold 的意思是大小超过这个值的时候,对象直接在old区分配内存。
  • -XX:HandlePromotionFailure 设置值是否允许担保失败。jdk1.6后失效。
GC过程:
new 的对象直接进入 Eden 区(对象太大直接进入年老代),Eden 区没有足够空间分配时,发起一次 minor gc :Eden 区和From Survivor空间还幸存的对象拷贝到To Survivor空间,然后清空Eden区和From Survivor空间,然后把To Survivor空间和From Survivor空间名字对换,幸存对象age+1。
当执行 minor gc 时To Survivor空间满了,则Eden区中的对象将进入老年代;当对象age=15时也将进入老年代;当Survivor空间age相同的对象(假设为ageA)总和 >= survivor空间的一半时,Survivor空间中age > ageA 的对象也将进入年老代。虚拟机进行minor gc时,当要进入年老代的对象 > 年老代剩余空间大小,将发生 Full GC(整个堆GC,包括年轻代和年老代)。

三、垃圾收集器

3.1 Serial收集器

新生代收集器,采用复制算法;单线程;GC时需要暂停用户线程。最高的单线程收集效率,对于运行在 Client 模式下的虚拟机来说是一个很好的选择。

Serial Old收集器:是Serial收集器的老年代版本;单线程;使用“标记---整理”算法。

3.2 ParNew收集器

新生代收集器,采用复制算法,Serial收集器的多线程版本;GC时需要暂停用户线程。

3.3 Parallel Scavenge收集器

 新生代收集器,采用复制算法;多线程;GC时需要暂停用户线程。和ParNew区别在于Parallel ScaVenge收集器目标是达到一个可控制的吞吐量吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

  • -XX:MaxGCPauseMillis 控制最大垃圾收集停顿时间。大于0的毫秒数,改值缩短需要牺牲吞吐量和新生代空间。
  • -XX:GCTimeRadio 直接设置吞吐量大小。0到100之间的整数,垃圾收集时间占总时间的比例。
  • -XX:+UseAdaptiveSizePolicy 一个开关参数,打开后不需手动指定新生代大小(-Xmn)、Eden区域Survivor空间的比例(-XX:SurvivorRadio)、晋升老年代对象大小(-XX:PretenureSizeThreshold) 等细节参数,虚拟机会根据当前系统运行情况收集性能监控信息,动态调整以提供最合适的停顿时间或者最大的吞吐量,这种条件被称为GC的自适应调节策略(GC Ergonomics)。
Parallel Old收集器:是Parallel Scavenge收集器的老年代版本;多线程;使用“标记---整理”算法;jdk1.6开始提供。

3.4 CMS收集器(重点)

标记-清除算法;以获取低停顿为目标。适合互联网网站或者 B/S(Brower/Server 浏览器/服务器模式)系统的服务端。运作过程分为4个步骤:

  • 初始标记:非并行,需要停止用户线程,标记GC Roots能关联到的对象。很快。
  • 并发标记:并行,不停止用户线程,进行GC Roots Tracing(追踪)的过程。慢。
  • 重新标记:并行,需要停止用户线程,修正并发标记期间因用户程序继续运作而导致标记产生变动的那些对象的标记记录。快
  • 并发清除:并行,不停止用户线程

优点:并发收集,低停顿。

缺点:

  • 对CPU资源非常敏感:并发设计的程序对CPU资源都敏感;在并发阶段会因为占用了一部分CPU资源而导致用户应用程序变慢,总吞吐量会降低。
  • 无法处理浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾产生,这一部分垃圾出现在标记过程之后,所以CMS在本次并发清理过程无法处理掉它们,只好留待下一次GC时再清理。这部分垃圾称为浮动垃圾。由于在垃圾收集阶段用户线程还在运行,所以需要预留足够的内存空间给用户线程使用,因此CMS不能等老年代几乎被填满时再进行收集,需要预留部分空间提供给并发收集时用户线程运行使用。jdk1.5默认老年代使用了68%激活Full GC,jdk1.6改为92%,可通过-XX:CMSInitiatingOccupancyFraction设置。
  • 基于“标记---清除”算法,产生大量空间碎片

3.5 G1收集器(重点)

面向服务端应用,追求低停顿(还能建立可预测的停顿时间模型),基于“标记---整理”算法。

在G1之前的其他收集器进行GC的范围都是整个新生代或者老年代,而G1对java堆的内存布局和其他收集器有很大差别。它将整个java堆分为多个大小相等的独立区域(Region),虽然还保留新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,他们都是一部分Region的集合。

G1可以有计划的避免在整个java堆中进行Full GC:G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Garbage-First的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限时间内可以获取尽可能高的收集效率。

G1中每个Region都有一个与之对应的Rememberd Set,用于避免全堆扫描:虚拟机在发现程序对Reference类型的数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region中(在分代的例子就是检查是否是老年代中的对象引用了年轻代的对象),如果是 则通过CardTable把相关引用信息记录到被引用对象所属的Region的Rememberd Set中。当进行内存回收时,在GC Roots的枚举范围内加入Rememberd Set即可保证不对全堆扫描也不会有遗漏。

区域 (Region) 的大小,可以通过 -XX:G1HeapRegionSize 参数指定,大小区间最小 1M 、最大 32M ,总之是 2 的幂次方。默认是将堆内存按照 2048 份均分。

运作过程如下:

  • 初始标记 :非并行,需要停止用户线程,标记GC Roots能直接关联到的对象。
  • 并发标记 :并行,从GC Roots开始对堆中对象进行可达性分析,找出存活对象。
  • 最终标记 :并行,需要停止用户线程,修正并发标记期间因用户程序继续运作而导致标记产生变动的那些对象的标记记录,并将这些变化记录在Rememberd Set Logs中,最后将Rememberd Set Logs数据合并到Rememberd Set中。Rememberd Set : 记录对象在不同分区的引用关系
  • 筛选回收 :并行,需要停止用户线程,首先对各个Region的回收价值和成本进行排序,然后根据用户期望的GC停顿时间来制定回收计划。G1 中提供了 Young GCMixed GC 两种垃圾回收模式,这两种垃圾回收模式,都是 Stop The World (STW) 的。
优点如下:
  • 并行与并发
  • 分代收集
  • 空间整合
  • 可预测的停顿
在以下场景中,G1 更适合:
  • 服务端多核 CPU、JVM 内存占用较大的应用(至少大于 4G);
  • 应用在运行过程中,会产生大量内存碎片、需要经常压缩空间;
  • 想要更可控、可预期的 GC 停顿周期,防止高并发下应用雪崩现象。

3.6 JVM垃圾收集相关参数

3.7 各个版本jdk默认的垃圾收集器

各个版本JDK默认的垃圾回收器:
  • JDK1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
  • JDK1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
  • JDK1.9 默认垃圾收集器G1
//查看当前使用的垃圾收集器
java -XX:+PrintCommandLineFlags -version
-XX:+UseSerialGC :设置串行收集器
-XX:+UseParallelGC :设置并行收集器
-XX:+UseParalledlOldGC :设置并行年老代收集器
-XX:+UseConcMarkSweepGC :设置并发收集器

四、内存分配与回收策略

  • 对象优先在Eden分配
  • 大对象直接进入老年代(-XX:PretenureSizeThreshold 配置对象大小阈值)
  • 长期存活的对象进入老年代(-XX:MaxTenuringThreshold 配置年龄大小阈值,默认15岁)
  • 动态对象年龄判定:在Survivor空间中相同年龄所有对象大小的总和 > Survivor空间的一半时,年龄 > 该年龄的对象就可以直接进入老年代。
  • 空间分配担保:在发生minor gc之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么minor gc可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置的值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次minor gc,尽管此次minor gc有风险;如果小于,或者HandlePromotionFailure设置不允许冒险,那这时也要改为进行一次Full GC。

相关文章:

【JVM详解三】垃圾回收机制

一、对象是否存活 强引用:Object obj new Object(); 只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。在不用对象的时将引用赋值为 null,能够帮助垃圾回收器回收对象。比如 ArrayList 的 clear() 方法实现。软引用(SoftRe…...

dbeaver 安装之后出现mysql连接异常问题

1.手动下载mysql驱动程序 参考文档DBeaver连接mysql驱动下载失败怎么办?-CSDN博客 2.添加对应的下载程序到dbeaver 【DBeaver】缺少mysql驱动_dbeaver连接mysql缺少驱动-CSDN博客 配置mysql 地址端口账户等即可使用...

Android Studio历史版本下载

Android Studio历史版本下载 历史版本所在网站: https://developer.android.google.cn/studio/archive 等待加载 1、(需要点击switch to english)然后出现Terms and conditions 2、滑到最下面,点击I agree to the terms,之后才会…...

【每日一题 | 2025】2.3 ~ 2.9

个人主页:GUIQU. 归属专栏:每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…...

国产编辑器EverEdit - 迷你查找

1 迷你查找 1.1 应用场景 某些场景下,用户不希望调出复杂的查找对话框,此时可以使用迷你查找窗口。 1.2 使用方法 选择主菜单查找 -> 迷你查找,或使用快捷键Ctrl Alt F,会在右上角弹出迷你查找窗口,如下图所示…...

制药行业 BI 可视化数据分析方案

一、行业背景 随着医药行业数字化转型的深入,企业积累了海量的数据,包括销售数据、生产数据、研发数据、市场数据等。如何利用这些数据,挖掘其价值,为企业决策提供支持,成为医药企业面临的重大挑战。在当今竞争激烈的…...

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建,安装nodejs即可 参考:https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…...

2.10学习总结

今天接着看了数据结构&#xff0c;但是跟指针有关的看不懂&#xff08;万恶的指针&#xff09;&#xff0c;写了考试的补题。 #include <stdio.h> #include <stdlib.h> int a[1000005]; int main() {int n,i,x0;scanf("%d",&n);for(i1;i<n;i){x;i…...

MySQL 中可以通过添加主键来节省磁盘空间吗?(译文)

从历史上看&#xff0c;MySQL 不需要在表上定义显式主键&#xff0c;直到今天默认都是这样。不过&#xff0c;这种要求是通过两种复制方法施加的&#xff1a;组复制和 Percona XtraDB 集群 &#xff08;PXC&#xff09;&#xff0c;默认情况下不允许使用没有主键的表。对于缺少…...

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹&#xff0c;作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时&#xff0c;django-admin.exe安装的位置&#xff0c;例如 4.运行命令 使用django-admin.exe的绝对路径&#xff0c;在刚才打开的终端…...

IDEA接入DeepSeek

IDEA 目前有多个途径可以接入deepseek&#xff0c;比如CodeGPT或者Continue&#xff0c;这里借助CodeGPT插件接入&#xff0c;CodeGPT目前用的人最多&#xff0c;相对更稳定 一、安装 1.安装CodeGPT idea插件市场找到CodeGPT并安装 2.创建API Key 进入deepseek官网&#xf…...

Linux 内核自旋锁spinlock(二)--- ticket spinlock

文章目录 前言一、ticket spinlock二、源码分析2.1 spin_lock_init2.2 spin_lock2.2 spin_unlock 参考资料 前言 自旋锁是 Linux 内核中最底层的互斥机制。因此&#xff0c;它们对内核的安全性和性能有着巨大的影响&#xff0c;因此对各种&#xff08;特定架构的&#xff09;自…...

Elixir语言的计算机基础

Elixir语言的计算机基础 引言 Elixir是一种现代的编程语言&#xff0c;建立在Erlang虚拟机&#xff08;BEAM&#xff09;上&#xff0c;专注于并发、分布式系统和容错能力。随着互联网的发展&#xff0c;应用程序的需求变得越来越复杂&#xff0c;Elixir凭借其高效的性能、灵…...

MindStudio制作MindSpore TBE算子(二)算子测试

在上一节中&#xff0c;成功制作了Mindspore的Add算子&#xff0c;具体可以查看MindStudio制作MindSpore TBE算子&#xff08;一&#xff09;算子制作&#xff0c;这一节&#xff0c;一起看看如何对算子进行测试。 建议参考以下内容一起食用&#xff1a; 算子代码实现 MindSpor…...

深度解读城市地下网管管廊改造要点

引 言 近日国家发改委和住建部联合发布通知&#xff08;后附&#xff09;&#xff0c;要求各地抓紧编制“城市地下管网和综合管廊建设改造实施方案”并于12月27日前报国家发改委和住建部相关司处&#xff0c;逾期未报的城市&#xff08;县、区&#xff09;&#xff0c;视同自愿…...

Docker 部署 redis | 国内阿里镜像

一、简易单机版 1、镜像拉取 # docker hub 镜像 docker pull redis:7.0.4-bullseye # 阿里云镜像 docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/redis_optimized:20240221-6.2.7-2.3.0 2、运行镜像 docker run -itd --name redis \n …...

Day88:加载游戏图片

在游戏开发中,加载和显示图片是非常常见的需求,尤其是在 2D 游戏 中,角色、背景、道具、敌人等都需要用图片来表示。今天,我们将学习如何在 Python 游戏开发中使用 Pygame 加载并显示图片。 1. 加载游戏图片的基本步骤 在 Pygame 中加载图片通常需要以下几个步骤: 导入 P…...

Elasticsearch:在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用

在这个春节&#xff0c;如一声春雷&#xff0c;DeepSeek R1 横空出世。现在人人都在谈论 DeepSeek R1。这个大语言模型无疑在中国及世界的人工智能发展史上留下了重要的里程碑。那么我们改如何结合 DeepSeek R1 及 Elasticsearch 来实现 RAG 呢&#xff1f;在之前的文章 “使用…...

SOME/IP报文格式及发现协议详解

在之前的文章中&#xff0c;我们介绍了SOME/IP协议的几种服务接口。在本篇博客中&#xff0c;主要介绍some/ip协议传输的header报文格式以及SOME/IP-SD发现协议。 目录 流程 报文格式 Message ID Length Request ID protocal version/Interface Version Message Type…...

elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点

需求&#xff1a;时间选择器可选的时间范围进行限制&#xff0c;-2年<a<2年且a<new Date().getTime()核心&#xff1a;这里需要注意plus版没有picker-options换成disabled-date属性了&#xff0c;使用了visible-change和calendar-change属性逻辑&#xff1a;另设一个参…...

C语言·关键字·char关键字

C语言菜鸟入门关键字char关键字_c char-CSDN博客...

Ansible简单介绍及用法

一、简介 Ansible是一个简单的自动化运维管理工具&#xff0c;基于Python语言实现&#xff0c;由Paramiko和PyYAML两个关键模块构建&#xff0c;可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…...

Mac 本地搭建自己的 DeepSeek

Mac 本地搭建自己的 DeepSeek 安装 Ollama通过Ollama命令安装 DeepSeek 模型安装一个UI客户端&#xff0c;提升体验 注&#xff1a;本文章完全参考网上教程&#xff0c;没有丝毫原创&#xff0c;只是记录一下我本人在安装DeepSeek 的步骤 安装 Ollama https://ollama.com/dow…...

深度学习-交易预测

下面为你详细介绍如何使用Python结合深度学习库TensorFlow和Keras来构建一个简单的交易预测模型。在这个示例中&#xff0c;我们以股票价格预测为例&#xff0c;假设我们要根据过去一段时间的股票价格数据来预测未来的价格走势。 步骤分析 数据准备&#xff1a;获取股票价格数…...

Prompt逆向工程:如何“骗“大模型吐露其Prompt?

提示词的“逆向工程”&#xff0c;让AI大语言模型帮你反推提示词 一、前言 在日常生活中&#xff0c;我们不时会遇到一些令人惊艳的文本&#xff0c;不论是一篇精彩绝伦的小说、一篇深入浅出的科普文章&#xff0c;还是一篇充满热情的音乐推荐&#xff0c;它们都能在我们的心…...

游戏手柄Type-c方案,支持一边充电一边传输数据

乐得瑞推出LDR6023SS&#xff0c;专门针对USB-C接口手机手柄方案&#xff0c;支持手机快充&#xff0c;支持任天堂游戏机&#xff0c;PS4等设备~同时支持手机充电跟数据传输 1、概述 LDR6023SS SSOP16 是乐得瑞科技针对 USB Type-C 标准中的 Bridge 设备而开发的双 USB-C DRP …...

Vue设计模式到底多少种?

Vue设计模式到底多少种&#xff1f; 很多同学问&#xff0c;Vue到底有多少种设计模式&#xff1f;&#xff1f;各个模式到底是什么意思&#xff1f;&#xff1f;又各自适合什么场景&#xff1f;&#xff1f; 这里我给大家直接说下&#xff0c;Vue的设计模式没有一个固定的数值…...

C++ 中的 std::timed_mutex 和 std::recursive_timed_mutex

1、背景 在多线程编程中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是用于保护共享资源的重要工具。C 标准库提供了多种互斥锁类型&#xff0c;其中 std::timed_mutex 和 std::recursive_timed_mutex 是两种支持超时功能的互斥锁。在阅读FastDDS源码时&#xff0c;发现了…...

HAL库外设宝典:基于CubeMX的STM32开发手册(持续更新)

目录 前言 GPIO&#xff08;通用输入输出引脚&#xff09; 推挽输出模式 浮空输入和上拉输入模式 GPIO其他模式以及内部电路原理 输出驱动器 输入驱动器 中断 外部中断&#xff08;EXTI&#xff09; 深入中断&#xff08;内部机制及原理&#xff09; 外部中断/事件控…...

Kotlin实战经验:将接口回调转换成suspend挂起函数

在 Kotlin 协程中, suspendCoroutine 和 suspendCancellableCoroutine 是用于将回调或基于 future 的异步操作转换成挂起函数。 suspendCoroutine 用途:将回调式异步操作转换为可挂起函数 行为: 启动一个新的协程来处理基于回调的操作挂起当前协程,直到调用回调回调负责…...

银行国际结算

银行国结项目&#xff0c;即国际结算项目&#xff0c;是银行业务中的重要组成部分&#xff0c;它涉及跨国界的货币收付和资金转移。 一、银行国结项目的定义 银行国结项目是指银行为国际贸易、投资等活动提供的国际结算服务&#xff0c;包括各种国际支付和资金清算业务。这些…...

java后端开发day13--面向对象综合练习

&#xff08;以下内容全部来自上述课程&#xff09; 注意&#xff1a;先有javabean&#xff0c;才能创建对象。 1.文字版格斗游戏 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#…...

Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

vue开发过程中&#xff0c;父组件通过props传值给子组件&#xff0c;子组件在页面展示父组件的值&#xff0c;在操作子组件值以后&#xff0c;即使不点击确定按钮&#xff0c;父组件中的值也发生了变化&#xff0c;但是需求是操作子组件数据以后&#xff0c;必须点击"确定…...

【通俗解释,入门级】DeepSeek - R1 - Zero:强化学习提升LLM推理能力的奥秘

DeepSeek - R1 - Zero&#xff1a;强化学习提升LLM推理能力的奥秘 第一节&#xff1a;强化学习在DeepSeek - R1 - Zero中的基本概念与公式解释【通俗解释】 强化学习在DeepSeek - R1 - Zero里就像是一位“聪明的探险家”&#xff0c;在各种可能的推理路径中探索&#xff0c;通…...

《图解设计模式》笔记(六)访问数据结构

十三、Visitor 模式&#xff1a;访问数据结构并处理数据 Visitor&#xff1a;访问者 我们会“处理”在数据结构中保存着的元素&#xff0c;通常把“处理”代码放在表示数据结构的类中。 但每增加一种处理&#xff0c;就不得不去修改表示数据结构的类。 在 Visitor模式中&am…...

windows11上,使用pipx安装Poetry,Poetry的安装路径是什么?

当使用 pipx 安装 Poetry 时&#xff0c;pipx 会将 Poetry 安装到一个独立的虚拟环境中&#xff0c;并将其可执行文件链接到一个集中的目录中。以下是 pipx 安装 Poetry 时的路径信息&#xff1a; 1. Poetry 的安装路径 pipx 会为每个工具&#xff08;如 Poetry&#xff09;创…...

使用 vcpkg 简化 C++ 项目依赖管理

使用 vcpkg 简化 C 项目依赖管理 什么是 vcpkg&#xff1f; vcpkg 是微软推出的跨平台 C/C 包管理工具&#xff0c;支持 Windows/Linux/macOS。它可以帮助开发者&#xff1a; ✅ 一键安装 2000 开源库 ✅ 自动解决依赖关系 ✅ 生成 Visual Studio 集成配置 ✅ 支持自定义编译…...

怎样确定网站访问速度出现问题是后台还是服务器造成的?

网站的访问速度会影响到用户的体验感&#xff0c;当网络过于卡顿或访问速度较慢时&#xff0c;会给用户带来不好的体验感&#xff0c;但是网站访问速度不仅会是后台造成影响的&#xff0c;也可能是服务器的原因&#xff0c;那么我们该如何分辨呢&#xff1f; 当网站使用了数据库…...

【Elasticsearch】管道聚合

管道聚合就是在已有聚合结果之上在进行聚合&#xff0c;管道聚合是针对于聚合的聚合 在 Elasticsearch 中&#xff0c;管道聚合&#xff08;Pipeline Aggregations&#xff09;是一种特殊的聚合类型&#xff0c;用于对其他聚合的结果进行进一步的计算和处理&#xff0c;而不是直…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...

后端java工程师经验之谈,工作7年,mysql使用心得

mysql 工作7年&#xff0c;mysql使用心得 mysql1.创建变量2.创建存储过程2.1&#xff1a;WHILE循环2.2&#xff1a;repeat循环2.3&#xff1a;loop循环2.4&#xff1a;存储过程&#xff0c;游标2.5&#xff1a;存储过程&#xff0c;有输入参数和输出参数 3.三种注释写法4.case …...

综合评价 | 基于随机变异系数-TOPSIS组合法的综合评价模型(Matlab)

基于随机变异系数-TOPSIS组合法的综合评价模型 代码获取私信回复&#xff1a;综合评价 | 基于随机变异系数-TOPSIS组合法的综合评价模型&#xff08;Matlab&#xff09; 一、引言 1.1、研究背景与意义 在现代社会&#xff0c;随着信息量的不断增加和数据复杂性的提升&#…...

Visual Studio Code中文出现黄色框子的解决办法

Visual Studio Code中文出现黄色框子的解决办法 一、vsCode中文出现黄色框子-如图二、解决办法 一、vsCode中文出现黄色框子-如图 二、解决办法 点击 “文件”点击 “首选项”点击 “设置” 搜索框直接搜索unicode选择“文本编辑器”&#xff0c;往下滑动&#xff0c;找到“Un…...

手写一个C++ Android Binder服务及源码分析

手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…...

【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)

在 Visual Studio Code (VSCode) 中集成 AI 编程能力&#xff0c;可以通过安装和配置特定插件来实现。以下是如何通过 Continue 和 Cline 插件集成 DeepSeek&#xff1a; 一、集成 DeepSeek 获取 DeepSeek API 密钥&#xff1a;访问 DeepSeek 官方网站&#xff0c;注册并获取 …...

使用 Three.js 实现热力渐变效果

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…...

Vue事件处理 - 绑定事件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue事件处理 - 绑定事件及事件处理 目录 事件处理 绑定方式 函数表达式 绑定函数名 输入框绑定事件 拿到输入框的值 传值加事件源 事件第三种写法 总结 事件处理 绑定方式 函数表达式 在按钮上使用函数表达式绑定事…...

DVWA靶场通关——SQL Injection篇

一&#xff0c;Low难度下unionget字符串select****注入 1&#xff0c;首先手工注入判断是否存在SQL注入漏洞&#xff0c;输入1 这是正常回显的结果&#xff0c;再键入1’ You have an error in your SQL syntax; check the manual that corresponds to your MySQL server ver…...

DeepSeek 助力 Vue 开发:打造丝滑的步骤条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

今日学习总结

1.完成了P2242公路维修问题 2.完成了P10605下头论文 1.P2242 思考&#xff1a;建立单向链表&#xff0c;使用qsort降序排序。 #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> int n,m; int a[15005],b[15005],ans;…...