在前面的文章中,我们介绍过JVM垃圾回收机制负责的是堆和方法区的内存。
参考:http://blog.csdn.net/u011983531/article/details/49227013

在本篇中,将重点关注堆和方法区的内存何时会被回收。
简单来说,当一个对象已经死亡时,就会对其进行回收,那么根据什么方法来判断对象是否死亡呢?

一.引用计数算法

算法描述:给对象添加一个引用计数器,当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是死亡的。

  引用计数算法很简单,判断效率也很高,但是JVM没有选用它来管理内存。原因是什么呢?主要是因为它很难解决循环引用的问题。

二.根搜索算法

算法描述:通过一系列名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径称为“引用链”,当一个对象到“GC Roots”没有任何引用链想连时,则证明此对象是不可用的。

JVM中,可以作为“GC Roots”的对象包括下面几种:

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象
    换句话说,就是当前所有正在被调用的方法的引用类型的参数、局部变量、临时值。

  2. 本地方法栈中JNI(即一般说的native方法)引用的对象

  3. 方法区中的类静态属性引用的对象
    Java类中的静态变量

  4. 方法区中的常量引用的对象
    Java类在运行时引用的常量、String常量池(StringTable)里的引用

对于上面的解释,可能很多人都还不是很明白跟搜索算法是怎么工作的,下面用另一种方法解释一遍。
  所谓“GC roots”,或者说tracing GC的“根集合”,就是一组必须活跃的引用(注:是引用,不是对象)。
Tracing GC的根本思路就是:给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活,其余对象(也就是没有被遍历到的)就自然被判定为死亡。Tracing GC的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。 GC roots这组引用是tracing GC的起点。
  所以,要实现语义正确的tracing GC,就必须要能完整枚举出所有的GC roots,否则就可能会漏扫描应该存活的对象,导致GC错误回收了这些被漏扫的活对象。

2.JVM垃圾回收机制-什么时候回收内存相关推荐

  1. JVM垃圾清理机制详解 ✨ 每日积累

    JVM垃圾清理机制详解 jvm内存结构中有一块地方叫做堆内存,里面存放着我们应用创建的对象,但是我们堆内存有限,对象在运行的时候持续创建,jvm有垃圾清理机制来清理对象确保堆内存的可用空间. 清理流程 ...

  2. Java教程分享:JVM垃圾回收机制之对象回收算法

    前言 在前面的文章中,介绍了JVM内存模型分为:堆区.虚拟机栈.方法区.本地方法区和程序计数器,其中堆区是JVM中最大的一块内存区域,在Java中的所有对象实例都保存在此区域,它能被所有线程共享. 在 ...

  3. JVM分代回收机制和垃圾回收算法

    JVM系列文章目录 初识JVM 深入理解JVM内存区域 玩转JVM对象和引用 JVM分代回收机制和垃圾回收算法 细谈JVM垃圾回收与部分底层实现 Class文件结构及深入字节码指令 玩转类加载和类加载 ...

  4. 【JVM】JVM垃圾回收机制GC

    文章目录 JVM垃圾回收机制 一.堆内存区域划分 1.1内存分配策略 1.2永久代(Permanent Generation) 1.3元空间(MetaSpace) 二.标记算法 2.1引用计数算法 2 ...

  5. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  6. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  7. Node的垃圾回收机制与内存溢出捕获(上)

    Node的垃圾回收机制与内存溢出捕获 一.什么是Node的内存?   想必大家在用JavaScript开发的过程中,不太关心内存的管理,因为对于前端来说,浏览器的内存几乎不会出现用完的情况,因为所接触 ...

  8. 判断是否存在此对象_JVM的垃圾回收机制,判断对象是否死亡

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制 ...

  9. 细述 Java垃圾回收机制→How Java Garbage Collection Works?

    本文非原创,翻译自How Java Garbage Collection Works? 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动 ...

最新文章

  1. 10个Java 8 Lambda表达式经典示例
  2. android 浏览器对图片加载高度渲染问题
  3. 灵感编程:最大公约数算法解析
  4. linux系统文件查找实验报告,Linux 文件查找与打包
  5. 开源 , KoobooJson一款高性能且轻量的JSON框架
  6. python编程高手教程_写给编程高手的Python教程(01) 数据结构
  7. 设置eclipse代码自动补全功能
  8. 寻找新冠“解药”:在 10^60 化合物分子空间,他们用 AI 挖掘潜在药物
  9. 移动端vue实现部门结构功能_基于Vue的组织架构树组件
  10. OpenInfra中国日志愿者第三次会议召开
  11. 福利来了,axure8.1注册码
  12. 专注于开源数据科学软件的非营利基金会—— NumFOCUS 的来龙去脉(下)
  13. arcgispython空间插值_python2 使用arcpy自定义GIS工具箱,实现excel读取、空间插值
  14. 云计算怎么学?学习云计算有什么用?
  15. win10 excel编辑无响应问题解决方法
  16. Tik Tok月活12亿 Tiktok和抖音有什么不同 ?
  17. 提高网吧上座率,TG-NET网吧光纤万兆方案
  18. matlab提取图像特征程序,图像特征提取matlab程序
  19. 红米手机H5布局压扁
  20. 25-陈庆祥-词法分析

热门文章

  1. 如何把token存储到本地和headers中
  2. 【ubuntu】安装vmwaretools后还是不能复制粘贴---实测解决。
  3. MFC Windows 程序设计[323]之噪声特征流显示gribble2(附源码)
  4. 敏捷回顾会:经验教训的总结
  5. 如何查看Eclipse是32位还是64位?
  6. 修改人人商城服务器时间,修改收货地址 · 人人商城二次开发常用文档,超详细,微擎开发微擎二次开发【持续更新】 · 看云...
  7. 汉字Collection
  8. 绎维软件F-One获得B轮融资,华创资本领投,齐银基金跟投
  9. 彩色图像颜色和饱和度调整办法
  10. 破解excel格式保护