- 浏览: 746420 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (419)
- 杂软粉墨 (2)
- 创意灵感 (3)
- 经验记录 (137)
- 开源轨迹 (2)
- sip-communicator (2)
- 闲侃杂谈 (8)
- 问题交流 (24)
- 概念模式 (32)
- 难点备案 (5)
- JwChat (1)
- 中国象棋 (1)
- 教育探索 (6)
- 英语研究 (58)
- 星际争霸 (1)
- 电信知识 (1)
- 软件架构 (3)
- 哲学探索 (26)
- 算法灵魂 (8)
- 近视探索 (6)
- 数学数学 (3)
- 牛角钻尖 (23)
- 至强文言 (3)
- 数据结构 (1)
- 宇宙物理 (2)
- 网络架构 (3)
- 游戏领域 (4)
- 图形处理 (2)
- 修炼之路 (8)
- 读书天地 (20)
- 编解乱码 (2)
- 概念探索 (8)
- 格物致知 (1)
- 其它语言 (1)
- 测试领域 (3)
- 文化风流 (1)
- JQuery (1)
- 網頁領域 (1)
- Unix/Linux (1)
- Inside JVM (1)
- 异常分析 (1)
最新评论
-
suyujie:
引用
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
iamzhoug37:
您能说一下"局部变量不受文本顺序限制" 是 ...
声明前为什么能赋值却不能输出,都是使用
Effective Java 2nd 中Item 7: Avoid finalizers關於Finalizer Guardian Idiom的論述:
If a subclass implementor overrides a superclass finalizer but forgets to invoke
it, the superclass finalizer will never be invoked. It is possible to defend against
such a careless or malicious subclass at the cost of creating an additional object
for every object to be finalized. Instead of putting the finalizer on the class
requiring finalization, put the finalizer on an anonymous class (Item 22) whose
sole purpose is to finalize its enclosing instance. A single instance of the
anonymous class, called a finalizer guardian, is created for each instance of the
enclosing class. The enclosing instance stores the sole reference to its finalizer
guardian in a private instance field so the finalizer guardian becomes eligible for
finalization at the same time as the enclosing instance. When the guardian is
finalized, it performs the finalization activity desired for the enclosing instance,
just as if its finalizer were a method on the enclosing class:
// Finalizer Guardian idiom public class Foo { // Sole purpose of this object is to finalize outer Foo object private final Object finalizerGuardian = new Object() { @Override protected void finalize() throws Throwable { ... // Finalize outer Foo object } }; ... // Remainder omitted }
Finalizer Guardian idiom是爲了防止該類被繼承且被覆蓋了finalize方法,並且沒有調用super.finalize()的情形(就是沒有使用所謂的finalizer chaining)。
因為在回收時去調Foo instance的finalize()會動態綁定到它子類的覆蓋方法上去,Foo的成員變量finalizerGuardian也會被回收,因此它的finalize()也會被調用,但是在這裡如果finalize了Foo的實例,finalizerGuardian自己怎麼辦?什麽都不寫,它會隱式回收自己嗎?我猜應該是會的,但不知道是怎麼實現的,因為覆蓋后相當於有關回收自己的代碼神馬都沒寫。
知道了,本身Object的finalize方法就是一個空方法,garbage collector無需任何多餘指示,只要一個空方法就可以進行回收了,被子類覆蓋后,新增的實現不影響原本對自己的回收。
2012.07.30 新增修改:
finalizerGuardian的回收機制如何被觸發?子類如果沒有finalizer chaining父类,那它只會finalize自己。
現在雖然沒有確鑿的資料證明,但這裡大膽結論:
當實例失去引用后即將被回收,它的成員變量也會先其而被回收,通過finalizerGuardian來finalize Foo對象,Foo對象只要被回收,它的成員自然而然就被強制回收。
// Manual finalizer chaining @Override protected void finalize() throws Throwable { try { ... // Finalize subclass state } finally { super.finalize(); } }
但這樣不禁又帶來一個疑問,父類對象被finalize之後,子類對象會不會被連帶finalize?
1. 父類對象被finalize之後,子類對象如果也會被finalize,這樣的話,finalizer chaining又有何意義呢?也就是說子類去覆蓋父類的finalize方法有何意義呢?
2. 如果父類對象被finalize之後,子類對象不會被finalize,那麼manual finalizer chaining就有意義了,它用finalize方法來finalize subclass state。
所以正確結論看來是2。
最終結論:
1. 當存在finalizer chaining時,父類對象失去引用需要被回收,garbage collector回收其成員,然後欲調用父類對象finalize方法,沒有,動態綁定去調用子類對象finalize方法,在try塊中finalize自身,在finally塊中連鎖調用super.finalize()方法,因此父類對象及其無被引用成員也被回收。
2. 當不存在finalizer chaining時,父類對象失去引用需要被回收,garbage collector欲調用父類對象finalize方法,沒有,動態綁定去調用子類對象finalize方法,在try塊中finalize自身,在 finally塊中沒有連鎖調用super.finalize()方法,但garbage collector會去回收父類成員(why?當父類對象不被引用時,其成員就有機會被GC,意思是成員也真正失去引用了),當涉及到finalizerGuardian時,調用其finalize方法,其中再調用了父類對象的finalize方法,因此父類對象被回收,失去引用的成員連帶也被回收。
此二結論還需要進一步被論證。
发表评论
-
java语言中classes分类
2012-10-22 13:09 1626local class的scope是local,所以在方法 ... -
URL definition
2012-08-14 08:29 7278http://reg.163.com/login.jsp?ty ... -
how to defend against serialization and reflection attack for eager singleton
2012-08-08 09:18 1299//为什么要定义构造方法 因为不定义它也会有默认构造方法,而 ... -
我對多態的理解
2012-05-24 09:03 1069多态(polymorphism)是以一种看待事物更细致的角度来 ... -
Bridge Pattern
2011-06-17 11:59 838Intent Decouple an abstracti ... -
Composite Pattern
2011-06-17 09:12 964http://userpages.umbc.edu/~ta ... -
Observer Pattern
2011-06-15 11:32 1090consistent communication model ... -
Factory Method
2011-05-27 23:46 1004how does the factory method pat ... -
Law of Demeter
2011-04-07 09:23 1059http://en.wikipedia.org/wiki/La ... -
Several thread-safe singleton collection
2011-02-24 10:19 10351. static inner class publi ... -
关于Arrays.sort()方法用到的设计模式
2011-02-18 09:12 2887/** * Src is the sour ... -
何时使用LSP
2011-01-24 09:12 1015当使用subclass无法满足LSP(Liskov Subst ... -
Command模式图详解
2011-01-12 16:53 968上图是command模式结构图,各个符号重点应该理解,符 ... -
IOC inversion体现在什么地方
2011-01-12 16:02 1068http://martinfowler.com/bliki/I ... -
什么时候需要synchronized
2010-12-02 15:32 1168当需要在某个方法上加synchronized关 ... -
多任务同时执行完毕后方执行后续任务
2010-12-02 10:20 1226多线程同时启动,执行完毕后启动新任务 1.传统join ... -
Apache Struts2 Architecture
2010-07-21 22:38 978Struts is a flexible control la ... -
开闭原则
2010-03-15 13:58 970Closed for Modification; Op ... -
多态之RTTI
2010-01-21 16:58 1397所谓RTTI,是Runtime Type Informatio ... -
26 Hints for Agile Software Development
2009-11-23 16:14 101526 Hints for Agile Software Dev ...
相关推荐
在我的类中何时需要实现一个完成器?我是否一定要实现完成器,或者只是在我控制着 非托管资源时才需要实现它?我是否一定要在我的完成器中实现 IDisposable 接口?...关键字:finalizer,assembly names,methodinfo
3. 如果在Finalizer表上有记录,那么将记录移到另外的一张表上,在这里我们叫它Finalizer2。 4. 如果不在Finalizer2表上有记录,那么释放内存。 Finalizer的概念: 在.NET中,Destructor的概念已经不存在了,它...
标题中的“teclast-f5-ubuntu-finalizer”是一个针对Teclast F5笔记本电脑的项目,目的是优化Ubuntu Linux在该设备上的运行效果。这个项目可能包含特定的硬件和软件调整,尤其是对Kernel(内核)、System ACPI(系统...
flexipatch-finalizer是一个自定义预处理器,它使用相同的配置文件,并剥离所有未使用代码的flexipatch构建,从而保留应用了选定补丁的软件构建。 该终结器的示例flexipatch构建可用于: :warning: 请务必注意,...
Java内存泄漏是开发过程中常见的问题,可能导致系统性能下降,甚至应用程序崩溃。为了有效地排查和解决这类问题,开发者通常会借助专业工具,而“Java内存泄漏排除工具MAT”(Memory Analyzer Tool)就是一个强大的...
愚蠢的终结者建造go build 跑# List all objects blocked by a finalizer./finalizers# List all objects with finalizers./finalizers --all例子./finalizersNAMESPACE NAME APIVERSION KIND FINALIZERSp-nf5gh ...
《WordPress免费采集与批量发布工具详解》 在数字化信息时代,内容创作与更新的速度日益加快,对于WordPress用户来说,寻找一款高效、便捷的采集和批量发布工具显得尤为重要。本篇文章将详细解读“免费WordPress...
迅睿CMS采集工具是一款专为网站内容管理系统的用户设计的免费工具,主要针对迅睿CMS系统,但也可能兼容其他CMS平台。这款工具的核心功能在于其强大的数据采集与批量发布的特性,能够有效地帮助用户自动化处理网站...
Java内存管理是一个复杂而微妙的主题,尤其是当涉及到内存泄漏时。Java的自动垃圾回收机制虽然在大多数情况下工作得很好,但并不能完全防止内存泄漏的发生。内存泄漏通常发生在程序中,当不再需要的对象仍然被引用,...
dirty_scheduler 不要忘记使用“ --enable-dirty-schedulers”... 从Erlang 17.03开始,enif_schedule_dirty_nif,enif_schedule_dirty_nif_finalizer和enif_dirty_nif_finalizer被删除(erl_nif.h)。 更多信息: :
调试器帮助线程3.Finalizer线程 代码如下:class Program { static void Main(string[] args) { Console.WriteLine(“Main thread: {0}”, Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } } ...
34. **CN_IDIOM_NO_SUPER_CALL**:clone() 方法没有调用 super.clone(),这可能导致不正确的克隆行为。遵循 Cloneable 接口的最佳实践。 35. **VA_FORMAT_STRING_BAD_ARGUMENT**:格式化字符串的占位符与传入参数不...
2. Excessive use of Finalizers:Finalizer是一种特殊的对象,它可以在垃圾回收器清理对象时执行一些操作。但是,如果Finalizer使用不当,可以导致内存泄漏和性能问题。 3. Explicit GC Invocations:垃圾回收器是...
* 使类和成员的可访问性最小化,避免使用终结方法finalizer方法。 * 使可变性最小化,尽量使类不可变。 三、成员变量设计 在成员变量设计中,需要注意以下几点: * 使用static成员变量,避免创建不必要的对象。 *...
4. 避免使用 finalizer:避免使用finalizer来释放资源,使用try-finally语句来释放资源。 五、静态代码分析清单项分类 1. 使用静态代码分析器:使用静态代码分析器来检查代码的质量和安全性。 2. 查看报告:查看...
Joshua Bloch 所著《Effective Java 第二版》一书摘要这是我... 避免使用 finalizer3. 所有对象通用的方法8. 覆盖equals时遵守一般约定9.重写equals时务必重写hashCode10. 始终覆盖toString11.明智地覆盖克隆12.考虑实
在给定的压缩包中,可能包含了一系列TC Electronic的著名音频处理插件,如TC Helicon的语音处理插件或者TC Finalizer的母带处理插件。 1. **TX插件**:TX可能是"Texturing"或"Transforming"的缩写,这可能指的是...
2. **Finalizable**:当GC发现一个对象不再可达(即没有其他对象引用它),这个对象会被放入一个名为Finalizer队列(F Queue)中,准备进行`finalize()`方法的执行。这是对象生命周期中的一个过渡阶段。 3. **...