finalize

Should Java 9 Cleaner be preferred to finalization?

感情迁移 提交于 2019-11-27 21:42:12
问题 In Java, overriding the finalize method gets a bad rap, although I don't understand why. Classes like FileInputStream use it to ensure close gets called, in both Java 8 and Java 10. Nevertheless, Java 9 introduced java.lang.ref.Cleaner which uses the PhantomReference mechanism instead of GC finalization. At first, I thought it was just a way add finalization to third-party classes. However, the example given in its javadoc shows a use-case that can easily be rewritten with a finalizer. Should

C#中的Finalize,Dispose,SuppressFinalize的实现和使用介绍

拈花ヽ惹草 提交于 2019-11-27 21:32:45
原文地址: http://www.csharpwin.com/csharpspace/8927r1397.shtml MSDN建议按照下面的模式实现IDisposable接口: 1 public class Foo: IDisposable 2 { 3 public void Dispose() 4 { 5 Dispose(true); 6 GC.SuppressFinalize(this); 7 } 8 9 protected virtual void Dispose(bool disposing) 10 { 11 if (!m_disposed) 12 { 13 if (disposing) 14 { 15 // Release managed resources 16 } 17 // Release unmanaged resources 18 m_disposed = true; 19 } 20 } 21 22 ~Foo() 23 { 24 Dispose(false); 25 } 26 private bool m_disposed; 27 } 在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。 在这个模式中,void Dispose

详解java垃圾回收机制(转)及finalize方法(转)

大兔子大兔子 提交于 2019-11-27 19:35:30
详细介绍Java垃圾回收机制 垃圾收集 GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。 引用计数收集器 引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。 当一个对象被垃圾收集时,它引用的任何对象计数减1。 这儿我的理解是: A a=new A(); //(此时这儿的 new A(); 是对象一,a为引用,这时间引用计数为1 ) A b=a; //(这时间 引用计数为 1+1=2) b=new A();//(此时这儿的 new A(); 是对象二,对象二的引用计数为1,b为引用,这时间引用计数为1--之前对象一的引用计数为 2-1=1 ) a=b;/

java面向对象下

折月煮酒 提交于 2019-11-27 18:14:01
1.1. java类是否可以多继承,怎么实现多继承? 答:java没有多继承,但可以通过接口的形式来达到多继承的目地。 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别? Overload的方法是否可以改变返回值的类型? 答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类 与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定 义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这 个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定 义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。 Overloaded的方法是可以改变返回值的类型 1.2. abstract class 和interface 有什么区别? 答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类, 并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型 是一个抽象类,并让它指向具体子类的一个实例

finally finalize final 区别

六眼飞鱼酱① 提交于 2019-11-27 16:52:51
final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 finally 异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。一般异常处理块需要。 finalize 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 Java中所有类都从Object类中继承finalize()方法。 当垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法。值得C++程序员注意的是,finalize(

final/finalize/finally的区别

那年仲夏 提交于 2019-11-27 16:52:27
一、性质不同 (1)final为关键字; (2)finalize()为方法; (3)finally为为区块标志,用于try语句中; 二、作用 (1)final为用于标识常量的关键字,final标识的关键字存储在常量池中(在这里final常量的具体用法将在下面进行介绍); (2)finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行I/0操作); (3)finally{}用于标识代码块,与try{}进行配合,不论try中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行; 三、final详解 1定义变量 1.1 final定义基本类型变量时,要求变量初始化必须在声明时或者构造函数中,不能用于其它地方。该关键字定义的常量,除了初始化阶段,不能更改常量的值。 1.2 final定义对象的引用,该引用的初始化与定义常量时的要求一致;该关键字定义的对象内容可以改变,但是引用指向的地址不能改变; 2定义参数 如果传入该参数定义的变量时, 方法不能对该参数内容进行修改(错误) ,与定义变量的修改规则相同;java方法中传递基本类型时是 传值 的,java方法对于对象的传递是 传参 的;<归根结底,java中方法的传递是依靠传递“副本”

Why is the retained heap size of the FinalizerReference class so large in the (memory) Profiler of Android Studio?

坚强是说给别人听的谎言 提交于 2019-11-27 16:23:59
I have read this question about Finalizer's lion share of the heap . It dates from 2011 when the tools were different and the Java class still had a different name (Finalizer vs FinalizerReference). So I think this similar but new question can be asked now. On top of that, the accepted answer to that question boils down to: avoid using finalize()'d objects. Android classes that use finalize() directly or indirectly include Canvas, Paint, Bitmap, Drawable and RenderNode. Good luck avoiding all of them all of the time. I have also read the Profiler documentation and worked through the Memory

Java and manually executing finalize

心已入冬 提交于 2019-11-27 14:22:11
If I call finalize() on an object from my program code, will the JVM still run the method again when the garbage collector processes this object? This would be an approximate example: MyObject m = new MyObject(); m.finalize(); m = null; System.gc() Would the explicit call to finalize() make the JVM 's garbage collector not to run the finalize() method on object m ? According to this simple test program, the JVM will still make its call to finalize() even if you explicitly called it: private static class Blah { public void finalize() { System.out.println("finalizing!"); } } private static void

How is an object marked as finalized in Java (so that the finalize method wouldn't be called the second time)?

浪尽此生 提交于 2019-11-27 13:32:42
问题 The main question is in the topic but let me show my vision of finalization proccess in Java so that I can ask you a little more. Well the gc starts garbage collection by marking all live objects. When all reachable objects are marked as "live". All other objects are unreachable. The next step is to check every unreachable object and determine whether it can be sweeped right now or it should be finalized at first. The gc thinks the next way if the object's finalize method has a body then this