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

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

jvm垃圾回收的过程的更多相关文章

  1. JVM内存管理和JVM垃圾回收机制

    JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...

  2. JDK分析工具&JVM垃圾回收(转)

    转自:http://blog.163.com/itjin45@126/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/ ...

  3. 老李分享:jvm垃圾回收

    老李分享:jvm垃圾回收   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478 ...

  4. jvm - 垃圾回收

    jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回 ...

  5. JVM垃圾回收机制概述

    JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...

  6. JVM基础系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...

  7. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  8. JVM垃圾回收算法解析

    JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...

  9. jvm垃圾回收原理(转)

    原文链接:jvm垃圾回收原理 在jvm中堆空间划分为三个代:年轻代(Young Generation).年老代(Old Generation)和永久代(Permanent Generation).年轻 ...

随机推荐

  1. php中如何解决显示数据库中的内容乱码

    第一步: 第二步:在代码开始处加一行

  2. 多项式相关&&生成函数相关&&一些题目(updating...)

    文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...

  3. 关于页面传值页面的跳转,以及spring mvc 框架的流程问题

    list页面 1.点击页面后,进入后台的list方法中,通过findPage()查询数据的,findPage中含有findList(): 2.如果页面没有输入查询条件,那么则显示所有数据集合,如果页面 ...

  4. C# 中使用面向切面编程(AOP)中实践代码整洁(转)

    出处:https://www.cnblogs.com/chenug/p/9848852.html 1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则( ...

  5. sprintf()与sscanf()

    1.sprintf() sprintf()用于向字符串中写入格式化的数据,eg: int dSrc1 = 1; int dSrc2 = 2; char str[] = "hello" ...

  6. PI3HDX1204B

    PI3HDX1204B用于HDMI2.0 6Gpbs的中继器,它有可编程的高均衡,输出摆幅和去加重控制模式.当传输为6Gpbs时,最大的EQ是22dB. PI3HDX1240B的EQ,SW和去加重可以 ...

  7. Ubuntu 默认启动到命令行 12.04

    源文链接:http://my.oschina.net/jackguo/blog/85706 代码: sudo gedit /etc/default/grub 引用: GRUB_CMDLINE_LINU ...

  8. c 语言申明头文件和实现分开简单例子

    很多时候,看到很多c函数的声明和实现是分开的.声明放在头文件,实现却放在另一个文件,最后函数被其他文件调用. 下面以简单例子说明. 一.声明部分 /* test.h */ #include <s ...

  9. (转)memcached注意事项

    转自:http://www.kaifajie.cn/kaiyuan_qita/8656.html 1.   key值最大长度? memcached的key的最大长度是250个字符. 注意250是mem ...

  10. 中国剩余定理 (POJ 1006)

    http://poj.org/problem?id=1006      在<孙子算经>中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩 ...