判断对象存活方法及回收方法
引用计数方法
给对象添加一个引用计数器,当有对象引用它时,计数器的值就+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对象没有被引用,满足以上三个条件,它就是无用类,可以被回收了。
判断对象存活方法及回收方法相关推荐
- 如何判断对象是否存活之根搜索算法
根搜索算法有没有人了解过的,在垃圾回收机制里面判断对象存活,主要是使用根搜索算法进行实现的,根搜索算法可能稍微有点抽象,算法是怎么进行实现的,又叫GCRoots,类似于树形结构一样的,他怎么样进行实现 ...
- 【JVM】对象存活判定算法、GC算法、STW、GC种类详解
[JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...
- 深入理解Java虚拟机(第三版)-- 判定对象存活算法、引用、回收方法区
引用记数法 很多教科书判断对象是否存活的算法是这样的:在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的 ...
- java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用
我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...
- 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...
- java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】
垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些已经"死去" 一.对象存活判断 1.1 引用计数算法(Reference Co ...
- 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...
- 垃圾回收器判断对象是否存活
转载自:http://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java ...
- java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...
最新文章
- 网络通信应用开发利器!—— ESPlus —— ESFramework通信框架的增强库
- asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用
- Computer Organization and Design--计组作业习题(1)
- 操作系统第一篇【引论】
- 【深入浅出jQuery】源码浅析--整体架构(转)
- React Native - 3 View, Text简介以及onPress onLongPress事件
- sqlprompt安装注册
- 特洛伊木马程序_历史著名的特洛伊木马计,希腊的人造礼物
- 51单片机控制蜂鸣器播放《梧桐树》
- 文件系统测试工具IOZONE
- 关于金仓数据库的java连接问题
- php日志在哪,php日志在哪
- 超滤膜助力料酒生产 美味十里飘香
- [golang] 导入 go-sqlite3 报错解决方法
- 雷达图使用攻略(上)
- P1295 [TJOI2011]书架(线段树dp)
- DNSPod十问侯家文:如何为中小企业的网络安全保驾护航?
- 斗地主自动出牌函数c语言,斗地主AI出牌(示例代码)
- ubuntu18.04 台式机无线网卡TPLink WDN5200H2.0驱动安装
- 没有干货的LTSC浅度体验