庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>认证考试>JAVA认证>考试资源>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

Java中的测不准原理

 作者:本站收集   日期:2005-3-22
字号选择〖 〗/ 双击滚屏 单击停止   


   测不准原理
     想做一个物理实验,看看某物质的导电情形,于是接上电压,并串联上一个安培计来观察电流,但是你知道吗? 安培计本身也带有电阻,造成你的实验准确度受到影响。诸如此类的问题在科学界很常见,所以有了「测不准原理」之说。不只是物理,测不准的现象在计算机上也有可能发生。比方说,你想写一个观察程序,观察 CPU 在执行某程序之下的使用率, 但是你的观察程序本身也会占用一部份的 CPU 效能,造成测出来的数据不精确。

   再想象下面的情况:如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,所以你必须要用 一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。...... 又是「测不准」。

   java.lang.ref.WeakReference

   不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此 对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。请看下面的例子:

   ...

   WeakReference wr = new WeakReference(obj);

   ...

   if (wr.get()==null) {

   System.out.println("obj 已经被清除了 ");

   } else {

   System.out.println("obj
   尚未被清除,其信息是 "+obj.toString());

   }

   ...

   在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。

   这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。

   java.lang.ref.SoftReference

   Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。SoftReference 是用来设计 object-cache 之用的。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧

   java.lang.ref.PhantomReference

   Phantom Reference 主要是用来取代对象的 finalize()。程序员利用 finalize() 来进行释放资源的同时,有可能不小心 让此对象再度拥有 Direct Reference。但是使用 Phantom Reference 则不会有此情形发生。和 Weak Reference 以 及 SoftReference 最大的不同是:Phantom Reference 一订要搭配着 ReferenceQueue 使用,因为 Phantom Reference 的 get() 传 出值一定是 null(以避免此对象不小心再度拥有 Direct Reference)。通常我们会设计一个 class 继承 PhantomReference,然 后 override 其 clear() 来定义释放资源等收尾的动作。当然,我宁可小心一点地使用 finalize(),也不愿意自找麻烦地使用 Phantom Reference。(中国程序员)

上一篇:开发J2EE应用应遵循的几点原则    下一篇:热门问题:java.exe出错错误分析  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-3-22
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿