大型商城网站建设方案安卓软件免费下载
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:29
当前位置: 首页 > news >正文
大型商城网站建设方案,安卓软件免费下载,广州信息流推广公司排名,求职网站建设本文详细介绍了在 JVM 中如何判断哪些对象是需要回收的#xff0c;以及不同的垃圾回收算法以及优缺点。点击上方“后端开发技术”#xff0c;选择“设为星标” #xff0c;优质资源及时送达上篇文章详细介绍了 JVM 的结构以及其内存结构#xff0c;需要阅读请移步。本文主要…本文详细介绍了在 JVM 中如何判断哪些对象是需要回收的以及不同的垃圾回收算法以及优缺点。点击上方“后端开发技术”选择“设为星标” 优质资源及时送达上篇文章详细介绍了 JVM 的结构以及其内存结构需要阅读请移步。本文主要讲解 JVM 体系中的垃圾收集子系统用到的内存回收算法。八股文总是忘一张图牢记JVM内存结构|金三银四系列2023-02-13哪些对象需要回收在进行垃圾回收之前第一件事就是确定哪些对象还存活着哪些对象已死需要被回收。1.引用计数算法很多判断对象是否存活的算法是这样的给对象中添加一个引用计数器每当有个地方引用它时计数器值就加1当引用失效时计数器值就减1任何时刻计数器为0的对象就是不可能再被使用的该对象将被回收。客观的说引用计数法实现简单效率高。但是没有主流JVM选择引用计数法管理内存因为他无法解决循环引用的问题。如下图当三个对象都不在使用时因为相互的引用关系并不会置为0所以难以被回收。并且引用计数器要求在每次因引用产生和消除的时候伴随一个加法操作和减法操作对系统性能会有一定的影响。2.可达性分析算法主流JVM都是称通过可达性分析来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为GC Roots的对象作为起始点从这些节点开始向下搜索搜索所走过的路径称为引用链( Reference Chain)当一个对象到GC Roots 没有任何引用链相连用图论的话来说就是从GC Roots 到这个对象不可达) 时则证明此对象是不可用的。如图所示深灰色的对象虽然互相有关联但是它们到 GC Roots 是不可达的所以它们将会被判定为是可回收的对象。GC Root 对象Java中有一组GC Roots对象它们是被垃圾回收器直接管理的对象。GC Roots对象是垃圾回收的起始点垃圾回收器会从这些对象开始遍历所有的对象并标记出所有存活的对象未被标记的对象即为可回收对象。在Java中可以作为GC Root对象的包括以下几类虚拟机栈栈帧中的本地变量表中引用的对象。虚拟机栈中保存着每个线程执行方法时的现场信息包括局部变量、操作数栈、方法出口等。栈帧中的本地变量表中存放着方法中定义的局部变量和参数如果局部变量或参数中引用了某个对象则该对象被认为是一个GC Root对象。方法区中类静态属性引用的对象。类似于栈帧中的本地变量表类中定义的静态属性也会保存引用对象。因为静态属性是属于类的所以这些引用对象也被认为是GC Root对象。方法区中常量引用的对象。常量池中保存着编译器生成的各种字面量和符号引用例如字符串常量、类和接口的全限定名、字段和方法的名称和描述符等。如果常量池中引用了某个对象则该对象被认为是GC Root对象。本地方法栈中JNI即Java Native Interface引用的对象。JNI是Java提供的一种机制用于调用本地的C/C代码。如果JNI中引用了某个对象则该对象被认为是GC Root对象。需要注意的是不是所有的对象都可以作为GC Root对象。例如普通的对象实例和数组元素就不可以作为GC Root对象。只有与Java虚拟机内存管理有关的对象才可以作为GC Root对象因为它们直接或间接地引用了所有其他对象。垃圾回收算法1.标记-清除算法最基础的收集算法是标记-清除算法(Mark-Sweep)如同它的名字一样算法分为“标记”和“清除”两个阶段首先标记出所有需要回收的对象可达性分析。在标记完成后统一回收所有被标记的对象。之所以说它是最基础的收集算法是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。优点实现简单算法简单、容易实现与保守式GC 算法兼容有效处理不连续的内存空间不需要移动对象因此不会浪费时间和空间。不足效率问题标记和清除两个过程的效率都不高且需要进行两次扫描第一次标记垃圾对象第二次清除垃圾对象。空间问题标记清除之后会产生大量不连续的内存碎片空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作从而导致频繁的内存分配和回收。2.标记-压缩算法标记-整理标记压缩算法Mark-Compact是一种垃圾回收算法主要用于老年代的垃圾回收。它的基本思想是在标记出所有存活对象之后将所有存活的对象压缩到内存的一端将所有空闲的内存空间释放出来从而减少内存的碎片化。标记压缩算法与标记-清除算法的区别在于标记-清除算法只是标记出存活和垃圾对象并将垃圾对象空间释放出来因此容易造成内存的碎片化。而标记压缩算法则是将存活对象压缩到一端并将空闲的内存空间释放出来解决了内存碎片的问题。标记压缩过程标记压缩算法的具体实现过程如下标记阶段从一组 GC Roots 开始标记出所有存活的对象并将这些存活对象的标记信息保存在对象头中。压缩阶段将所有存活的对象移动到内存的一端释放出所有空闲的内存空间。在移动对象时需要更新所有引用对象的指针确保它们指向对象移动后的位置。更新指针由于移动对象的过程中可能会修改引用对象的指针因此需要扫描整个堆内存将所有指向移动过的对象的指针进行更新。这不算一个阶段由于需要更新所有引用对象的指针因此在多线程情况下需要使用屏障技术来确保线程安全性。优点可以有效地处理不连续的内存空间。不会产生内存碎片因为所有存活的对象都被移动到一端。缺点压缩阶段需要移动存活的对象占用了系统的消耗并且如果标记对象过多的话损耗可能会很大会浪费时间和空间。在标记对象相对较少的时候效率较高。需要进行两次扫描第一次标记存活对象第二次移动存活对象。为什么没有清除阶段标记-整理算法确实只有标记和整理两个阶段没有显式的清除阶段。在整理阶段垃圾回收器会将所有存活的对象向一端移动将空间释放到另一端这样空间的连续段就被重建了。因此整理阶段的同时也具有清除的功能所有未被移动的对象都是垃圾可以直接被视为已经清除了。不过在实现时标记-整理算法的整理阶段可能需要把清除的操作分散在整个过程中进行因此整理阶段通常会和清除阶段结合在一起实现起来会更加高效。但是从逻辑上来说标记-整理算法只需要标记和整理两个阶段没有显式的清除阶段。复制算法为了解决效率问题一种称为“复制”(Copying) 的收集算法出现了它将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存话着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收内存分配时也就不用考虑内存碎片等复杂情况只要移动堆顶指针按顺序分配内存即可实现简单运行高效算是用空间来换时间的思维。优点可以有效地处理大部分对象都是临时对象的情况例如新生代中的对象。不会产生内存碎片因为所有存活的对象都被复制到一个新的内存空间中。缺点需要一半的内存空间用于复制存活的对象会造成空间浪费。当有大量存活的对象时复制效率会降低。4.分代收集算法目前主流JVM垃圾收集都采用“分代收集”(Generational Collection) 算法这种算法并没有什么新的思想只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中每次垃圾收集时都发现有大批对象死去只有少量存活那就选用复制算法只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保如果有空间通过分配担保机制进入老年代就必须使用“标记一清理”或者“标记一整理”算法来进行回收。对于新生代和老年代来说通常新生代回收的频率很高但是每次回收的时间都很短而老年代回收的频率比较低但是被消耗很多的时间。为了支持高频率的新生代回收虚拟机可能使用一种叫做卡表Card table的数据结构卡表为一个比特位集合每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用。这样以来新生代GC时可以不用花大量时间扫描所有老年代对象来确定每一个对象的引用关系而可以先扫描卡表只有当卡表的标记为1时才需要扫描给定区域的老年代对象而卡表为0的所在区域的老年代对象一定不含有新生代对象的引用。卡表中每一位表示老年代4KB的空间卡表记录为0的老年代区域没有任何对象指向新生代只有卡表为1的区域才有对象包含新生代对象的引用因此在新生代GC时只需要扫面卡表为1所在的老年代空间使用这种方式可以大大加快新生代的回收速度。优点根据对象的生命周期将堆分为多个区域使不同区域采用不同的回收算法可以提高回收效率。可以避免全局垃圾回收的情况从而减少了暂停时间。缺点需要维护多个堆区域增加了复杂性。可能会出现对象晋升的情况导致老年代的内存压力增大。5.分区算法分代算法将按照对象的生命周期长短划分成两个部分分区算法将整个堆空间划分成不同连续的区域。每个小区间都独立使用采用不同的垃圾回收算法独立回收。例如可以将新生代分成多个区域每个区域采用不同的复制算法而老年代则采用标记-整理或标记-清除算法。这种算法的好处是可以控制一次回收多少个小区间。一般来说在相同的条件下堆空间越大一次GC时所需要的时间就越长从而产生的停顿也越长。为了更好地控制GC产生的停顿时间将一块大的内存区域分割为多个小块根据目标的停顿时间每次合理的回收若干个小区间而不是整个堆空间从而减少一次GC所产生的停顿。这算是一种分治思路。最后欢迎大家提问和交流。如果对你有帮助欢迎点赞、评论或分享感谢阅读无需注册直接体验ChatGPT附注册ChatGPT详细教程2023-02-14 一文掌握单机Redis、哨兵和Redis Cluster的搭建建议收藏2023-02-11 Dubbo重点SPI的自适应扩展原理原创2023-01-11
- 上一篇: 大型企业网站设计案例邯郸单位网站建设
- 下一篇: 大型网站的建设怎么做网站网站的代理
相关文章
-
大型企业网站设计案例邯郸单位网站建设
大型企业网站设计案例邯郸单位网站建设
- 技术栈
- 2026年03月21日
-
大型企业网络拓扑图绵阳做最好优化网站的
大型企业网络拓扑图绵阳做最好优化网站的
- 技术栈
- 2026年03月21日
-
大型门户网站设计解决方案oa系统入口
大型门户网站设计解决方案oa系统入口
- 技术栈
- 2026年03月21日
-
大型网站的建设怎么做网站网站的代理
大型网站的建设怎么做网站网站的代理
- 技术栈
- 2026年03月21日
-
大型网站技术方案最新的军事新闻
大型网站技术方案最新的军事新闻
- 技术栈
- 2026年03月21日
-
大型网站技术架构核心原理与案例分析山东济宁网站建设
大型网站技术架构核心原理与案例分析山东济宁网站建设
- 技术栈
- 2026年03月21日






