当前位置: 首页 > 科技观察

JVM系列JVM垃圾回收算法知识_0

时间:2023-03-14 18:44:46 科技观察

今天继续给大家分享JVM垃圾回收算法知识。JVM垃圾回收算法主要包括标记去除、复制算法、标记排序、分代回收四种,下面将一一介绍。1.Mark-Sweep作为最基本的垃圾回收算法,Mark-Sweep经历了标记和回收两个阶段。标记:遍历内存区域,标记要回收的对象。回收:再次遍历内存区域,回收标记对象占用的内存。缺点:需要遍历两次内存区域,效率低。由于JVM存储在逻辑上是连续的,在物理上是不连续的,标记-清除算法可能会产生大量的内存碎片。当JVM需要比较大的内存空间,找不到合适的内存空间时,就会触发下面的Onegarbagecollection操作。2.复制算法(Copy)复制算法主要是为了解决mark-clear算法遍历和内存碎片的缺点。是在它的基础上改进的。它会根据容量将可用内存分成两个大小相等的块。一次只能使用其中一个。当正在使用的内存空间不够时,会将存活的对象复制到另一块空内存中,然后清理一次当前内存空间。新一代复制算法中两个幸存者区域(From,To)的不间断交换是最典型的用法。新生代的内存空间比例为8(Eden):1(ToSurvivor):1(SurvivorFrom)。优点回收内存时,不会产生内存碎片。回收时只需要移动栈顶指针,按顺序分配内存即可。实现简单,一次只回收两块内存中的一块,效率高。复制算法执行后,时空连续。缺点:一次只能使用已分配内存的一半,内存最大可用也只有一半。3.Mark-Compactmark-compact算法主要是为老年代设计的。执行过程:标记:标记需要回收的对象。整理:让幸存的对象移动到内存的一端。在构造的过程中,之前的对象在虚拟机栈中的引用地址也随之变化,最后直接清理非存活对象的内存空间。优点:没有内存碎片(与标记清除算法相比)。内存利用率减半没有消耗(复制算法对比)。缺点:效率略低于标记复制算法。在组织存活对象的过程中,由于存活对象的位置发生变化,需要调整该对象在虚拟机栈中的引用地址,需要全程挂起用户线程,STW(StopTheWorld)。4.分代收集算法严格来说,分代收集不能算是一种新的垃圾收集算法。其实分代收集只是根据对象的存活时间,新生代和老年代分别用于不同的内存区域。相应的算法。目前市面上商用的虚拟机大多采用分代收集算法。新生代:每次都有大量对象死亡,因为老年代作为内存保证,更多采用的是复制算法。老年代:对象长期存活,可以使用标记排序和标记清除算法。5.三种垃圾收集算法的对比比较参数MarkClearMarkCollat??eMarkCopySpeedModerateSlowestFastestSpaceoverheadless(会产生碎片)Less(不会产生碎片)2timesoverhead移动对象是否适合现场老一代老新一代