Java终止函数深度分析

Java终止函数深度分析,第1张

Java终止函数是什么?

对于对象而言 Java 终止函数履行最后的确认工作 这与Java 构造函数是相反的 Java 构造函数创建以及初始化了一个Java类实例 当一个对象不在被需要以及这些资源必须被用于其它对象的时候 在一个类实例或者发行的系统资源 比如说文件描述符或者网络 <接口连接上 Java 终止函数可以被用来清除任务 你不需要证据或者为终止函数返回任何值 遗憾的是当一个类或者接口被载入的时候 目前的Java语言的介绍中没有任何关于终止函数用于Java类或者接口的解释 让我们进一步研究一下java lang对象的终止函数finalize()方法 提供一个方法实例 (如何使用PHP 中的Clone函数)

protected void finalize() throws Throwable

当一个Java对象不再被需要的时候 这个对象原先占有的空间就会期望能够自动的由Java回收工具进行回收利用 这在Java中有着显著的差异 并且在大多数的结构性程序语言 比如说C语言中 是不常见的 如果一个类实例实施终止函数finalize()方法 它所占用的空间就不能及时的被回收工具重新回收利用 最坏的情况是也许它根本就不再被回收了 任何实施终止函数finalize() 方法的类实例都经常调用终止对象 当它们不再被引用的时候 它们不能立即被Java回收工具回收 为最终程序Java回收工具将对象附加到指定的队列 通常是由一个指定的线性程序执行的 在一些Java虚拟机上被称为 参考句柄 在最终程序阶段 终止函数 线性程序会执行每一个对象的终止函数finalize()方法 finalize() 成功执行之后Java回收工具将会交付对象 将它所占用的空间由 future 碎片收集功能再生 我没有说 现有 这意味着至少两个碎片收集周期必须被要求用来回收终止对象 听起来这像是有一些消耗的?正确 我们需要一些方法使得空间能够重新利用 (Java新的垃圾回收器需购买支持后才能用)

线性终止函数在系统中没有被给予最大优先权 优先级更高的线程导致终止对象被排列 如果一个线性 终止函数 无法与这个效率保持一致 终止函数队列就会持续增长 导致Java堆不停的被堆积 最终Java堆将会被耗尽 并且java lang OutOfMemoryError将会被抛出

对于任何对象而言 一个Java虚拟机将不会超过一次的引用终止函数finalize()方法 如果finalize()方法抛出了什么例外现象 对象的终止程序就会停止下来

对于类的finalize()方法你几乎可以自由的做任何事情 当你这巧伍样做的时候 当对象不再被引用或者不再需要的时候 请不要期望存储 <空间会被任何一个由Java回收程序回收再生的对象占领 为什么? finalize()方法将要完整的按进度完成的这种情况是不可控的 最坏的情况是 当这里没有更多涉及到对象的时候 也许它甚至不会被解决 这意味着任何具有finalize()方法的对象被回收都是无法被保障的 这是内存 <>管理发展的一个潜在危险 不必多说 有相当大的开销是花费在队列排列 运行finalize()方法以及将对象反射到下一个碎片整理环节上的

孝则或如果你想在对象上运行函数 考虑到终盯州止函数作为最后一个方法 执行你自己的清理垃圾方法 这将会更加的平稳 完全信任终止函数来进行事后的垃圾清理工作是非常危险的 特别是当你的终止对象涉及到本地资源的时候

Java 终止函数的实际 *** 作体验

ObjectWYieldFinalizer内 我们可以伴随着线性yield()执行finalize()方法 这样finalize()就不能完全执行 见代码表一 线性yield()方法从正在运行的程序中阻止现有的线性程序执行 以及允许其它的线性程序执行 如果终止函数线性程序调用这种finalize()方法 它将会暂停执行

代码表一

/*

* @Author : Jinwoo Hwang

* (C) Copyright IBM Corp All Rights Reserved

*/

public class ObjectWYieldFinalizer {

protected void finalize() throws Throwable {

Thread yield()

}

}

public class TestObjectWYieldFinalizer {

public static void main(String[] args) {

while(true){

ObjectWYieldFinalizer o = new ObjectWYieldFinalizer()

}

}

lishixinzhi/Article/program/Java/hx/201311/27113

方案 *** 作如下:

(1)让程序在一拍漏个单独的线程中运行,然后在终止时,可以用线程的终止方法来结带贺好束它。蠢铅

(2)退出Java程序时尽量不要使用java.lang.System的exit方法。Exit 方法可以终止JVM,从而终止程序,但如果同时运行了另一个Java程序,使用exit方法就会让该程序也关闭,这显然不是希望看到的情况!!!!

要退出Java程序,可以使用destory()退出一个独立运行的过程。对于多线程程序,必须要关闭各个非守护线程。

只有在程序非正常退出时,才使用exit方法退出程序

http://www.baidu.com/s?wd=52095384130


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12557310.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存