精华内容
下载资源
问答
  • Java 销毁对象

    千次阅读 2015-05-16 06:44:49
     在Java中完成这样的工作主要是依靠try-finally机制来协助完成的,然而Java中还提供了另外一种被称为finalizer的机制,使用者仅仅需要重载Object对象提供的finalize方法,这样当JVM的在进行垃圾回收...

          终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定、降低性能,以及可移植性问题。


          在Java中完成这样的工作主要是依靠try-finally机制来协助完成的,然而Java中还提供了另外一种被称为finalizer的机制,使用者仅仅需要重载Object对象提供的finalize方法,这样当JVM的在进行垃圾回收时,就可以自动调用该方法。但是由于对象何时被垃圾收集的不确定性,以及finalizer给GC带来的性能上的影响,因此并不推荐使用者依靠该方法来达到关键资源释放的目的。比如,有数千个图形句柄都在等待被终结和回收,可惜的是执行终结方法的线程优先级要低于普通的工作者线程,这样就会有大量的图形句柄资源停留在finalizer的队列中而不能被及时的释放,最终导致了系统运行效率的下降,甚至还会引发JVM报出OutOfMemoryError的错误。

     

          Java的语言规范中并没有保证该方法会被及时的执行,甚至都没有保证一定会被执行。即便开发者在code中手工调用了 System.gc System.runFinalization 这两个方法,这仅仅是提高了finalizer被执行的几率而已。还有一点需要注意的是,被重载的finalize()方法中如果抛出异常,其栈帧轨迹是不会被打印出来的。在Java中被推荐的资源释放方法为,提供显式的具有良好命名的接口方法,如 FileInputStream.close() 和 Graphic2D.dispose() 等。然后使用者在finally区块中调用该方法,见如下代码:

    public void test() {
        FileInputStream fin = null;
        try {
            fin = new FileInputStream(filename);
            //do something.
        } finally {
            fin.close();
        }
    }

         

    在实际的开发中,利用finalizer又能给我们带来什么样的帮助呢?见下例:

    public class FinalizeTest {
        //@Override
        protected void finalize() throws Throwable {
            try {
                //在调试过程中通过该方法,打印对象在被收集前的各种状态,
                //如判断是否仍有资源未被释放,或者是否有状态不一致的现象存在。
                //推荐将该finalize方法设计成仅在debug状态下可用,而在release
                //下该方法并不存在,以避免其对运行时效率的影响。
                System.out.println("The current status: " + _myStatus);
            } finally {
                //在finally中对超类finalize方法的调用是必须的,这样可以保证整个class继承
                //体系中的finalize链都被执行。
                super.finalize(); 
            }
        }
    }

     

     

     

    展开全文
  • 今天学习对象销毁,,对象销毁有两种方式。 创建的对象超出范围 ...此时,需要先将对象的变量赋值为空,再使用System.gc()方法强制启动垃圾回收机制,将对象销毁 如有错误敬请指正。邮箱.xiang2

    今天学习对象的销毁,对象的销毁有两种方式:

    • 创建的对象超出范围
    • 创建的对象被重赋值为null

    动手操作,先在主函数中创建对象,再将对象赋值为null,再书写finalize()方法,但是执行程序完成后,执行结果并没有finalize()方法输出的数据
    在这里插入图片描述
    如果再主函数的末尾只添加System.gc(),并没有将对象赋值为空。
    在这里插入图片描述
    此时,由执行结果说明,并没有将对象销毁。
    此时,需要先将对象的变量赋值为空,再使用System.gc()方法强制启动垃圾回收机制,将对象销毁
    在这里插入图片描述
    如有错误敬请指正。邮箱xiang20010326@sina.com

    展开全文
  • Java对象销毁

    千次阅读 2019-05-10 20:05:32
    对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过,在清除对象时,由系统自动进行内存回收,不需要用户额外处理。这也是 Java 语言...

    对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过,在清除对象时,由系统自动进行内存回收,不需要用户额外处理。这也是 Java 语言的一大特色,某种程度上方便了程序员对内存的管理。

    Java 语言的内存自动回收称为垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些不再使用的对象所占用的内存。

    java 语言并不要求 JVM 有 GC,也没有规定 GC 如何工作。不过常用的 JVM 都有 GC,而且大多数 GC 都使用类似的算法管理内存和执行回收操作。具体的垃圾回收实现策略有好多种,在此不再赘述。

    注意:在传统的编程语言(例如 C 语言)中,回收内存的任务是由程序负责的,也就是说必须在程序中显式地进行内存回收,这无疑会增加程序员的负担,而且存在很多弊端。

    一个对象被当作垃圾回收的情况主要如下两种。

    1. 对象的引用超过其作用范围。
      {
      Object o=new Object(); //对象o的作用范围,超过这个范围对象将被视为垃圾
      }

    2. 对象被赋值为 null。
      {
      Object o=new Object();
      o=null; //对象被赋值为null将被视为垃圾
      }

    在 Java 的 Object 类中还提供了一个 protected 类型的 finalize() 方法,因此任何 Java 类都可以覆盖这个方法,在这个方法中进行释放对象所占有的相关资源的操作。

    在 Java 虚拟机的堆区,每个对象都可能处于以下三种状态之一。

    (1) 可触及状态:当一个对象被创建后,只要程序中还有引用变量引用它,那么它就始终处于可触及状态。

    (2) 可复活状态:当程序不再有任何引用变量引用该对象时,该对象就进入可复活状态。在这个状态下,垃圾回收器会准备释放它所占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的 finalize() 方法,这些 finalize() 方法有可能使该对象重新转到可触及状态。

    (3) 不可触及状态:当 Java 虚拟机执行完所有可复活对象的 finalize() 方法后,如果这些方法都没有使该对象转到可触及状态,垃圾回收器才会真正回收它占用的内存。

    注意:调用 System.gc() 或者 Runtime.gc() 方法也不能保证回收操作一定执行,它只是提高了 Java 垃圾回收器尽快回收垃圾的可能性。

    展开全文
  • JAVA创建和销毁对象

    千次阅读 2018-08-10 17:03:51
    虽然工作了两年仍然是个彩笔,就从effective java这本书开始学吧! 静态工厂方法 优点:有名称,不必每次调用创建新对象,可返回原返回类型的任何子类型对象,参数实例化更简洁。 缺点:如果不含共有的或受保护的...

    虽然工作了两年仍然是个彩笔,就从effective java这本书开始学吧!

    静态工厂方法

    优点:有名称,不必每次调用创建新对象,可返回原返回类型的任何子类型对象,参数实例化更简洁。

    缺点:如果不含共有的或受保护的构造器 就不能被实例化

    不必每次创建新对象:感觉针对的是不可变类

    参数实例化更简洁:类型推导(在JAVA7之后版本中有丰富了很多类型推导概念)

    //较为繁琐的写法
    Map<String, List<String>> map = new HashMap<String, List<String>>();
    
    //若HashMap提供该静态工厂方法
    public static <K, V> HashMap<K, V> newInstance(){
        return new HashMap<K, V>();
    }
    
    //通过静态工厂提供的简洁写法
    Map<String, List<String>> map = HashMap.newInstance();

    builder模式

    核心在于创建对象时 “方便设置参数” 和 “和线程安全”。

    1. 构造

        eg: new People(name,gender,age,address等);   设置参数却没有正好只有臃肿参数的构造时,无法挑选最恰当的构造

    2. getter() setter()

        开放getter()和settting()方法,阻止了改类做成不可变的可能,这就需要保证线程安全(!?)

    3. builer模式

        Builder是该类的静态成员类。如果类的参数或者静态工厂中具有多个参数,设计类时Builder模式是个不错的选择。

    public class Person {
    	private String Id;
    	private String name;
    	private String address;
    	
    	public static class Builder{
    		//所必须的参数
    		private final String Id;
    		
    		//可选的参数
    		private String name = "";
    		private String address = "" ;
    		
    		public Builder(String id){
    			this.Id = id;
    		}
    		
    		public Builder name(String name){
    			this.name = name;
    			return this;
    		}
    		
    		public Builder address(String address){
    			this.address = address;
    			return this;
    		}
    		
    		public Person build(){
    			return new Person(this);
    		}
    	}
    	
    	private Person (Builder builder){
    		this.Id = builder.Id;
    		this.name = builder.name;
    		this.address = builder.address;
    	}
     
    }
    

    singleton(单例)

    实现方法

    1. 声明类变量,创建时判断是否为null   
    2. 声明静态类变量,构造私有化             (以上两种方法需要注意1.序列化,2.瞬时的实例域,3.防止反射调用私有构造器)
    3. enum枚举类:    enum继承Enum,final无法继承,具有私有构造,java规定无法序列化反序列化enum(安全)

    私有构造

         无法被子类化,子类无法调用超类的构造。

    展开全文
  • Java对象销毁

    千次阅读 2016-09-06 22:08:31
    即对于废弃的资源,不再使用对象,需要将其所占用的内存资源进行回收,重新分配使用。 在Java中,拥有一套完整的垃圾回收机制,当对象的生命周期结束时,Java虚拟机会自动回收无用的占用内存的资源。 对象Java...
  • Effective Java:创建和销毁对象

    千次阅读 2015-06-25 00:35:11
    读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的。本博客是针对《Effective Java》这本书第2章所写的一篇读书笔记。博客中也有会一些个人对某个模块的理解和...
  • Java进阶 创建和销毁对象

    万次阅读 多人点赞 2014-05-12 21:55:09
    比如:每个项目中都有很多工具类,提供了很多static类型的方法供大家使用,谁也不希望看到下面的代码: TextUtils textUtils = new TextUtils(); if(textUtils.isDigitsOnly("123")) { //doSometing
  • JAVA笔记——道】JAVA对象销毁

    千次阅读 2016-01-02 08:35:04
    每一个对象都有两个属性: 1. Reachable可达,Finalizer-Reachable终接器-可达,Unreachable不可达 2. Unfinalized未终结,Finalizable可终结,Finlized已终结对象可达:对象被任意一个存活线程引用。对程序进行...
  • Effective Java 创建和销毁对象 3.用私用构造器或者枚举类型强化Singleton属性
  • 如何正确的创建和销毁Java对象

    万次阅读 2017-06-15 18:24:16
    Java是一门强大的高级语言。在学习了其基础知识后,我们仍需要理解其深刻的内涵。接下来,我们会以《Effective Java》一书做为Java进阶学习的载体,对Java进行一个系统的、全新的认识。...第一章:创建和销毁对象
  • java对象的创建和销毁

    千次阅读 2017-05-26 10:14:48
    对象的创建在java对象的创建 一般都都是使用new 关键字 +对象的构造方法 java对象中有一个或多个构造方法,可以生成 不同类型的对象 例: public class Person implements Serializable { private String ...
  • Java创建和销毁对象的几种方式

    千次阅读 2016-12-27 23:36:13
    创建对象的几种方式 构造器 静态工厂方法 通过Builder 不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器,得到一个builder对象,然后客户端在builder对象上调用类似于setter的方法,来设置每个可选...
  • Java的结构之美【2】——销毁对象

    千次阅读 多人点赞 2014-06-29 09:58:33
    先来看一段代码:import java.util.Arrays; import java.util.EmptyStackException; /** * 2014年6月28日09:31:59 * @author 阳光小强 * */ public class Stack { private Object[] elements; private int ...
  • C++与Java对象销毁及内存泄露

    千次阅读 2011-12-24 16:32:27
    C++与Java对象销毁及内存泄露 转载地址:http://blog.csdn.net/goodxiaolu/article/details/5806482 Destroying Objects And Memory Leaks in C++ And Java  摘要:本文详细阐述了C++与Java对象销毁的...
  • Effective Java 作者简介:Joshua Bloch是Sun公司的高级工程师,也是“Java平台核心组”的...Joshua是许多技术文章和论文的作者,他的关于抽象数据对象复制的博士论文获得过“ACM杰出博士论文奖”提名。他拥有哥伦比
  • Java是面向对象的编程语言,所以新实例(objects)的创建可能是它最重要的概念之一。在新的类实例中构造器(Constructors)扮演了非常核心的角色,Java对于构造器(Constructors)的定义提供了很多方案。
  • Java对象销毁

    千次阅读 2014-10-04 08:22:06
    即对于废弃的资源,不再使用对象,需要将其所占用的内存资源进行回收,重新分配使用。 在Java中,拥有一套完整的垃圾回收机制,当对象的生命周期结束时,Java虚拟机会自动回收无用的占用内存的资源。 对象被...
  • Java对象销毁和finalize方法

    千次阅读 2017-06-16 03:47:18
    在C++中析构方法用于释放资源并且销毁对象本身。 在Java中,由于GC的存在,我们不需要手动回收内存,这大大减少了工作量,也提高了程序的安全性。但是Java也确实存在一个类似于C++中析构的函数。 finalize...
  • Integer[] a = new Integer[] { 1, 2, 3 }; Integer p; p = a[0]; p = null; System.out.println(a[0]); /** * 输出结果:1 */ 不应该是 null吗?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 202,393
精华内容 80,957
关键字:

java销毁对象使用

java 订阅