Java实现类的重载及使用垃圾回收钩子函数

下面以代码加注释,来方便读者理解。

package com.company;

public class Main {
    public static void main(String[] args) {
//        未被引用的,无用对象
        new Book("hello Java");
//      手动调用系统回收进行标记,进行回收
        System.gc();
    }
}
//声明一个书类
class Book {
//    书的名称
    String bookName;
//    书的价格
    double bookPrice;

//  注解: 同一个类利用方法重载机制可以拥有多个声明的构造方法,采用不同的参数列表实现,术语叫: 方法重载

//  构造方法1 一个参数
    public Book(String bookName) {
//        这种调用方式,可以降低沉余代码量,在参数少的构造函数调用参数多的构造函数,实现构造函数体的重用
//        this 为调用当前实例对象的构造方法,传不同数量的参数,会触发不同的构造函数(重载机制),在这里触发的是构造方法2
        this(bookName, 520);
    }

//  构造方法2 二个参数
    public Book(String bookName, double bookPrice) {
        this.bookName = bookName;
        this.bookPrice = bookPrice;
    }

//  下面的finalize是一个当实例对象被Java运行时系统进行准备自动垃圾回收前,会对其自动调用的一个finalize方法, 类似 钩子函数机制
//    触发条件:无用对象
//    1.离开作用域的对象
//    2.没有被引用指向的对象,比如: new Book(‘hello the program‘); 没有被引用

//   在Java运行时系统当中存在一个垃圾收集器他会自动扫描对象的动态内存区域,对没有被使用的对象会进行标脏(标记)
//    ,然后会在下一次的垃圾回收时将这个对象进行销毁,在销毁前就会调用finalize方法,他是每个类都默认存在的一个方法,继承自Object对象,你可以重写也称覆盖(Override)这个方法体来进行一些操作,但要注意以下几点:
//    补充:垃圾收集器是一个后台线程运行的,在系统空闲时会被异步执行。

//    finalize特点:
//    1.用于释放资源
//    2.什么时候会被调用是不知道的,所以是无次序的,可能在任何时机以任何次序被执行
//    注意: 在进行释放资源的操作时,不能有严格次序关系,所以写的时候,不管什么时候这个finalize方法会被执行都不能写响应程序正确性的代码。

    @Override
    protected void finalize() {
        if (this.bookPrice == 520) {
            System.out.println(this.bookName);
        }
    }
}

原文地址:https://www.cnblogs.com/xiaolantian/p/12584209.html

时间: 2024-11-09 00:43:22

Java实现类的重载及使用垃圾回收钩子函数的相关文章

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

Java 中的四种引用及垃圾回收策略

Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 2.软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可物的生活用品.如果内存空间足够,垃圾回收器就不会回收它,如果

【转载】Java性能优化之JVM GC(垃圾回收机制)

章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-

Java GC系列(4):垃圾回收监视和分析

在这个Java GC系列教程中,让我们学习用于垃圾回收监视和分析的工具.然后,选用一种工具来监视一个Java示例程序的垃圾回收过程.如果你是一名初学者,你最好仔细阅读该系列教程.你可以从这里(垃圾回收介绍)开始. Java GC监视和分析工具 下面是一些可用的工具,每个都有自己的优势和缺点.我们可以通过选择正确的工具并分析,来提升应用程序的性能.这篇教程中,我们选用Java VisualVM. Java VisualVM Naarad GCViewer IBM Pattern Modeling

java虚拟机学习-JVM调优总结-垃圾回收面临的问题(8)

如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象.那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的.上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始.同时,一个栈是与一个线程对应的,因此,如果有多

Java对象"后事处理"那点事儿——垃圾回收(一)

1.Dead Or Alive 我们都知道对象死亡的时候需要进行垃圾回收来回收这些对象从而释放空间,那么什么样的对象算是死亡呢,有哪些方法可以找出内存中的死亡对象呢?一般来说,我们可以这样认为:如果内存中不存在对当前对象的引用,则此对象一定是死亡状态:但是死亡状态的对象并不一定没有其他对象进行引用(可能存在死亡对象循环引用的情况).这里需要说明一下,死亡的对象并不一定会被回收释放占用的空间,这种情况就是常称的"内存泄漏".判定对象存活的算法一般是以下两种. 1.1 引用计数法 引用计数

Java ——对象 类 方法重载 构造方法 封装

本节重点思维导图 快捷键 生成代码:alt+shift+s 提取变量:alt+shift+L 快速复制行:alt+ctrl+向上或向下的箭头 删除行:ctrl+d 类:对同一种事物共同属性和行为的抽象 对象:根据类创建出来的具体的实物 方法重载 在同一个类中提供多个同名不同参的方法. 重载要求:方法名称相同,但参数的   [ 类型不同     or   参数的个数不同     or     参数的顺序不同] public class Demo { public void fun1() { } p

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

Java内存管理及垃圾回收总结

概述 Java和C++的一个很重要的差别在于对内存的管理.Java的自己主动内存管理及垃圾回收技术使得Java程序猿不须要释放废弃对象的内存.从而简化了编程的过程.同一时候也避免了因程序猿的疏漏而导致的内存泄露问题. 内存管理和垃圾回收是JVM很重要的一个部分.深入理解Java的内存管理和垃圾回收机制是避免及修复Java相关异常(OutOfMemoryError, StackOverflowError),理解Java对象创建过程,有效利用内存.构建高性能Java应用的前提.本文将先后介绍Java