zoukankan      html  css  js  c++  java
  • jvm垃圾回收的过程

    垃圾回收的过程分为两步:

    1.判断对象是否死亡

      (1)引用计数器法:

        ①每当有一个对象引用是,计数器加一,当计数器为0是对象死亡

        ②缺点:无法解决循环引用的问题,假设A引用B,B引用A,那么这两个对象将不会被回收,造成内存泄漏

      (2)可达性算法分析

        ①通过一系列可作为GC Roots的节点为起始点,从这些节点开始往下搜索,所走过的路径称为引用链。

        ②当一个对象到GC Roots节点没有引用链时,说明对象不可用

        ③可作为GC Roots节点的对象

          虚拟机栈中引用的对象

          本地方法栈中引用的对象

          方法区中静态变量引用的对象

          方法区中常量引用的对象

    2.垃圾回收算法进行回收

      (1)标记-清除:即直接将标记为死亡的对象清除,缺点是会产生垃圾碎片

      (2)标记-整理:即将可用的对象同意向一端移动,将边界外的对象清除

      (3)复制算法:即将堆分为了Eden,SurvivorFrom,SurvivorTo空间

        ①每次在Eden空间上分配对象

        ②SurvivorFrom空间为上次垃圾回收是还存活的对象

        ③SurvivorTo空间为本次垃圾回收是生存的对象存放的位置

        ④本次垃圾回收结束后交换SurvivorFrom与SurvivorTo

        ⑤复制算法需要担保空间,当有一个大的对象要分配,而Eden空间又不足时会直接分配到老年代

        ⑥在对象生存率较高时会进行大量的复制操作,降低效率

      (4)分代回收算法:根据新生代与老年代对象的特点而使用不同的垃圾会回收算法

        ①新生代:对象生存周期较短,只有少量的生存对象,适合使用复制算法

        ②老年代:对象生存周期较长,只又少量需要回收的对象,且无担保空间,所以使用标记-整理算法或者是标记-清除算法

    3.根据不同的垃圾回收算法在Jvm中实现了多种垃圾回收器,在另外的博客中会提及

  • 相关阅读:
    SpringMVC总结
    javaEE学习路线与目标
    mybatis逆向工程的注意事项,以及数据库表
    数据库权限表个表的关系
    Spring Security中html页面设置hasRole无效的问题
    StartUML的基础的使用,用例图,序列图
    oracle中文乱码问题解决
    Eclipse中的创建maven项目,无法添加src/main/java等source folder
    StarUML 系列,静态图与动态图,用例图,类图
    爬虫入门程序开门见山
  • 原文地址:https://www.cnblogs.com/liwangcai/p/10752686.html
Copyright © 2011-2022 走看看