引用计数方法

给对象添加一个引用计数器,当有对象引用它时,计数器的值就+1,引用实效时,计数器的值-1。
但是这个方法却解决不了相互引用循环的问题。
比如

class Haha {public Object instant = null;public static void test(){Haha A = new Haha();Haha B = new Haha();A.instant = B;B.instant = A;A = null;B = null;System.gc();}
}

如果虚拟机采用这种方法,那么这两个对象将不会被回收,但是通过运行,可以发现,GC对这两个对象进行了回收,可以得到一个结论,虚拟机并非采用对象引用的方法。

可达性分析算法

这个算法的基本思想是通过一系列的 “GC Root“ 作为起点,GC Root向下路过的路径是引用链,如果一个对象到GC Root没有引用链,说明这个对象是不可达的,那么虚拟机就判断是可回收对象。

能称为GC Root有下面几种:
1.虚拟机栈中引用的对象。
2.方法区中的静态对象。
3.方法区中的常量对象。
4.native中引用的对象。

但是,GC并不是只能回收那些不可达对象,如果一些对象 “食之无味,弃之可惜”,或者内存不够用,那么GC也会进行回收,取决于引用的类型:

1.强引用

就是我们new出来的对象,存在于堆中,这是垃圾收集器永远不会回收的对象。
大家不要以为new出来的对象永远不能被回收!
在一个函数中,A a = new A(),new出来的对象放在堆中,而a是
强引用,放在栈中,函数结束,a弹出栈, 生命周期结束,堆中new出来的对象也会被回收。
所以说,强引用如果出现在方法中,不用担心 不把它设置 = null 会出现内存泄漏,因为执行方法时,强引用放在栈中,生命周期结束就自然回收了

2.软引用

将要内存泄漏时,会把软引用指向的对象列到回收范围进行第二次回收。如果还是内存泄漏,那就抛出内存溢出异常。

3.弱引用

可以理解成,无论内存情况如何,下次gc的时候,就是你的回收之日。

4.虚引用

这个引用对它指向的对象不会产生任何影响,只是当这个对象被回收时,发出系统通知。

回收方法区

上面的算法回收的对象都是堆,而方法区也需要回收,但是回收方法区的效率很低,因为方法区太小了~~
方法区相当于堆的逻辑部分,堆存放的时对象实例,而方法区存放的时它的类信息,常量,所以gc回收的是无用的类和无用的常量。
回收方法:
1.无用常量:没对象引用它就回收。
2.无用类:堆不存在它的实例,加载它的ClassLoader回收了,它的Class对象没有被引用,满足以上三个条件,它就是无用类,可以被回收了。

判断对象存活方法及回收方法相关推荐

  1. 如何判断对象是否存活之根搜索算法

    根搜索算法有没有人了解过的,在垃圾回收机制里面判断对象存活,主要是使用根搜索算法进行实现的,根搜索算法可能稍微有点抽象,算法是怎么进行实现的,又叫GCRoots,类似于树形结构一样的,他怎么样进行实现 ...

  2. 【JVM】对象存活判定算法、GC算法、STW、GC种类详解

    [JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...

  3. 深入理解Java虚拟机(第三版)-- 判定对象存活算法、引用、回收方法区

    引用记数法 很多教科书判断对象是否存活的算法是这样的:在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的 ...

  4. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

  5. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...

  6. java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】

    垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些已经"死去" 一.对象存活判断 1.1 引用计数算法(Reference Co ...

  7. 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...

  8. 垃圾回收器判断对象是否存活

    转载自:http://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java ...

  9. java判断一个对象是否为空_Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...

最新文章

  1. 网络通信应用开发利器!—— ESPlus —— ESFramework通信框架的增强库
  2. asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用
  3. Computer Organization and Design--计组作业习题(1)
  4. 操作系统第一篇【引论】
  5. 【深入浅出jQuery】源码浅析--整体架构(转)
  6. React Native - 3 View, Text简介以及onPress onLongPress事件
  7. sqlprompt安装注册
  8. 特洛伊木马程序_历史著名的特洛伊木马计,希腊的人造礼物
  9. 51单片机控制蜂鸣器播放《梧桐树》
  10. 文件系统测试工具IOZONE
  11. 关于金仓数据库的java连接问题
  12. php日志在哪,php日志在哪
  13. 超滤膜助力料酒生产 美味十里飘香
  14. [golang] 导入 go-sqlite3 报错解决方法
  15. 雷达图使用攻略(上)
  16. P1295 [TJOI2011]书架(线段树dp)
  17. DNSPod十问侯家文:如何为中小企业的网络安全保驾护航?
  18. 斗地主自动出牌函数c语言,斗地主AI出牌(示例代码)
  19. ubuntu18.04 台式机无线网卡TPLink WDN5200H2.0驱动安装
  20. 没有干货的LTSC浅度体验

热门文章

  1. 《openssl编程》之基础知识
  2. 十招教你学会软件破解(转)
  3. 如何防止单例模式被JAVA反射攻击
  4. LiveVideoStack主编观察02 / 附赠专属优惠码
  5. Xilinx+AWS F1+VP9带来30倍实时转码性能提升
  6. 微信小程序开放直播能力,你怎么看?
  7. RabbitMq常见问题
  8. 学习方法之04提取练习,永远都不会忘的记忆方法
  9. 腾讯云大数据产品中心总经理刘煜宏:企业全域数据体系建设(附完整PPT)
  10. apr_file_seek 踩坑