`
ss1
  • 浏览: 77793 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何销毁对象

阅读更多

在任何一个面向对象的语言中,这个对象销毁机制都是很重要的。因为如果对象不能够被及时的回收,那么很多没用的对象就仍然会占用内存地址。久而久之,就会导致内存耗竭,从而导致服务器当机。

在这个对象的销毁上,Java语言比其他面向对象的语言更胜一筹。因为其他面向对象的语言,需要在程序代码中手工回收废弃的对象。不过Java语言则不同。在Java语言中拥有一套完整的对象垃圾回收机制。即程序开发人员不需要手工的回收废弃的对象。垃圾回收器将回收无用对象所占用的内存资源。不过这个垃圾回收器并不是万能的,需要结合其他的对象回收方式,才能够最终解决这个对象回收的问题。在Java中,总共有三种方式可以用来解决对象回收的问题,笔者将他们称为三把利剑。

第一把剑:垃圾回收器

垃圾回收器是Java平台中用的最频繁的一种对象销毁方法。垃圾回收器会全程侦测Java应用程序的运行情况。当反先有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的内存空间。在这里,程序开发人员需要知道,在哪些情况下垃圾回收器会认为这些对象是垃圾对象。通常情况下,如果发生以下两种情况时,系统会认为这些对象是垃圾对象,需要销毁。

一是将一个NULL值赋值给对象。如用户先建立了一个对象str1。对象用完了之后,再利用赋值语句,将NULL值赋值给这个对象str1,即使用str1=NULL的方式将NULL值赋值给这个对象。此时这个对象与内存中对象的存储地址之间就失去了联系。此时内存中的对象就好像成为了一个无主的对象,就会被垃圾回收器销毁。不过这也有例外。如现在同一个对象有两个名字,分别为str1与str2。此时若只是将NULL值赋值给str1,那么内存的这个对象仍然有一个主人,即str2。此时这个对象还暂时不会被垃圾回收器回收。除非在代码中讲这个对象所关联的所有对象名字都赋值为NULL。此时这个对象才变为无主的对象,才会被垃圾回收器回收。在Java中定义自己的工具库

二是对象其超出了作用范围,这个这个对象就被认为是垃圾对象,被被垃圾回收器回收并释放内存。其实对象跟变量一样,其也有作用域。当超过这个作用域的话,跟变量一样,这个对象也就无效了,其他地方不能够再引用这个对象。此时这个对象就是名存实亡了。为此垃圾回收器也把这种超过作用范围的对象当作垃圾对象来处理。所以说,如果程序员要让对象中的某些成员变量或者成员方法一直有效的话,就需要采用static关键字,让其在变量销毁时仍然有效,或则仍然可以调用这些成员变量与成员方法。

另外笔者在这里各位读者一个小的思考题。大家想想看,如果遇到如下这种情况,Java垃圾回收器是否会回收对象?现在笔者先定义两个对象str1,str2。此时在内存中已经为这个两个对象分配了存储空间。然后笔者再利用str2=str1语句,将str1指向的内存地址赋值给str2。此时对象str1、str2就指向同一个内存地址,即代表同一个对象。而原先对象str2指向的对象就变成了一个无主的对象了,对象名str2已经与这个对象失去了联系。在这种情况下,这个对象是否会被当作垃圾对象被销毁呢?给为读者回去可以好好想想这个问题。若能够得出正确的答案,则说明大家对于垃圾回收器已经有了比较透彻的了解。 JDK7更新为Java带来更多模块

第二把利剑:finalize方法

虽然说垃圾回收器已经是一个比较完善的对象销毁机制,但是其并不能够解决Java语言中所有对象的销毁问题。如Java语言平台中,创建对象主要有两种方式,分别为利用NEW关键字来创建(这是对象创建的主要方式)与不适利用NEW关键字来创建。如果Java语言中某些对象不是利用new关键字为对象在内存中分配一块存储区域,那么这种类型的对象就不能够被垃圾回收站回收。即使在代码中将NULL值赋值给这个对象,仍然不能够被垃圾回收器回收。虽然这种对象比较少,但是毕竟存在。为了解决这类对象的回收与内存释放问题,在Java语言中提供了一个finalize的方法。通过这个方法可以显示的让系统回收这个对象。这是一个Object类的方法。通常情况下,这个方法是被声明为protected。程序开发人员在必要的时候,可以在自定的类中定义这个方法。假设现在程序开发人员定义了这个方法,那么在对象销毁时,垃圾回收器会先采用这个方法来销毁对象。并且在下一次垃圾回收动作发生时,最终释放对象的内存。

可见,采用了finalize 方法,虽然可以让这个对象被垃圾回收器回收,但是其原理是不同的。垃圾回收器是先调用这个方法,然后在下次运行这个垃圾回收作业时再释放其占用的内存。另外需要注意的是,这个方法并不一定会保证发生。也就是说,相对来讲,其安全性并没有垃圾回收器那么的高。故在实际创建对象时,最好还是采用new关键字来创建比较安全,也更加的方便。因为在利用New关键字来创建对象时,在代码中不需要加入另外额外的代码。所以从安全性与便利性上来说,笔者都建议采用new方法为对象在内存中分配存储区域,而不建议采用其他的方式。在采用垃圾回收器的时候,其会自动检测对象的状态,而不需要程序员告知。其发现对象超出了作业域范围或者对象被重置为空时,其就会被自动销毁并释放对象所占用的内存,这种方式处理起来相对来说更加的安全与便利。

第三把利剑:利用System.gc方法强制启动垃圾回收器

垃圾回收器其实自动启动的。也就是说,垃圾回收机制起会自动监测垃圾对象,并在适当的时候启动垃圾回收器来销毁对象,释放内存。但是这个垃圾回收器也会有不合作的时候。也就是说,这个垃圾回收器不受程序代码的控制,其具体执行的时间也会不确定,从而导致上面的finalize方法无法执行,某些对象无法及时销毁。为此有时候需要利用代码来强制启动垃圾回收器,来销毁对象。

笔者平时在给一些学员培训时,往往将这个垃圾回收器比喻成医院里的护士。平时的时候,护士会每隔一段时间来进行查房,看看病人有没有什么问题。不过在必要的时候,病人也可以通过警铃来呼叫护士。如当盐水挂完了就可以要求护士来更换盐水。其实这个护士定期查房就好像是垃圾回收器会根据应用程序的运行情况来定时的或者不定时的启动。而这个警铃就好像是这个System.go方法。在有需要的时候,程序开发人员可以在代码中调用这个方法,来强制让护士来病房,即强制启动这个垃圾回收器。采用这个方法,给程序开发人员多了一种主动权,而不需要被动的等着垃圾回收器的启用。有时候,在代码种类利用这个方法不定期或者定期的强制启动垃圾回收器,对及时销毁垃圾对象能够起到一个辅助与保障作用。

分享到:
评论

相关推荐

    C#创建、销毁对象和继承

    内容提要 • 使用构造方法 • 初始化数据 • 对象和内存 • 资源管理 派生类 • 实现方法 • Sealed类 • 使用接口 • 使用抽象类

    【原】unity 不销毁对象的处理

    NULL 博文链接:https://wenshuang.iteye.com/blog/2180680

    Qt6 QML Book/动态QML/创建和销毁对象示例源码

    Qt6 QML Book/动态QML/创建和销毁对象 示例源码 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者交流使用,请于下载24小时内删除

    JAVA创建和销毁对象的方法

    本篇文章主要介绍了JAVA创建和销毁对象的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java中对象的销毁方法分析

    主要介绍了Java中对象的销毁方法,较为详细的分析了对象的功能、用法及销毁对象对于程序运行的益处,需要的朋友可以参考下

    WinObj v3.14 - 驱动开发必备的内核对象查看工具

    最后,WinObj 版本 3.0 具有用户界面增强功能 (,包括深色主题) 、知道如何打开设备对象、在创建/销毁对象时提供动态更新,并允许搜索和筛选。 安装和使用 WinObj 没有设备驱动程序组件,因此你可以像运行任何 Win...

    Java线程池技术详解

    在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一...

    [java]读书笔记整理:一切都是对象

    更重要的是:在C++中,一旦使用完对象后,必须确保要销毁对象。 这样便代码一个有趣的问题。如果java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C++里可能发生的问题。...

    说一说servlet的生命周期

    Servlet生命周期就是servlet从创建到销毁的过程,包括加载和实例化,初始化,服务,和销毁4步。  当客户第一次请求时,首先判断是否存在servlet对象,第一次... 当tomcat关闭时,调用destory()方法销毁对象。  

    C++ 编程思想(PDF)

    1.7 创建和销毁对象 11 1.8 异常处理:应对错误 12 1.9 分析和设计 12 1.9.1 第0阶段:制定计划 14 1.9.1.1 任务陈述 14 1.9.2 第1阶段:我们在做什么 14 1.9.3 第2阶段:我们将如何建立对象 16 1.9.3.1 对象...

    CWnd-MFC中文手册

    DestroyWindow函数销毁Windows的窗口,但是不销毁对象。 CWnd类和消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在派生类中重载OnMessage...

    监听器:监听三个对象的创建和销毁方法

    本次工程的目标是学习监听器,掌握监听三个对象的创建和销毁方法。 三个对象:rquest,session,ServletContext 实现的接口:ServletRequestListener,HttpSessionListener,ServletContextListener 工程的大致步骤...

    天方夜谭VCL: 生死

    生命是什么?科学和宗教都给出了不同的诠释。有句话也许说得更有意思:生命是这样一...对象也不例外,不过生成以及销毁对象都需要健全的机制作保证。否则不仅对象本身遭殃,甚至会导致程序乃至整个系统崩溃。 <br>

    thinking in Java 第四版中文 part1

    2.3 永远不需要销毁对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 创建新的数据类型:类 2.4.1 域和方法 2.4.2 基本成员默认值 2.5 方法、参数和返回值 2.5.1 参数列表 2.6 构建一个Java程序 2.6.1 名字可见性 2.6.2 ...

    C++智能指针的原理和实现.pdf

    delete:指向⼀个动态独享的指针,销毁对象,并释放与之关联的内存。 使⽤堆内存是⾮常频繁的操作,容易造成堆内存泄露、⼆次释放等问题,为了更加容易和更加安全的使⽤动态内存,C++11中引⼊了智 能指针的概念,⽅...

    基于StrangeIoC的点击方块加分的Demo

    基于StrangeIoC的点击方块加分的Demo,Unity的版本号为5.6

    垃圾回收算法

    (2)在创建对象和销毁对象时少了操作引用计数值的开销 缺点:(1)在垃圾回收器运行过程中,应用程序必须暂时停止;(2)标记阶段需要遍历所有的存活对象,会造成一定的开销,在清除阶段,清除垃圾对象后会造成大量...

    C++动态内存分配(new/new[]和delete/delete[])详解

    为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些...

    2018最新BAT java经典必考面试题最新版本.docx

    题目示例如下:希望帮到大家 50、final, finally, finalize 的区别? 答:final:修饰符(关键字)有三种...这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作。

    C++智能指针详解(1).pdf

    delete:指向⼀个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会出现两种问题: (1)⼀种是忘记释放内存,会造成内存泄漏; (2)⼀种是尚有指针引⽤内存的情况下就释放了它,就会产⽣引⽤...

Global site tag (gtag.js) - Google Analytics