首页 > 编程语言 >JVM(十三)分代收集、增量收集以及分区算法

JVM(十三)分代收集、增量收集以及分区算法

时间:2023-07-12 10:46:34浏览次数:30  
标签:收集 对象 回收 算法 分代 线程 垃圾 JVM

JVM(十三)分代收集、增量收集以及分区算法


1 分代收集算法

​ 前面的所有算法中,没有一种算法能够完全替代其他算法,它们都有自己独特的优势和特点,分代收集算法应运而生:

  • 分代收集算法对不同生命周期的对象采取不同的收集方式,一般划分为新生代和老年代,以便提高回收效率

    在Java程序运行的过程中,会产生大量的对象,其中有一些对象是与业务信息相关,比如HTTP请求中的Session对象、线程、Socket连接,这类对象与业务直接挂钩,因此生命周期较长

    而还有一些对象,主要是程序运行过程中产生的临时变量,这类对象的生命周期较短,比如String对象,由于不可变性系统会产生大量的这些对象,有些甚至只用一次即可回收

  • 目前几乎所有的GC垃圾回收器都是采用分代收集算法(Generational Collection)执行垃圾回收的:

    • 年轻代区域相对老年代小,对象生命周期短、存活率低(朝生夕死);而复制算法的效率只和当前存活对象的大小有关,因此年轻代采用复制算法进行垃圾回收,复制算法内存利用率不高的问题,通过两个幸存者区的设计得到了缓解

      默认情况下,新生代和老年代的大小比例为1:2,而新生代中,伊甸园区:幸存者0区:幸存者1区为1:1:8,因此复制算法“浪费”的空间大小仅占内存的1/30,通过这样的设计得到了缓解

    • 老年代区域较大,对象的生命周期长、存活率高,回收不及年轻代频繁,这种情况存在大量存活率高的对象,复制算法明显变得不合适,一般由标记-清除或者标记-清除标记-压缩算法的混合实现

      • Mark标记阶段的开销与存活对象的数量成正比
      • Sweep清除阶段的开销与所管理区域的大小成正比
      • Compact压缩整理阶段的开销与存活对象的数据成正比

      以HotSpot的CMS收集器为例,CMS是基于Mark-Sweep实现的,对于对象的回收效率很高,对于碎片问题,CMS采用基于Mark-Compact算法的Serial Old回收器作为补偿措施:当内存回收不佳(内存碎片问题导致Concurrent Mode Failure)的时候,将采用Serial Old执行Full GC以达到对老年代内存的整理

2 增量收集算法

​ 上面的现有算法,在垃圾回收的过程中,会使应用软件处于一种Stop The World的状态,所有的线程都会被挂起,暂停一切正常工作等待垃圾回收的完成,时间一长就会严重影响用户体验和系统的稳定性增量收集算法则解决了这个问题:

  • 增量收集算法让垃圾收集线程和应用程序线程交替执行,每次垃圾收集线程都只收集一小片区域的内存空间,接着切换为应用程序线程,依次反复直到垃圾收集完成

  • 总的来说,增量收集算法的基础仍是传统的标记-清除复制算法增量收集算法对线程间的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作

  • 优点:使用这种方式,在垃圾回收过程中,间歇性地还执行了应用程序代码,所以能够减少系统的停顿时间。

  • 缺点:因为线程的切换和上下文的消耗,会使得垃圾回收的成本上升,造成系统吞吐量的下降

3 分区算法

image-20230709162041766
  • 一般来说,在相同条件下,堆空间越大一次GC所需要的时间就越长,有关GC的停顿也就越长。为了更好地控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间(分配给垃圾回收线程的时间),每次合理地回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿
  • 分代收集算法按照对象的生命周期长短划分成两个部分,分区算法则将整个堆空间划分成连续的不同小区间
  • 每一个小区间都独立使用,独立回收,这种算法的好处就是可以控制一次回收多少个小区间

标签:收集,对象,回收,算法,分代,线程,垃圾,JVM
From: https://www.cnblogs.com/tod4/p/17546913.html

相关文章

  • JVM(十二)垃圾清除阶段算法
    JVM(十二)垃圾清除阶段算法垃圾清除阶段是指,当成功区分出内存区域中的存活对象和死亡对象之后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配内存。目前在JVM中比较常见的三种垃圾收集算法是标记-清除算法(Mark-Sweep)......
  • JVM(十一)垃圾回收概述和垃圾标记阶段的算法
    JVM(十一)垃圾回收概述和垃圾标记阶段的算法1Java垃圾回收概述什么是垃圾?垃圾是在程序运行过程中不被任何指针指向的对象,这个对象就是需要被回收的垃圾为什么要进行垃圾回收?如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占内存空间会一直保存到应用程序结束,被......
  • 初识虚拟机JVM
    初识JVM(JAVAVirtualMachine)​ JVM是一种规范,可以使用软件来实现,也可以使用硬件来实现,就是一个虚拟的用于执行bytecodes字节码的计算机。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。​ JVM负责将java字节码解释运行,边解释边运行,这样,速度就会受到一定的影......
  • 《Web安全基础》02. 信息收集
    目录1:CDN绕过1.1:判断是否有CDN服务1.2:常见绕过方法1.3:相关资源2:网站架构3:WAF4:APP及其他资产5:资产监控本系列侧重方法论,各工具只是实现目标的载体。命令与工具只做简单介绍,其使用另见《安全工具录》。1:CDN绕过CDN(ContentDeliveryNetwork,内容分发网络)是构建在现有网络......
  • JVM(六)堆
    JVM(六)堆1核心概述几乎所有的对象实例和数组都是分配在堆上的(栈不会存储数组和对象,栈帧中的局部变量表只会存储指向堆中实例的引用)一个Java进程对应一个JVM实例,一个JVM实例只存在一个堆内存,堆也是内存管理的核心区域堆和方法区是线程共享的,但堆也有划分的线程私有缓冲区......
  • JVM常用工具分析
    JVM基础分析、故障解决工具常用jdk工具jps:JvmProcessStatusTool显示系统内全部的虚拟机进程;jstat:JvmStatisticsMonitoringTool动态收集指定进程运行时数据;jinfo:ConfigurationInfoForJava实时显示或调整虚拟机的配置信息;jmap:MemoryMapForJava生......
  • jvm学习-垃圾回收的一些知识点
    部分图片和描述来自参考资料,非原创对象回收处理过程如何标定对象是否存活两种方法:引用计数方法可达性分析算法引用计数方法就和ReentrantLock可重入锁一样,内部维系着一个state,当同个线程重入结束后就会归零,但是这种方法有点问题publicstaticvoidte......
  • JVM 面试题
    JVM面试题JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与......
  • Java虚拟机(JVM):第四幕:自动内存管理 - 经典垃圾收集器
    前言:如果说收集算法是内存回收的方法论,那么垃圾收集器则是内存回收的实践者。整哥Java堆:FullGC。1、Serial收集器:最基础、历史最悠久的收集器,这是一个单线程工作的收集器。2、ParNew收集器:是Serial收集器的多线程并行版本,可以说是跟Serial完全一样。CMS收集......
  • JVM系列---【Arthas的下载与使用】
    Arthas的下载与使用使用jdk自带的工具,一般需要开通一些端口,添加一些jvm启动参数,比较麻烦,生产环境一般也不让重启,所以我们现在用Arthas更方便。调优的目的主要为了减少GC,因为每次GC都会调用STW机制(stoptheworld),而STW会停掉用户线程,因此频繁触发STW就会给用户感觉网站很卡。尤......