没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
20页
本书主要讲解了java虚拟机垃圾回收机制,垃圾回收器以及java虚拟机的常用配置; Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布。它是Java程序的技术基础,这些程序包括:实用程序、游戏、商业应用程序。在全世界范围内,Java运行在超过数十亿台个人计算机上,数十亿台设备上,还包括手机和电视设备。Java由一系列的关键组件作为一个整体构建出了Java平台。
资源推荐
资源详情
资源评论
概述
先说一些基本的东西,GC 只负责对象内存相关的清理,其他资源如文件句柄,db 连接需
要手动清理,以防止系统资源不足崩溃。System.gc()只是建议 jvm 执行 GC,但是到底
GC 执行与否是由 jvm 决定的。
一个正常的对象的生命周期。
当新建一个对象时,会置位该对象的一个内部标识 finalizable,当某一点 GC 检查到该对象
不可达时,就把该对象放入 finalize queue(F queue),GC 会在对象销毁前执行 finalize 方
法并且清空该对象的 finalizable 标识。
简而言之,一个简单的对象生命周期为,Unfinalized Finalizable Finalized Reclaimed。
Reference 中引用的 object 叫做 referent。
1 先看一个对象 finalize 的顺序问题。
Java 代码
1. publicclassA{
2. Bb;
3. publicvoidfinalize(){
4. System.out.println("methodA.finalizeat"+System.nanoTime()
);
5. }
6. }
7.
8. publicclassB{
9. publicvoidfinalize(){
10. System.out.println("methodB.finalizeat"+System.nanoTime()
);
11. }
12. }
13.
14. Aa=newA();
15. a.b=newB();
16. a=null;
17. System.gc();
按照 http://java.sun.com/developer/technicalArticles/javase/finalization/%
所说,对象 a 在 finalize 之前会保持 b 的引用,但是实验中对象 a 和 a 中的对象 b 的
finalize 方法运行时间有先有后,而且大部分时间里,a 的 finalize 方法的执行时间是晚于 b
的 finalize 方法的。我记着 java 编程语言书中说是一切可以 finalize 的对象的 finalize 方法
的执行顺序是不确定的。到底应该听谁的?最好的实践就是不要依赖 finalize 的顺序或者写
一些防御代码。
【note】我仍然坚持最好的实践就是不要依赖 finalize 的顺序或者写一些防御代码。但是通
过进一步的学习和实验,因为 a 有可能复活,所以在 a 没有决定到底复活不复活之前 b 是
不会被回收的。控制台的顺序问题应该是多线程的问题导致的。
【note】查看了 JLS 后,确定了 finalize 是乱序执行的。
2 对象再生及 finalize 只能执行一次
Java 代码
1. publicclassB{
2.
3. staticBb;
4.
5. publicvoidfinalize(){
6. System.out.println("methodB.finalize");
7. b=this;
8. }
9. }
10.
11. Bb=newB();
12. b=null;
13. System.gc();
14. B.b=null;
15. System.gc();
对象 b 本来已经被置 null,GC 检查到后放入 F queue,然后执行了 finalize 方法,但是执
行 finalize 方法时该对象赋值给一个 static 变量,该对象又可达了,此之谓对象再生。
后来该 static 对象也被置 null,然后 GC,可以从结果看到 finalize 方法只运行了 1 次。为什
么呢,因为第一次 finalize 运行过后,该对象的 finalizable 置为 false 了,所以该对象即使
以后被 gc 运行,也不会执行 finalize 方法了。
很明显,对象再生是一个不好的编程实践,打乱了正常的对象生命周期。但是如果真的需
要这么用的话,应该用当前对象为原型重新生成一个对象使用,这样以后这个新的对象还
可以被 GC 运行 finalize 方法。
3 SoftReference WeakReference%
SoftReference 会尽量保持对 referent 的引用,直到 JVM 内存不够,才会回收
SoftReference 的 referent。所以这个比较适合实现一些 cache。
WeakReference 不能阻止 GC 对 referent 的处理。
4 PhantomReference%
幻影引用,幽灵引用,呵呵,名字挺好听的。
奇特的地方,任何时候调用 get()都是返回 null。那么它的用处呢,单独好像没有什么大的
用处,所以要结合 ReferenceQueue。
5 ReferenceQueue%
ReferenceQueue WeakReference PhantomReference 都有构造函数可以传入
ReferenceQueue 来监听 GC 对 referent 的处理。
Java 代码
1. publicclassA{
2. }
3.
4. ReferenceQueuequeue=newReferenceQueue();
5. WeakReferenceref=newWeakReference(newA(),queue);
6. Assert.assertNotNull(ref.get());
7.
8. Objectobj=null;
9. obj=queue.poll();
10. Assert.assertNull(obj);
11.
12. System.gc();
13.
14. Assert.assertNull(ref.get());
15. obj=queue.poll();
16. Assert.assertNotNull(obj);
分析,在 GC 运行时,检测到 new A()生成的对象只有一个 WeakReference 引用着,所以
决定回收它,首先 clear WeakReference 的 referent,然后 referent 的状态为 finalizable,
同时或者一段时间后把 WeakReference 放入监听的 ReferenceQueue 中。
注意有时候最后的 Assert.assertNotNull(obj);有时会失败,因为还没有来的及把
WeakReference 放入监听的 ReferenceQueue 中。
剩余19页未读,继续阅读
资源评论
悠闲饭团
- 粉丝: 151
- 资源: 3303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 笔记实验六,spark,大数据分析
- ####蓝桥杯python的详细的信息介绍
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功