深入理解Java虚拟机笔记---引用类型和对象是否死亡
来源:互联网 发布:树洞软件 编辑:程序博客网 时间:2024/06/03 23:41
本文转自:http://blog.csdn.net/xtayfjpk/article/details/41910377
1.强引用(Strong Reference)就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类引用,只要强引用存在,垃圾收集器永远不会回收掉被引用的对象---JVM宁愿报出内存溢出异常,也不会靠回收强引用对象来缓解内存紧张。
2.软引用(SoftReference)用来描述一些还有用,但并非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中,并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出错误----内存不足时回收。
3.弱引用(WeakReference)也是用来描述非必须对象的,但是它的强度比软引用更弱一点,被弱引用关联的对象只能生存到下一次垃圾回收之前-----当垃圾收集器扫描它所管辖的内存区域时,无论当前内存是否足够,都会回收掉被弱引用关联的对象。
4.虚引用(PhantomReference)它是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用关联的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。----任何时候都有可能被回收掉。
在根搜索算法中不可达的对象,也并非是“非死不可的”,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finallize()方法或该对象的finalize()已经被调用过,虚拟机将这两种情况都视为“没有必要执行”。
如果一个对象被判断为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条虚拟机自动建立的,低优先级的Finalizer线程去执行。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果一个对象在fianlize()方法中执行缓慢,或者发生了死循环,将很可能会导致F-Queue队列中的其它对象永久处于等待状态,甚至导致整个内存回收系统崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果对象在finalize()中成功拯救自己--只要重新与引用链上的任何一个对象建立关联既可,那在第二次标记时它将被移出“即将回收”集合;如果对象这时候还没有逃脱,那它就将被回收了。
0 0
- 深入理解Java虚拟机笔记---引用类型和对象是否死亡
- 深入理解Java虚拟机笔记---引用类型和对象是否死亡
- 深入理解Java虚拟机笔记---判断对象是否存活
- 深入理解Java虚拟机笔记---判断对象是否存活
- 《深入理解java虚拟机》之学习笔记(三)——java 判断对象是否可回收
- 深入理解java虚拟机(三)对象回收判断算法以及死亡过程
- 深入理解Java虚拟机之引用与对象回收
- 深入理解Java虚拟机笔记——java虚拟机内存区域和对象创建
- 4.《深入理解Java虚拟机》对象是否可回收?
- 深入理解Java虚拟机之判断对象是否存活
- 【笔记】深入理解 java 虚拟机---虚拟机对象探秘
- 读书笔记——《深入理解Java虚拟机》系列之回收对象算法与四种引用类型
- 深入理解Java引用类型
- 深入理解Java引用类型
- 深入理解Java引用类型
- 深入理解Java虚拟机-学习笔记(1)对象?Object?
- 学习深入理解java虚拟机笔记--对象已死吗
- 《深入理解JAVA虚拟机》笔记
- python 对中文文件求交集、并集、差集
- 复制构造函数和赋值操作符
- 论文写作技巧
- 使用java时创建数组的三种常用的方法
- 20160319 CodeVs 1073 家族,2033 邮票,1026 逃跑的拉尔夫
- 深入理解Java虚拟机笔记---引用类型和对象是否死亡
- 使用JSP处理用户注册和登陆
- Android处理滑动与点击事件的冲突
- 看懂此文,不再困惑于javascript中的事件绑定、事件冒泡、事件捕获和事件执行顺序
- 教你如何使用Java泛型
- CAShapeLayer和CAGradientLayer
- PCH文件的配置
- hdu1176
- hdu 3182 Hamburger Magi(状压dp)