首页 > 编程语言 >JAVA常用类--Cleaner类

JAVA常用类--Cleaner类

时间:2024-03-11 23:22:59浏览次数:21  
标签:Cleaner JAVA finalize -- void 回收 Book public 图书

Cleaner类

注意:在JDK1.9以上版本可使用

在Java程序中提供有GC的垃圾回收机制,如果发现堆内存不足时一定要进行垃圾回收以释放内存空间

但如果某些对象在回收前需要做一些处理,可以通过覆写Object类中的finalize()方法来实现这种回收前的处理

  • finalize()方法的定义:
@Deprecated(since="9")
protected void finalize() throws Throwable { }

finalize()方法实际上从JDK1.0时就开始提供,但一直到JDK1.9后才发现此方法成为了不推荐使用的方法,同时这个方法上所抛出的一个Throwabke类型的异常(Erroe和Exception),在对象回收时可能会出现各种问题,但不影响回收!

实例1:传统的对象回收

  • 不进行手动回收
class Book{
    //无参构造
    public Book(){
        System.out.println("【构造】用心编写了一本优秀的原创技术图书!");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("【析构】图书使用完毕,可以销毁!");
    }
}
public class Application {
    public static void main(String[] args) {
        Book book = new Book();//创建实例化对象
        book = null;//断开堆内存的指向,变为垃圾空间
    }
}

运行结果如下:

【构造】用心编写了一本优秀的原创技术图书!
  • 调用gc()进行手动回收

如果不进行手动的gc()回收,则需要等待自动回收,自动回收的时间是不可控的!!

class Book{
    //无参构造
    public Book(){
        System.out.println("【构造】用心编写了一本优秀的原创技术图书!");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("【析构】图书使用完毕,可以销毁!");
    }
}
public class Application {
    public static void main(String[] args) {
        Book book = new Book();//创建实例化对象
        book = null;//断开堆内存的指向,变为垃圾空间
        //如果不进行手动的gc()回收,则需要等待自动回收,自动回收的时间是不可控的!!
        System.gc();//进行垃圾回收
    }
}

运行结果如下:

【构造】用心编写了一本优秀的原创技术图书!
【析构】图书使用完毕,可以销毁!
  • 手动抛出异常

finalize()方法代码修改如下:(其他代码不变)

protected void finalize() throws Throwable {
        System.out.println("【析构】图书使用完毕,可以销毁!");
        throw new Exception("这本图书还有用,不能销毁!!");//手动抛出异常
    }

运行结果如下:

【构造】用心编写了一本优秀的原创技术图书!
【析构】图书使用完毕,可以销毁!

以上的这种程序做法是在JDK1.9以前提供的处理形式,但这样的做法一直以来都存在严重问题

如果在finalize()里面出现一些线程的死锁操作,那么就可能会造成垃圾回收的失败,同时也会产生严重的线程阻塞问题

解决方法:在JDK1.9之后,启动了一个专属的回收线程----Cleaner类

实例2:

import sun.misc.Cleaner;
class Book implements Runnable{ //设计一个回收线程
    //无参构造
    public Book(){
        System.out.println("【构造】用心编写了一本优秀的原创技术图书!");
    }
    public void read(){
        System.out.println("【读书】认真学习!");
    }
    @Override
    public void run() { //真正的回收由线程来完成!!!
        System.out.println("【析构】图书使用完毕,可以销毁!");
    }
}
class BookCleaner implements AutoCloseable{ //必须实现AutoCloseable接口
    private static final Cleaner cleaner = Cleaner.create();//创建一个回收对象
    private Cleaner.Cleanable cleanable;
    public BookCleaner(Book book){
        this.cleanable = cleaner.register(this,book);//注册一个回收线程
    }

    @Override
    public void close() throws Exception {
        this.cleanable.clean();//释放时进行垃圾清除
    }
}
public class Application {
    public static void main(String[] args) {
        Book book = new Book();
        try(BookCleaner bc = new BookCleaner()){
            book.read();//可以在中间进行一些对象的处理操作
        }catch (Exception e){}
    }
}

运行结果如下:

【构造】用心编写了一本优秀的原创技术图书!
【读书】认真学习!
【析构】图书使用完毕,可以销毁!

图解

经过以上的分析基本已经清楚对象的创建以及回收处理的操作,以下是对Java中对象的生命周期流程

  1. 创建阶段:每当使用关键字new就表示要开辟新的堆内存空间,同时每一个新的对象实例化时都需要去执行类中的构造方法,构造方法的目的是为了类中成员属性的初始化
  2. 应用阶段:利用指定的对象名称可以直接进行类之中的方法的调用处理
  3. 不可见阶段:如果现实某一个方法内部有一个对象,则该方法执行完毕后该对象将不再使用
  4. 不可达阶段:某一块堆内存已经不再有任何的栈内存所指向,那么这块空间将成为垃圾空间
  5. 收集阶段:JVM会自动的进行此块垃圾空间的标记,标记之后将准备通过GC回收释放,JDK1.8及以前的版本均使用finalize()方法,JKD1.9及以后的版本推荐使用CLeaner来完成
  6. 释放阶段:JVM重新回收垃圾的堆内存空间,供后续新对象使用

标签:Cleaner,JAVA,finalize,--,void,回收,Book,public,图书
From: https://www.cnblogs.com/dxrrrr/p/18067348

相关文章

  • JAVA常用类--Runtime类
    Runtime类Runtime类描述的是一种运行时,在Java程序执行过程中,所有的java程序都一定要运行在JVM(虚拟机)的进程中有了JVM进程,就需要一种类型可以描述当前进程的相关环境以及与之相关的处理操作,即Java设计出了Runtime类每个JVM的进程中都会自动包含有一个Runtime类的实例化对象,打......
  • WAF和IPS的区别
    简介Web应用防火墙WAF(WebApplicationFirewall)和入侵防御系统IPS(IntrusionPreventionSystem)是网络安全领域中常见的两种安全解决方案,它们有以下区别:1.功能定位WAF主要用于保护Web应用程序免受各种Web攻击(如SQL注入、跨站脚本等)的影响,通过检测和过滤HTTP/HTTPS流量......
  • Docker compose部署Typecho博客系统
    编辑docker-compose.yml文件:services:typecho:image:joyqi/typecho:nightly-php8.2-apacherestart:alwaysports:-8086:80#端口映射,把博客默认的80端口映射到8086端口environment: TYPECHO_DB_HOST:typecho_db#默认值是localhost,docker......
  • 部署测试平台-使用docker安装mysql
    1.拉取mysql5.7镜像:dockerpullmysql:5.72.新建数据库挂载目录:mkdir-p/root/data/mysql5.7/conf   配置文件mkdir-p/root/data/mysql5.7/data   数据库数据目录mkdir-p/root/data/mysql5.7/log   数据库日志3.把配置文件my.cnf放到/root/data/m......
  • 今日总结
        importjava.util.*;publicclasstest{staticScannerin=newScanner(System.in);publicstaticvoidinput(inta[],intn){//数组输入for(inti=0;i<n;i++){a[i]=in.nextInt();}}publicstaticin......
  • yum总纲
    yum总纲yum源搭建首先本文档讲解两种搭建方式,第一有网络环境和第二种无网络环境。第一种:有网络环境首先进入系统执行:以下命令,获取网络源wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repowget-O/etc/yum.repos.d/epel.repohttp:......
  • base16编码和解码-支持中文
     这是一个base16编码/解码的方法。而且支持中文的编码和解码。 代码由chatgpt-3.5生成:#include<iostream>#include<string>conststd::stringbase16="0123456789ABCDEF";voidBase16Encode(conststd::string&data,std::string&out){for(unsigned......
  • 基于通道注意力和时间注意力的时间卷积网络:用于航空发动机剩余使用寿命预测的双重注意
    基于通道注意力和时间注意力的时间卷积网络:用于航空发动机剩余使用寿命预测的双重注意力架构标题:Channelattention&temporalattentionbasedtemporalconvolutionalnetwork:Adualattentionframeworkforremainingusefullifepredictionoftheaircraftengines......
  • PXE批量安装操作系统自动化
    PXEz自动化在PXE服务器操作:*yum-yinstalldhcpxinetdtftptftp-server**yum-yinstallsystem-config-kickstart**yum-yinstallsyslinux**[root@localhostks]#cat/etc/dhcp/dhcpd.conf**subnet192.168.7.0netmask255.255.255.0{**range192.168.7.100192.1......
  • 2024-3-10
    TowardsUnifiedText-basedPersonRetrieval:ALarge-scaleMulti-AttributeandLanguageSearchBenchmark(SOTA)1INTRODUCTION问题:由于个人隐私的问题,缺乏数据。由于在进行人工标注时,标注者会采用比较简短单一的话语,因此会存在标注偏见。解决办法:采用现成的扩散......