博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jvm垃圾回收的过程
阅读量:5081 次
发布时间:2019-06-12

本文共 893 字,大约阅读时间需要 2 分钟。

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

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中实现了多种垃圾回收器,在另外的博客中会提及

转载于:https://www.cnblogs.com/liwangcai/p/10752686.html

你可能感兴趣的文章
.NET中那些所谓的新语法之四:标准查询运算符与LINQ
查看>>
Windoms10 打开软件后显示不完全
查看>>
LeetCode14- 最长公共前缀
查看>>
java相对路径、绝对路径及类路径
查看>>
企业微信公众平台建设指南
查看>>
ibatis sqlmap.xml 自动提示
查看>>
PHP的session存储对PHP运行环境的影响
查看>>
数据库分表算法
查看>>
一、SqlServer查询今天的数据-多写法对比性能问题
查看>>
Xshell远程连接服务器
查看>>
python requests库学习笔记(上)
查看>>
Linux网络命令
查看>>
API OpenGL输出土元函数及相关子程序
查看>>
关键词提取
查看>>
【摘抄】提升web程序性能-前端
查看>>
scikit-learn的梯度提升算法(Gradient Boosting)使用
查看>>
在aspx程序使用CustomValidator验证
查看>>
OBJECTPROPERTY与sp_rename更改对象名称
查看>>
密码策略设置密码过期天数
查看>>
在SSMS查询分析器中显示行号
查看>>