前言

判断对象可被GC回收有两种办法分别是:引用计数算法根可达性算法

引用计数算法

引用计数算法是一个已经被淘汰的算法,它是给每个对象加一个计数器,当有其他对象引用该对象时,该对象的计数器加一,当这个引用失效时,计数器就会减一,当该对象的计数器为零时,就会认为该对象可以被所回收。

引用计数算法是一个简单并且高效的算法,但这种算法却有一个非常大的弊端。就是这种算法会造成对象的循环引用,导致即使这个对象不再被需要,仍然存在一个一直指向它的引用,使得计数器不为零,导致该对象无法被回收,造成内存空间的浪费。

例如:假设存在对象A与对象B,他们之间的引用关系如图所示:

即时A、B对象已经没有被其他对象所引用了,但他们之间仍然有一条引用指向对方,导致对象A、对象B的计数器都不为零,从而使得A、B对象都没法回收。

根可达性算法

根可达性算法是JVM默认的算法,他的原理就是定义一系列的根,我们把这些根称为:GC Roots。从GC Roots开始向下搜索,中间查找的路径被称为:引用链

当一个对象到GC Roots之间没有任何引用链相连接时,我们就认为这个对象可以被GC回收。

根可达性很好的解决了对象循环引用问题。

例如:

如上图所示,我们可以发现Object 6与Object 7、Object 8之间存在引用关系,但是他们到GC Roots之间没有任何一条引用链,因从Object 6、Object 7、Object 8都可被回收。

Java的四种引用类型

在上述判断对象在何时能被GC回收是,我们多次提到了引用,那大家一定好奇什么是引用?引用有分为那些类型?一下我们就一一列举。

什么是引用?

举个例子:假设我们创建了一个创建了一个User对象,就像这样:new User(),但是也仅仅是创建了一个对象,并没有办法访问它。如果我们要访问这个对象,就必须指定一个User类型变量来表示这个对象:User user = new User(),user又被叫做"引用","="是指user这个引用指向User对象。 所以,java里对象的引用就是一个类类型的变量指向创建出来的对象

引用有分为那些类型?

在Java中引用被分为四种类型:强引用、软引用、弱引用、虚引用

强引用

强引用是最频繁使用的一种引用,当一个对象具有强引用时,GC绝对不会回收这个对象。当内存空间不足,JVM宁愿抛出内存溢出错误,也不会随意回收强引用对象。

如果强引用对象不再使用,可以通过弱化的方式回收该对象,弱化方式有两种分别是:

  1. 如果不在使用该对象,就及时将对象指向null,这时GC就会认为该对象不存在引用,但具体什么时候回收仍取决与GC算法
  2. 弱化的第二种方式,就是让不在使用的对象超出它的作用域范围,例如在方法中存在的对象当这个方法调用结束,GC就会回收这个对象

软引用

软引用是对内存敏感的引用。如果内存空间充足,GC就不会回收软引用对象,如果内存空间不足,GC就会回收软引用对象。采用SoftReference来创建一个软引用对象

//强引用
String str = new String("hahaha");//软引用
SoftReference<String> softReference = new SoftReference<String>(str);

弱引用

弱引用是不管内存是否充足,只要在GC扫描的过程中发现了弱引用对象,就会回收该对象。采用WeakReference创建弱引用对象

//强引用
String str = new String("hahaha");//弱引用
WeakReference<String> weakReference = new WeakReference<>(str);

虚引用

虚引用是最弱的一种引用关系,如果一个对象是虚引用,那么这个对象就和没有任何引用是一样的,随时都可能被回收。虚引用的主要作用是用来跟踪对象被垃圾回收的活动

如何判断对象可被GC回收?相关推荐

  1. java gc 例子_Java 中, 为什么一个对象的实例方法在执行完成之前其对象可以被 GC 回收?...

    收到好多邀请-泻药泻药.其中有好些感觉是想来吃瓜的. 所以请让我先跑个题,为吃瓜群众献上几个传送门: private static void newSingleThreadPool() { Execu ...

  2. 判断对象是否可回收、垃圾回收算法

    本节将会介绍下判断对象是否都能回收的两种方式:引用计数法.可达性分析,另外会介绍一下常用的垃圾回收算法:标记清除算法,复制算法,标记整理算法,分代回收算法. 目录 对象是否可回收 引用计数算法 可达性 ...

  3. 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC

    31. 如何计算对象已死 31.1.引用计数器算法 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象 ...

  4. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  5. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  6. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

  7. GC回收垃圾对象过程

    GC回收垃圾对象需要完成的三件事 1.哪些内存需要回收? 2.如何判断对象是否该回收? 3.如何回收垃圾对象? 哪些内存需要回收 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生随线程而灭.虚拟机栈 ...

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

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

  9. JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

    文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...

最新文章

  1. 烂泥:php5.6源码安装及php-fpm配置与nginx集成
  2. ​数字政府发展指数排名出炉!上海、浙江、北京位列前三,你的城市排第几?(附报告全文下载)...
  3. VirtualBox安装kali linux过程及安装后无法全屏问题解决方法(2)
  4. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...
  5. RaspberryPI 3 系统安装及常见问题
  6. 【C语言位运算的应用】如何按bit位翻转一个无符号整型
  7. 仿真程序驱动视景问题
  8. mtk pwmlinux timer
  9. Could not create a sandbox extension for /
  10. java 二叉排序_java实现二叉排序树
  11. 安装程序工具 (Installutil.exe)22
  12. 1090 危险品装箱 (25 分)—PAT (Basic Level) Practice (中文)
  13. 数据库服务器编码,数据库编码,数据库表编码,数据库表字段编码
  14. ipv6 dns服务器修改,ipv6服务器dns怎么设置
  15. 理正深基坑6.0软件备忘录_梳理使用方法01
  16. 分布式光伏发电系统的组网与研究
  17. 应用stm32f10x的定时器TIM3的PWM实现歌曲播放
  18. Google Earth上划定矢量范围并导出为KMZ文件
  19. Linux:CentOS7安装
  20. 同步以太网-SyncE介绍

热门文章

  1. bt服务器注册,『漫游』BT服务器 - 帮助
  2. JSP六个动作详解...
  3. Write a program to pratice ATA command
  4. MySQL高级特性之分布式(XA)事务的介绍
  5. Shell脚本学习之一:文件属性与权限管理
  6. 教育超市-浙大版《C语言程序设计(第3版)》第1章引言(练习1.2 程序与程序设计语言)
  7. Android聊天界面中图片大小的合理缩小算法
  8. c语言抢课软件,抢课
  9. 图形工作站如何确保设计图纸等重要数据的安全——HC12远程图形工作站解决方案...
  10. hdu2037 今年暑假不AC(贪心||暴力)