「JVM基础」——垃圾回收基础(GC相关)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「JVM基础」——垃圾回收基础(GC相关)相关的知识,希望对你有一定的参考价值。
参考技术A当内存中的某一个对象无法找到任何引用的时候,这个对象就是一个垃圾对象。
内存泄露(memory leak),是指程序中已动态分配的堆内存由于某种原因程序未将其释放或无法释放,造成了内存的浪费,导致程序运行速度减慢甚至程序崩溃等严重后果。
STW即stop the world ,指的是JVM进行GC时会暂停所有业务线程。
给每一个对象添加一个引用计数器,t每当有新的引用时,计数器+1,引用结束后计数器-1。任何时刻计数器为0的对象都是不被引用的。
优点:
1. 引用计数算法在回收垃圾时具有实时性。当一个对象的引用为0的时候会被直接回收,无需等待特定时间就可以释放内存。
缺点:
1.当出现对象之间循环引用的时候,垃圾回收期无法确定这些对象是否是垃圾,因此无法回收循环引用的对象。(内存泄漏)
从GC Roots节点(起始节点)出发向下搜索,如果没有任何引用链(既GC root不可达),则证明此对象不可用
tracing GC的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。GC roots这组引用是tracing GC的起点。要实现语义正确的tracing GC,就必须要能完整枚举出所有的GC roots,否则就可能会漏扫描应该存活的对象,导致GC错误回收了这些被漏扫的活对象。
将需要清除的对象标记出来,清除掉。
标记清除算法的实现分为两个阶段:
优点:
只对存活的对象进行标记。标记完毕后再扫描整个空间中未被标记的对象进行回收。该算法不需要进行对象的移动,只需对不存活的对象进行处理,效率高。
缺点
因为直接回收掉了不存活对象,未对内存进行整理,因此会产生内存碎片。内存碎片较多时,当大对象进入内存空间,无法为期分配足够的内存会提前触发GC。
将内存一分为二,每次使用一个区域。当触发gc时,将存活对象复制到另一区域,清除原区域。
它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集合(GC Roots)中扫描活动对象,并将每个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。
优点 :
缺点:
标记清除算法的优化实现,清除垃圾对象的同时压缩空间。
该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后再清理掉无用对象
优点:
1.因为对空间进行了整理,因此不会产生内存碎片。
缺点
1.因为扫描了两次,并且在清除的基础上还增加了整理,因此时间成本高。
jvm基础--GC垃圾回收机制
jvm基础–GC垃圾回收机制
文章目录
1.jvm基础–GC垃圾回收机制
参考:
https://www.cnblogs.com/nantang/p/5674793.html
https://www.cnblogs.com/fenghun/p/5029535.html
以上是关于「JVM基础」——垃圾回收基础(GC相关)的主要内容,如果未能解决你的问题,请参考以下文章
03JVM调优调优--2.基础:参数说明(堆参数说明),垃圾收集器(前置知识:垃圾回收算法,GC种类),垃圾收集器(种类,相关介绍)