Java的终结器仍然存在

当我第一次学习Java并从C ++过渡到Java时,我记得我经常被告知,经常读到它不应该像C ++析构函数那样对待Java终结器,也不应该依靠它。 该建议的频率和坚持性对我产生了影响,以至于我无法回忆起我上一次编写finalize()方法的经历,也无法回忆起我在编写,阅读,审阅,维护,修改和调试的Java代码。 直到最近,然而, 的finalize()的作用是不是我想过很多,可能是因为我没有使用过的finalize() 。 最近对finalize()的经验已将Java终结器的作用从“学术练习”转移到“野外”的实际问题。

Object.finalize()的方法级Javadoc文档注释提供了有关Java终结器的一些有趣的细节。 首先提供对方法的总体描述,“当垃圾回收确定不再有对该对象的引用时,垃圾回收器将其调用在对象上。 子类将覆盖finalize方法以处置系统资源或执行其他清除。” 该Javadoc注释的另一部分警告了与Java终结器的使用通常相关的几个问题 :“ Java编程语言不能保证哪个线程将为任何给定对象调用finalize方法。 但是,可以保证,在调用finalize时,调用finalize的线程将不持有任何用户可见的同步锁。 如果finalize方法引发了未捕获的异常,则该异常将被忽略,并且该对象的终结将终止。”

乔什·布洛赫(Josh Bloch)在《 有效的Java》中专门介绍了Java终结器这一主题。 有效Java第二版的第7项标题简洁明了,“避免终结器”。 尽管有效Java中的许多项目使用诸如“ Prefer”或“ Consider”之类的动词,但该项目仍使用更强的动词“ Avoid”。 布洛赫(Bloch)确实列举了一些可能使用终结器的示例,但是他对仍然存在的内在问题的描述以及为减轻这些问题而需要考虑的许多事情,使我们大多数人都尽量避免使用它们。

Bloch以强调的( 粗体 )语句开始了有效的Java项目“ Avoid Finalizers”,“ Finalizers是不可预测的,通常是危险的,并且通常是不必要的。 “ Bloch强调开发人员不应“ 在终结器中做任何对时间要求严格的事情 ”,因为“不能保证[Java终结器将被立即执行”,并且他强调开发人员应“ 永远不要依赖终结器来更新关键的持久状态 ”。因为“根本无法保证[Java终结器]将被执行。” Bloch引用了终结器中的异常未捕获的情况,并警告了这样做的危险,因为“未捕获的异常可能会使对象处于损坏状态。”

Bloch还描述了我最近使用过的Java终结器的负面影响。 他的“避免终结器”项强调(以粗体显示 ),“ 使用终结器会严重影响性能 ”,因为“ 使用终结器创建和销毁对象”所花费的时间要长得多。 在我们的例子中,我们使用的是第三方库,该库在内部使用Java类finalize()方法来释放本机内存(C / C ++通过JNI )。 因为这些类中有很多这些对象带有finalize()方法,所以似乎处理Java终结的系统线程落后了,并且锁定了正在终结的对象。

垃圾收集也受到了不利影响 ,因为收集者启动的频率比我们通常看到的还要频繁。 我们很快意识到垃圾收集日志表明垃圾收集问题,这些问题很难追溯到典型的堆大小问题或我们自己类的内存泄漏 。 使用jcmd <pid> GC.class_histogram GC.class_histogram对JVM进程运行非常有用的jcmd ,有助于我们快速了解潜在的罪魁祸首。 该类直方图显示了足够的java.lang.ref.Finalizer实例,以确保它在顶部排名第三。 由于该课程通常在课程直方图的下方,因此我什至通常不会看到或考虑它。 当我们意识到类直方图中描述的前八个实例中的另外三个是第三方库中的三个类,并且它们实现了finalize()方法时,我们就能够解释行为并将其归咎于终结器 (四个直方图中排名前八位的类别中,这是一个相当安全的指责)。

Java语言规范在第12.6节 (“类实例的完成”)中提供了一些与Java终结器相关的细节。 本节从描述Java终结器开始:“可以为一个对象调用的finalize()的特定定义称为该对象的终结器。 在垃圾回收器回收对象的存储之前,Java虚拟机将调用该对象的终结器。” 这里引用了Java语言规范这一节中描述的Java终结器的一些有意不确定的特征(我已经强调了 ):

  • “Java编程语言没有规定如何尽快终结将被调用。”
  • “ Java编程语言没有指定哪个线程将为任何给定对象调用终结器。”
  • “终结器可以按任何顺序调用,甚至可以同时调用。”
  • “如果在完成过程中抛出未捕获的异常 ,则该异常将被忽略,并且该对象的完成过程将终止。”

我发现自己很喜欢与解决此问题的团队一起工作,因为我能够在“现实生活”中体验到我只是从“学术”意义上阅读和了解的内容。 应用最喜欢的工具(例如jcmd )并应用以前的经验(例如识别出jcmd 类直方图中不适当的地方)来解决一个新问题总是很令人满意的。

翻译自: https://www.javacodegeeks.com/2017/03/javas-finalizer-still.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时隙aloha协议仿真程序_工控ModbusTCP/IP协议仿真环境搭建

01ModbusTCP/IP协议简介Modbus TCP/IP是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品。它覆盖了使用TCP/IP协议的“intranet”和“internet”环境中MODBUS报文的用途。协议的最通用用途是为诸如PLC’S&#xff0c;I/O模块&#xff0c;以及连接其…

vector的初始化及常用操作

1.vector的初始化&#xff1a;可以有五种方式,举例说明如下&#xff1a; &#xff08;1&#xff09; vector<int> a(10); //定义了10个整型元素的向量&#xff08;尖括号中为元素类型名&#xff0c;它可以是任何合法的数据类型&#xff09;&#xff0c;但没有给出初值&a…

查看Linux版本

suse版本 lsb_release -a suse版本之间差距还是有的&#xff0c;在suse12.2跑的脚本没有问题&#xff0c;到suse12.4上就出现问题了。 centos版本 cat /etc/redhat-release 转载于:https://www.cnblogs.com/jkhere/p/10900659.html

ps法线贴图插件_法线与置换贴图原理讲解以及烘焙制作!

​首先在讲解之前先给大家讲解下什么是法线贴图&#xff0c;法线贴图其实就是一张带有颜色的凹凸贴图&#xff0c;分别是有红绿蓝&#xff0c;三种颜色构造而成的&#xff0c;如下图所示&#xff1a;每一个颜色通道分别控制了每个像素的方向&#xff0c;当你把法线贴图用到低解…

从向量中读取元素:

从向量中读取元素&#xff1a; 1通过下标&#xff1a; int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (int i 0; i < b.size() - 1; i) cout << b[i] << " "; 2通过迭代器 int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, …

Nim博弈

忽然发现博弈论是个很好玩的东西哎 之前假期学长讲课的时候就发现这种必胜的战略可以用来坑人做题 这两天终于做了第一道博弈论的题&#xff0c;写篇博客纪念一下 灵感来源&#xff1a;洛谷P1247 Pre-scene 众所周知&#xff0c;李明和Jenny都喜欢Danny&#xff0c;为了争夺Dan…

java调用怎么调用方法区_Java中的方法调用有多昂贵

java调用怎么调用方法区我们都去过那儿。 在查看设计不良的代码的同时&#xff0c;听听作者对人们永远不应该牺牲性能而不是设计的解释。 而且&#xff0c;您不能说服作者摆脱其500行方法&#xff0c;因为链接方法调用会破坏性能。 好吧&#xff0c;这可能在1996年左右是正确的…

python中的np array函数_numpy中的np.ascontiguousarray()函数

"Return a contiguous array (ndim > 1) in memory (C order)."用途ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组&#xff0c;使得运行速度更快。C order vs Fortran orderC order 指的是行优先的顺序(Row-major Order)&#xff0c;…

OpenCV版本

#include <opencv2/opencv.hpp>using namespace cv;void main(){/*printf("\t当前使用的opencv版本为 OpenCV"CV_VERSION);getchar();*/std::cout << "\t当前使用的opencv版本为 OpenCV" << CV_VERSION << std::endl;system(&quo…

使用jstat的JVM统计信息

过去&#xff0c;我已经写过关于Oracle和/或OpenJDK Java开发工具包&#xff08;JDK&#xff09;随附的几个命令行工具的信息&#xff0c;但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机&#xff08;JVM&#xff09;统计信息”…

每天一点点之 taro 框架开发 - taro路由及传参

1.路由 taro的路由是自带的&#xff0c;不需要我们额外配置&#xff0c;只需要我们在app.js下config中配置pages即可 class App extends Component {config {pages: [pages/test/test,pages/index/index],} } 2.taro通过api实现跳转&#xff0c;替换 官网地址&#xff1a;taro…

调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

微信小程序开发的过程一定会遇到各种问题&#xff0c;最让人棘手的就是支付问题&#xff0c;因为没有支付做商城类似的小程序就没有办法完成最关键的一步。那么支付失败到底什么原因呢&#xff1f;一下子收集了几个错误类似&#xff0c;希望对你有帮助&#xff1a;No.1{err_cod…

Visual Stutio中win32控制台应用程序、win32项目、MFC项目的区别:

我的理解&#xff0c;我首先把这几个货分为两大类&#xff1b;第一类包括win32控制台应用程序&#xff0c;第二类就是剩下那俩货。而剩下那俩货又有一个包含关系&#xff0c;即win32项目包含mfc。&#xff08;我个人是这个区分的。&#xff09; 一、 区别: &#xff08;1&…

二分图匹配【模板】

传送门&#xff1a; #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define ll long long #define re register const int N1005; inline void read(int &a) {a0;int d1;char ch;while(chgetchar(),ch>9||ch<0)if(…

c++两个数组对比去掉重复的元素_30 数组案例

数组案例案例一&#xff1a;筛选指定数组元素要求&#xff1a;将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后&#xff0c;形成一个不包含0的新数组。var arr [2,0,6,1,77,0,52,0,25,7];var newArr [];for(var i0; i<arr.length; i){if(arr[i]!0){newArr[newArr.length]arr[i…

排序并记录排序前的索引(类似matlab sort函数)

这里用到vector比较方便。 #include<iostream> #include<vector> #include<algorithm> using namespace std; struct num_label { int num; int label; }; //自定义“大于” bool comp(const num_label &a, const num_label &b) { return a.n…

selenium实现登录百度(自动识别简单验证码)

需要做的工作 0、工程结构 1、代码&#xff1a; ①baidu_login.py 1 import re2 import os3 import sys4 import time5 import random6 from selenium import webdriver7 from PIL import Image, ImageEnhance8 import pytesseract9 from func import base642str, str2base6410…

为什么猫王不应该访问Java

最近&#xff0c;我参与了一个关于Java的Optional类型系统的漫长的Twitter讨论 &#xff0c;该系统区分可空类型和非可空类型以及Elvis运算符 &#xff0c;该运算符允许选择空值安全的成员。 后者被认为是简洁的null处理的杀手级功能&#xff0c;对此我强烈不同意。 我对此的看…

python a and b_python-尽管Numpy建议a.b,为什么a.dot(b)比a @ b更...

根据question的答案,也根据numpy的答案,与a.dot(b)相比,二维数组的矩阵乘法最好通过a b或numpy.matmul(a,b)完成.If both a and b are 2-D arrays, it is matrix multiplication, but usingmatmul or a b is preferred.我做了以下基准测试,发现相反的结果.问题&#xff1a;我的…

Mysql高可用集群-解决MMM单点故障

目录 一.理论概述组件介绍三.部署四.测试五.总结preface: MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧. 一.理论概述 MMM(Master-Master replication Manager for MySQL) 是一套支持双主日常管理的脚本程序,使用Perl语言开发,主要用来监控和管理MySQL双…