JVM 垃圾回收算法和垃圾回收器

【机器人】转动的指数坐标表示心得理解 转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需 阅读详情

JVM 垃圾回收算法和垃圾回收器。

一、垃圾回收的区域

  • 栈:栈中的生命周期是跟随线程,所以一般不需要关注。
  • 堆:堆中的对象是垃圾回收的重点。
  • 方法区:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点。

二、怎么判断对象的存活

一般有两种方式(引用计数法、可达性分析),JVM使用的是可达性分析。

1. 引用计数法

给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收(Python 在用,但主流虚拟机没有使用)。

  • 优点:快,方便,实现简单。
  • 缺陷:对象相互引用时(A.instance=B 同时 B.instance=A),很难判断对象是否该回收。

2. 可达性分析

来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。

作为 GC Roots 的对象包括下面几种:

  • 当前虚拟机栈中局部变量表中的引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中的常量引用的对象

3. finalize

Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(),可以完成对象的拯救(不被回收),但是不能保证一定不被回收,说白了就是没啥用,一个坑。

三、各种引用(Reference)

Reference 中存储的数据代表的是另一块内存的起始地址。

1. 强引用

一般的 Object obj = new Object() ,就属于强引用。

(如果有 GCroots 的强引用)垃圾回收器绝对不会回收它,当内存不足时宁愿抛出 OOM 错误,使得程序异常停止,也不会回收强引用对象。

2. 软引用

SoftReference垃圾回收器在内存充足的时候不会回收它,而在内存不足时会回收它。

示例代码:

public static void main(String[] args) {
    String str = new String("SunnyBear"); // 强引用
    SoftReference<String> strSoft = new SoftReference<String>(str);
    str = null; // 干掉强引用,确保只有strSoft的软引用
    System.out.println(strSoft.get()); // SunnyBear
    System.gc(); // 执行一次gc,此命令请勿在线上使用,仅作示例操作
    System.out.println("------------ gc after");
    System.out.println(str); // null
    System.out.println(strSoft.get()); // SunnyBear
}

所以软引用一般用来实现一些内存敏感的缓存,只要内存空间足够,对象就会保持不被回收掉

3. 弱引用 WeakReference

垃圾回收器在扫描到该对象时,无论内存充足与否,都会回收该对象的内存

示例代码:

public static void main(String[] args) {
    String str = new String("SunnyBear"); // 强引用
    WeakReference<String> strWeak = new WeakReference<String>(str);
    str = null; // 干掉强引用,确保只有strSoft的软引用
    System.out.println(strWeak.get()); // SunnyBear
    System.gc(); // 执行一次gc,此命令请勿在线上使用,仅作示例操作
    System.out.println("------------ gc after"); // null
    System.out.println(str); // null
    System.out.println(strWeak.get()); // null
}

实际应用,如 WeakHashMap、ThreadLocal。

4. 虚引用 PhantomReference

幽灵引用,最弱,被垃圾回收的时候收到一个通知,如果一个对象只具有虚引用,那么它和没有任何引用一样,任何时候都可能被回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。

四、GC

1. Minor GC

  • 特点: 发生在新生代上,发生的较频繁,执行速度较快。
  • 触发条件: Eden 区空间不足/空间分配担保。

2. Full GC

  • 特点:主要发生在老年代上(新生代也会回收),较少发生,执行速度较慢。
  • 触发条件:
    • 调用 System.gc() 。
    • 老年代区域空间不足。
    • 空间分配担保失败。
    • JDK 1.7 及以前的永久代(方法区)空间不足。

五、垃圾回收算法

1. 复制算法(Copying)

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。

复制算法

  • 优点
    • 简单高效,不会出现内存碎片。
  • 缺点
    • 内存利用率低。
    • 存活对象较多时效率明显降低,因为需要移动每个不可回收数据的内存实际位置。

注:

专门研究表明,新生代中的对象 90%是“朝生夕死”的,所以一般来说回收占据 10% 的空间够用了,所以并不需要按照 1:1 的比例来划分内存空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块 Survivor[1]。当回收时,将 Eden 和 Survivor 中还存活着的对象一次性地复制到另外一块 Survivor 空间上,最后清理掉 Eden 和刚才用过的 Survivor 空间。
HotSpot 虚拟机默认 Eden 和 Survivor 的大小比例是 8:1,也就是每次新生代中可用内存空间为整个新生代容量的 90%(80%+10%),只有 10%的内存会被“浪费”。

2. 标记-清除算法(Mark-Sweep)

首先标记所有需要回收的对象,然后统一回收被标记的对象。

标记清除算法

  • 优点
    • 利用率100% 。
  • 缺点
    • 标记和清除效率都不高(对比复制算法)。
    • 会产生大量不连续的内存碎片。

3. 标记-整理算法(Mark-compact)

首先标记出所有需要回收的对象,在标记完成后,后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端,边界以外的内存。

标记整理算法

  • 优点
    • 利用率100% 。
    • 没有内存碎片。
  • 缺点
    • 标记和清除效率都不高(对比复制算法及标记清楚算法)。

六、垃圾回收器

jvm 垃圾回收器把上面的三种算法全部用到了,采用分代收集。

1、新生代:复制算法。

收集器收集对象和算法收集器类型
Serial新生代,复制算法单线程
ParNew新生代,复制算法并行的多线程收集器
Parallel Scavenge新生代,复制算法并行的多线程收集器

2、老年代:标记清除算法和标记整理算法

收集器收集对象和算法收集器类型
Serial Old老年代,标记整理算法单线程
Parallel Old老年代,标记整理算法并行的多线程收集器
CMS(Conc Mark Sweep )老年代,标记清除算法并行和并发收集器
G1(Garbage First)跨新生代和老年代,复制算法 + 标记整理算法并行和并发收集器

注:

  • 并行:垃圾收集的多线程的同时进行。
  • 并发:垃圾收集的多线程和用户应用的多线程同时进行。
  • 使用 jps -v 可以看到使用的垃圾收集器,例如:-XX:+UseConcMarkSweepGC (CMS)

1. 可以配套使用的垃圾回收器

连线表示可以 新生代 和 老年代 配套使用的垃圾收集器。

垃圾回收器

2. Serial/Serial Old

最古老的,单线程,独占式,成熟,适合单 CPU 服务器。-XX:+UseSerialGC 新生代和老年代都用串行收集器。

3. ParNew

ParNew 和 Serial 基本没区别,唯一的区别:多线程,多 CPU 的,停顿时间比 Serial 少 。

-XX:+UseParNewGC 新生代使用 ParNew,老年代使用 Serial Old 。

可以和CMS搭配使用。

4. Parallel Scavenge(ParallerGC)/Parallel Old

关注吞吐量的垃圾收集器,高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。所谓吞吐量就是 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了 100 分钟,其中垃圾收集花掉 1 分钟,那有吞吐效率就是 99% 。

5. CMS(Concurrent Mark Sweep)

收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的 Java 应用集中在互联网站或者 B/S 系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。

CMS 收集器就非常符合这类应用的需求。-XX:+UseConcMarkSweepGC ,一般新生代使用 ParNew,老年代的用 CMS,从名字(包含“Mark Sweep”)上就可以看出,CMS 收集器是基于“标记—清除”算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些。

回收过程

CMS回收过程

整个过程分为 4 个步骤,包括:

1、初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿(STW -Stop the world)。

2、并发标记:从 GC Root 开始对堆中对象进行可达性分析,找到存活对象,它在整个回收过程中耗时最长,不需要停顿。

3、重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿(STW)。这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

  1. 并发清除:不需要停顿。

优缺点

1、优点

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS 收集器的内存回收过程是与用户线程一起并发执行的

2、缺点

  • CPU 资源敏感:因为并发阶段多线程占据 CPU 资源,如果 CPU 资源不足,效率会明显降低。
  • 由于 CMS 并发清理阶段 用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS 无法在当次收集中处理掉它们,只好留待下一次 GC 时再清理掉。这一部分垃圾就称为 浮动垃圾。
  • 由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。在 1.6 的版本中老年代空间使用率阈值(92%),如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure,这时虚拟机将临时启用 Serial Old 来替代 CMS。
  • 会产生内存碎片:标记-清除算法 会导致产生不连续的内存碎片。

6. G1

G1相比较CMS的改进

  • 基于标记-整理算法, 不会产生空间碎片,分配大对象时不会无法得到连续的空间而提前触发一次full gc 。
  • 停顿时间可控: G1可以通过设置预期停顿时间(Pause time)来控制垃圾收集时间,但是这个预期停顿时间G1只能尽量做到,而不是一定能做到。

可预测的停顿:

G1 收集器之所以能建立可预测的停顿时间模型,是因为它可以有计划地避免在整个 Java 堆中进行全区域的垃圾收集。G1 跟踪各个 Region 里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region(这也就是 Garbage-First 名称的来由)。这种使用 Region 划分内存空间以及有优先级的区域回收方式,保证了 G1 收集器在有限的时间内可以获取尽可高的收集效率。

G1的设置参数

  • -XX:+UseG1GC // 开启G1
  • -XX:MaxGCPauseMillis=200 // 预期停顿时间200毫秒,默认也是200
  • -XX:G1HeapRegionSize=2 // 设置每个区域大小2M,其必须是2的幂,范围允许为1Mb到32Mb
  • -XX:G1NewSizePercent // 新生代最小值,默认值 5%
  • -XX:G1MaxNewSizePercent // 新生代最大值,默认值 60%
  • -XX:ParallelGCThreads // STW 期间,并行 GC 线程数
  • -XX:ConcGCThreads=n // 并发标记阶段,并行执行的线程数

G1是怎么划堆内存的呢

G1 把堆划分成多个大小相等的 独立区域(Region),新生代和老年代不再物理隔离。

G1 算法将堆划分为若干个独立区域(Region),它仍然属于分代收集器。不过,这些区域的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者 Survivor 空间。例如其中一个独立区域如图:

独立区域

GC 的模式

1、Young GC

Young GC 主要是对 Eden 区进行 GC,它在 Eden 空间耗尽时会被触发。在这种情况下,Eden 空间的数据移动到 Survivor 空间中,如果 Survivor 空间不够,Eden 空间的部分数据会直接晋升到老年代空间。Survivor 区的数据移动到新的 Survivor 区中,也有部分数据晋升到老年代空间中。最终 Eden 空间的数据为空,GC 停止工作,应用线程继续执行

2、Mixed GC

选定所有新生代里的 Region,外加根据 global concurrent marking 统计得出收集收益高的若干老年代 Region。在用户指定的开销目标范围内尽可能选择益高的老年代 Region。Mixed GC 不是 full GC,它只能回收部分老年代的 Region。如果 mixed GC 实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行 Mixed GC,就会使用 serial old GC(full GC)来收集整个 GC heap。所以我们可以知道,G1 是不提供 full GC 的

收集过程

G1回收过程

大致分为4个步骤:

1、初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,并且修改 TAMS(Nest Top Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可以的 Region 中创建对象,此阶段需要停顿线程(STW),但耗时很短

2、并发标记:从 GC Root 开始对堆中对象进行可达性分析,找到存活对象,此阶段耗时较长,但可与用户程序并发执行

3、最终标记:为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程的 Remembered Set Logs 里面,最终标记阶段需要把 Remembered Set Logs 的数据合并到 Remembered Set 中。这阶段需要停顿线程(STW),但是可并行执行

4、筛选回收:首先对各个 Region 中的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分 Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率

七、垃圾回收器的一些重要参数

参数描述
UseSerialGC虚拟机运行在 Client 模式下的默认值,打开此开关后,使用 Serial+Serial Old 的收集器组合进行内存回收
UseParNewGC打开此开关后,使用 ParNew + Serial Old 的收集器组合进行内存回收
UseConcMarkSweepGC打开此开关后,使用 ParNew + CMS + Serial Old 的收集器组合进行内存回收。Serial Old 收集器将作为 CMS 收集器出现 Concurrent Mode Failure 失败后的后备收集器使用
UseParallelGC虚拟机运行在 Server 模式下的默认值,打开此开关后,使用 Parallel Scavenge + Serial Old(PS MarkSweep) 的收集器组合进行内存回收
UseParallelOldGC打开此开关后,使用 Parallel Scavenge + Parallel Old 的收集器组合进行内存回收
SurvivorRatio新生代中 Eden 区域与 Survivor 区域的容量比值,默认为 8,代表 Eden : Survivor = 8 : 1
PretenureSizeThreshold直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
MaxTenuringThreshold晋升到老年代的对象年龄,每个对象在坚持过一次 Minor GC 之后,年龄就增加 1,当超过这个参数值时就进入老年代
UseAdaptiveSizePolicy动态调整 Java 堆中各个区域的大小以及进入老年代的年龄
HandlePromotionFailure是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个 Eden 和 Survivor 区的所有对象都存活的极端情况
ParallelGCThreads设置并行 GC 时进行内存回收的线程数
GCTimeRatio GC时间占总时间的比率,默认值为 99,即允许 1% 的 GC 时间,仅在使用 Parallel Scavenge 收集器生效
MaxGCPauseMillis设置 GC 的最大停顿时间,仅在使用 Parallel Scavenge 收集器时生效
CMSInitiatingOccupancyFraction设置 CMS 收集器在老年代空间被使用多少后触发垃圾收集,默认值为 68%,仅在使用 CMS 收集器时生效
UseCMSCompactAtFullCollection设置 CMS 收集器在完成垃圾收集后是否要进行一次内存碎片整理,仅在使用 CMS 收集器时生效
CMSFullGCsBeforeCompaction设置 CMS 收集器在进行若干次垃圾收集后再启动一次内存碎片整理,仅在使用 CMS 收集器时生效

都读到这里了,来个 点赞、评论、关注、收藏   (一键三连) 吧!

机器人环境仿真软件:Webots_(9).路径规划与导航算法仿真实现 通过仿真,我们可以验证路径规划算法的有效性和鲁棒性,同时优化机器人在不同环境中的导航性能。动态窗口法是一种局部路径规划算法,通过在机器人当前速度空间中选择一个最优的速度窗口,使机器人在动态环境中安全地移动。算法的代价函数通常包括两个部分:从起始点到当前节点的实际代价(g-cost)和从当前节点到目标节点的估计代价(h-cost)。在World Editor中,选择“Insert”菜单,添加“Robot”对象,如“E-puck”或“Thymio”。Dijkstra算法的实现与A*算法类似,但不使用启发函数。 阅读详情

相关推荐

告别Overleaf!本地LaTeX环境配置:VSCode+TeXLive完全指南(Windows/Mac双平台)

本文详细介绍了如何在Windows和Mac平台上配置本地LaTeX环境,使用VSCode和TeXLive打造高效的专业写作工作流。从TeXLive安装到VSCode插件配置,再到高级技巧与性能优化,帮助用户摆脱Overleaf限制,实现更快速、更私密的学术写作体验。

3c4x5z6v7b的博客 952

浅谈JVM的垃圾回收算法和垃圾回收器

浅谈JVM的垃圾回收算法和垃圾回收器

小洋的博客 2648

2 利用ITK实现多帧Dicom读取,VTK实现数据显示

vtk中也有dicom读写类,但是只能完成单帧DICOM数据读取,这对于实际应用是非常不利的。而ITK可以实现dicom多帧读取,通常情况ITK与VTK也会结合使用(ITK处理,VTK显示),所以就一起学习下吧!

buerbuhuitou的博客 1564

JVM(8)--垃圾回收算法与垃圾回收器

一、概述 深入理解java虚拟机中写到”Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。” Java在动态内存分配与回收上已经是自动化的,但是当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 1.1 什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应

Gopuwe的博客 1297

TX 的 LOL(Local Oscillator Leakage,本振泄露)

项目内容LOL 是什么本振残留在 TX 输出中心频率上的杂散主要原因IQ 失衡、硬件不完美、零中频架构影响杂散、干扰、性能劣化、安全问题解决方法初始化校准 + 跟踪校准(AD9371 支持)检测手段频谱仪、回环检测、ADC ILA 抓取。

weixin_41230430的博客 2046

PCL1.12.1+VTK9.1+Qt5.14.2实战:解决QVTKOpenGLNativeWidget点云渲染窗口初始化报错问题

本文针对PCL1.12.1、VTK9.1与Qt5.14.2集成开发中,QVTKOpenGLNativeWidget点云渲染窗口初始化时出现的报错与黑屏问题,提供了深度分析与两种实战解决方案。核心在于理解VTK版本升级导致的渲染窗口类型不匹配,并指导开发者通过显式创建vtkGenericOpenGLRenderWindow或利用窗口ID嵌入,正确初始化并绑定可视化组件,从而稳定实现点云渲染。

weixin_29284657的博客 221

JVM垃圾回收算法&回收器

学习本文之前需要对JVM里的内存空间有所了解,可以查看[博学谷学习记录]超强总结,用心分享|架构 运行时数据区_code只是爱好的博客-优快云博客时间、地点、人物1)我们先把所有的收集器做个汇总:2)一些规律新生代都是标记 - 复制算法,老年代采用标记 - 整理,或清除(CMS)历史性的收集器大多针对某个代,但是G1,以及未来的ZGC都是全代可用没有绝对好用的收集器,需要在 吞吐量、延迟性、内存占用量上做权衡数据分析、科学计算等场合,偏重吞吐量。

weixin_44132970的博客 579

【车载以太网】【AVB/TSN】IEEE802.1Qav队列及转发协议

目录 一、概述 二、优先级排队算法 三、基于信用的流量整形算法 一、概述 IEEE 802.1Qav 队列及转发协议(Qav)针对不同数据流选择不同的传输选择算法来保障对时间敏感的 AV 数据流的实时传输。为了避免传统的异步以太网数据流量与 AVB 流量之间对网络资源的竞争,AVB 交换机内使用优先级排队算法和基于信用的流量整形算法实现数据流的调度。 二、优先级排队算法 优先级排队算法主要用于传统以太网数据流(BE, Best Effort)的调度传输,BE 流通过基于优先级...

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4687

Jvm专讲之垃圾回收算法和垃圾回收器

本章详细讲解常见的垃圾回收算法(复制算法、标记-整理算法、标记-清除算法)、垃圾回收器(Serial、Parallel Scavenge、ParNew、CMS、G1)

落雪 1312

SDMA 如何实现设备对主机内存的访问

摘要:SDMA(System Direct Memory Access)是PCIe设备直接访问主机内存的核心机制,使外设无需CPU干预即可高效读写系统RAM。其实现原理包括:设备作为主控发起DMA请求,通过PCIe Memory TLP访问主机物理地址;完整通路涉及驱动分配DMA安全内存、设备配置、地址转换(IOMMU)和中断通知等步骤;关键技术涵盖地址类型(HPA/IOVA)、TLP格式、缓存一致性和安全防护机制。SDMA广泛应用于GPU、网卡、NVMe等高性能场景,是现代异构计算的基础技术,需软硬件协同

MHD0815的博客 240

Vue - 快速入门,这一套就够了!(Vue core + 案例 + 效果演示)

前置条件:掌握 HTML、CSS、JavaScript、AJAX.工具:VsCode.插件:Live Server(浏览器实时预览)Ps:建议都提前下载下来,没网的时候也能用.

CYK_byte的博客 4万+

JVM学习《垃圾回收算法和垃圾回收器》

因此就出现了一种标记-整理算法(Mark-Compact)算法,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录(主要 是处理漏标问题),这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。

GQ_666的博客 1631

【UNet 改进 | 注意机制篇】UNet引入CA注意力机制(2021 CVPR),二次创新

在医学图像分割任务中,病灶区域往往形态各异、边界模糊,且经常与周围组织的对比度较低,这要求模型具备极强的特征提取和细节辨别能力。传统的U-Net网络虽然通过跳跃连接融合了多尺度特征,但在处理复杂语义和精细边缘时仍有不足,尤其是在捕获特征时常常忽略位置信息。为了解决这些痛点,本文引入了在计算机视觉领域表现出色的 CA(Coordinate Attention,协调注意力)机制。CA 巧妙地将位置信息嵌入到了通道注意力中,通过水平和垂直两个方向的一维池化,同时捕获长距离依赖和精确的位置坐标。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 185

jvm垃圾回收算法和垃圾回收器

垃圾回收算法 jvm垃圾回收算法包括复制算法、标记清楚算法和标记整理算法,它们都基于分代收集理论。所谓分代收集理论,可以理解为jvm根据对象的生命年龄将他们分在不同的内存模块,也就是熟知的新生代和老年代。由于新生代存储的对象大部分都是朝生夕死的对象,一般使用复制算法,只需要付出少量的复制成本就能满足了。而老年代的对象生命周期都比较长,一般会选择标记-清楚或者标记-整理算法。复制算法是比其他两种算法快10倍以上的。 标记-复制算法 复制算法是将内存区域划分为两个模块,如下图,在内存被整理前,左边的内存区

weixin_36279234的博客 1120

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JVM性能参数优化及JVM垃圾回收器和JVM垃圾回收算法

JVM性能参数优化及JVM垃圾回收器和JVM垃圾回收算法 前言介绍:一个项目的完美运行,是离不开jvm的优化的,对于一些有经验的程序员来说,由于每个项目的差异,会根据项目的加载情况,做参数调整以及垃圾回收器的选择,下面介绍了一些参数的优化及垃圾回收器的选择和算法介绍,供自己以后参考 一,Java虚拟机基本结构: 类加载子系统:  负责从文件系统或者网络中加载Class...

lijian12388806的博客 2605

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JVM垃圾回收算法和垃圾回收器

JVM的垃圾回收机制随着Java的发展不断进步,从最初的单线程GC到现在的多线程并发GC,每一代GC算法都在努力平衡性能、停顿时间和内存管理的需求。现代的GC算法如ZGC和Shenandoah GC,已经能够实现极低的停顿时间,满足高性能计算和大规模应用的需求。

诗人不写诗 779

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

详解JVM 的垃圾回收算法和垃圾回收器

开篇 我们知道JVM的垃圾回收机制实际上是对JVM内存的操作,回收的目的是为了避免内存溢出和内存泄漏的问题。而JVM内存由方法区、堆、虚拟机栈、本地方法栈以及程序计数器5块区域组成,虚拟机栈、本地方法栈、程序计数器是随着Java线程建立而建立,当Java 线程完成之后这三个部分的内存就会被释放掉。 而方法区和堆属于共有线程,是随着JVM启动而建立的,而且这两个区域与另外三个区域也有所不同,一个接口中有多少个实现类(方法区)以及每次程序运行需要创建多少对象(堆)是动态的,也就是说在程序运行时才能知道。..

HongYu012的博客 497

JVM之垃圾回收算法和垃圾回收器(大厂收割机)

三种颜色假设现在有白、灰、黑三个集合(表示当前对象的颜色),其遍历访问过程为:什么是根?根就可以理解为,标记清除(Mark-Sweep)标记压缩(标记清除的升级)(Mark-Compact)复制算法(Coping)三种算法在垃圾回收器中搭配使用。目前的垃圾回收器总共十种:其中serial和serial old有stop the world 简称stw,即停止其他业务线程,只进行垃圾回收线程的执行;并且是单线程的。serial是单线程的,如下:ps和po是多线程的,如下图:ParNew与ps、po区别不大,也

MrYushiwen的博客 2083

JVM的垃圾回收算法和垃圾回收器

一:JVM的垃圾回收算法? 1.标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。 2.标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉这一端边界以外的内存 3.复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。 缺点:内存使用率不高,只有原来的一半。 4.分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,

weixin_52014130的博客 570

JVM中的垃圾回收算法和垃圾回收器

从根对象(如栈引用、静态变量等)出发,遍历所有可达对象并标记为 “存活”。:遍历整个内存区域,回收所有未被标记的对象(即垃圾),释放其占用的内存。实现简单,不需要移动对象。效率低,记和清除过程都需要遍历所有对象,耗时较长,尤其在对象数量多的时候。回收后会产生大量不连续的内存碎片,可能导致后续大对象无法分配内存(即使总空间足够)。

weixin_42294525的博客 1041

JVM垃圾回收器和回收算法

浅谈JVM算法和垃圾回收器

qlxin2080的博客 206

JVM垃圾回收算法和回收器

JVM垃圾回收算法和垃圾回收器 判断对象的存活: 引用计数法,优点,快方便,简单,缺点对象互相引用,很难判断该对象是否回收 可达性分析(java中使用): 通过GCRoots,当一个对象到GCRoots没有任何引用链相连,则证明此对象不可用 finalize,使对象不被jvm回收,但是jvm不能保证 各种引用 强引用:=赋值的 软引用SoftReference: 垃圾回收器在内存充足的情况下不去回...

shrek的博客 199

jvm内存分区、垃圾回收算法和垃圾回收器

jvm垃圾回收算法&垃圾回收器代垃圾收集器特点jvm默认的垃圾回收器几种比较推荐的垃圾回收器组合 代垃圾收集器特点 所有新生代垃圾收集器,都使用复制算法,都会发生stop-the-world。由于绝大多数对象的生命周期通常比较短,在新生代被回收的可能性很大,新生代的垃圾回收通常可以回收大部分对象,因此采用复制算法效率更高。 parnew和parallel scavenge区别 ParNew 与 Parallel Scavenge的一个主要区别是,ParNew可以与CMS进行搭配使用。 “ParNe

u011624157的专栏 180
上一篇: java高级---->Java动态代理的原理
下一篇: Java 枚举
奇迹摘星w
博客等级 码龄6年 1844粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值