1: finalize() 方法

  • finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行,
  • 由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用
  • 所以一般不建议使用finalize 方法, JDK9 开始已久被废除

- 总结缺点

 1: finalize机制本身就是存在问题的。

  2:finalize机制可能会导致性能问题,死锁和线程挂起。

 3:finalize中的错误可能导致内存泄漏;如果不在需要时,也没有办法取消垃圾回收;并且没有指定不同执行finalize对象的执行顺序。此外,没有办法保证finlize的执行时间。
遇到这些情况,对象调用finalize方法只有被无限期延后

- 观察finalize方法延长类生命周期

class User{

	public static User user = null;

	@Override
protected void finalize() throws Throwable {
System.out.println("User-->finalize()");
user = this;
} } public class FinalizerTest {
public static void main(String[] args) throws InterruptedException {
User user = new User();
user = null;
System.gc();
Thread.sleep(1000); user = User.user;
System.out.println(user != null);//true user = null;
System.gc();
Thread.sleep(1000);
System.out.println(user != null);//false
}
}

  

- JDk9 以前的垃圾回收代码

public class Finalizer {

    @Override
protected void finalize() throws Throwable {
System.out.println("Finalizer-->finalize()");
} public static void main(String[] args) {
Finalizer f = new Finalizer();
f = null; System.gc();//手动请求gc
}
}
//输出 Finalizer-->finalize()

2:Cleaner类的使用

简介:

在Java9 以后 提供了最终类Clear来代替实现,下面看一下官方例子

package Thread;

import java.lang.ref.Cleaner;

public class CleaningExample implements AutoCloseable{

    private final static Cleaner CLEANER=Cleaner.create();// 创建者模式创建对象

   static  class State implements Runnable{ // 清理对象 下面说
State() {
System.out.println("init");
}
@Override
public void run() {
System.out.println("close");
}
} private final State state;
private final Cleaner.Cleanable cleanable; // clearner 中的接口 实现唯一的清理方法 public CleaningExample() {
super();
this.state = new State();
this.cleanable=CLEANER.register(this, state); // 注册清理容器中 并且需要清理对象的引用
} @Override
public void close() throws Exception {
cleanable.clean(); //进行清理操作
} public static void main(String[] args) {
while(true) {
new CleaningExample();
}
} }

上面 看出:

  • Cleaner 是最终类 不能被重写, 内部方法基本以静态方法提供  掌握例子上面的方法即可

重点指出

 static class State implements Runnable
  • 如果直接在类中直接定义实现, 必须提供一个静态内部类 (强制),否者不能进行回收   原因(: 普通内部类 局部内部类 对于外部类有依赖(引用),无法真正实现内存的释放 )
  • 可以选择直接定义外部类 (较为复杂,需要传递清理引用  Cleanable)

什么时候被回收?

  • * 1. 注册的Object处于幻象引用状态

  • * 2. 显式调用 clean 方法

实际例子(模版)

public class CleaningExample extends Thread implements AutoCloseable {
private final static Cleaner CLEANER = Cleaner.create();
private final State state;
private final Cleaner.Cleanable cleanable; public CleaningExample() {
this.state = new State();
this.cleanable = CLEANER.register(this, state);
} @Override
public void close() throws Exception {
cleanable.clean();
} @SuppressWarnings("resource")
public static void main(String[] args) {
while (true) {
CleaningExample example = new CleaningExample();
}
}
// 模拟业务请求
@Override
public void run() {
System.out.println("数据库 海量 查询请求 ................");
}
// 清理模版
class State implements Runnable {
State() {
System.out.println("<--- init --->");
}
@Override
public void run() {
System.out.println("<--- close --->");
}
}
}

实现基础

    /**
* Heads of a CleanableList for each reference type.
*/
final PhantomCleanable<?> phantomCleanableList; final WeakCleanable<?> weakCleanableList; final SoftCleanable<?> softCleanableList; // The ReferenceQueue of pending cleaning actions
final ReferenceQueue<Object> queue;

在CleanerImpl 类进行clearner类的最终实现,看以看到定义的这些个字段,基本上明确了 他的基本原理

Java9以后的垃圾回收的更多相关文章

  1. 降低Java垃圾回收开销的5条建议

    保持GC低开销的窍门有哪些? 随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器.从 serial 垃圾回收器到CM ...

  2. 深入了解java虚拟机(JVM) 第六章 垃圾回收算法

    一.标记清除算法 标记清除算法顾名思义,就是将需要回收的对象进行标记,然后进行清除.那么这个算法就有标记和清除两种过程.标记过程主要是通过可达性分析算法进行判断存活对象,然后遍历所有的对象来找到需要回 ...

  3. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  4. 修改session垃圾回收几率

    <?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...

  5. .NET面试题系列[5] - 垃圾回收:概念与策略

    面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...

  6. .net垃圾回收机制编程调试试验

    1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...

  7. Java垃圾回收

    垃圾收集算法 引用计数 堆中的每个对象都有一个引用计数,当对象被引用时引用计数加1,当对象的引用被重新赋值或超出有效区域时引用计数减1,当一个对象被回收后,它所引用的对象的引用计算减1.当一个对象的引 ...

  8. JavaScript具有自动垃圾回收机制

    JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存.   正常的生命周期:     局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...

  9. .NET 垃圾回收与内存泄漏

    > 前言相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不 ...

随机推荐

  1. android CTS 命令

    > h //help Host:  help: show this message  help all: show the complete tradefed help  exit: grace ...

  2. MySql连接笔记

    一.内连接查询  inner join 关键字:inner  join   on 语句:select * from a_table a inner join b_table b on a.a_id = ...

  3. java课堂测试样卷-----简易学籍管理系统

    程序设计思路:分别建立两个类:ScoreInformation类(用来定义学生的基本信息以及设置set和get函数)ScoreManagement类(用来定义实现学生考试成绩录入,考试成绩修改,绩点计 ...

  4. XSS漏洞之加载远程js文件

    这次在对一个系统渗透测试过程中,发现一个XSS漏洞,可弹窗,并且没有httponly 但是在尝试加载远程js文件的时候发现,script标签被过滤掉了,准确的说应该是服务器后端在识别到输入内容有< ...

  5. springboot使用Jpa连接数据库

    springboot使用Jpa连接数据库 1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> < ...

  6. Python(Head First)学习笔记:四

    4 持久存储:文件存储.读写 数据保存到文件:在学习的过程中出现了一个问题,老是报一个错:SyntaxError: invalid syntax: 这个是语法错误,后来搜了下才知道是python2.7 ...

  7. netcore mvc 的简单实现

    实现的功能 简单的路由系统 支持中间件 简单Filter支持 只支持HttpPost.HttpGet 使用Dotliquid做为视图渲染引擎 核心实现 HttpChannel 复制监听Tcp请求,并按 ...

  8. Docker入门到实践——简单操作

    1.对比传统虚拟机总结 特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 2.基本概念 Docker包括三个基 ...

  9. Unity3D_07_日志、文本打印

    1.Debug.Log(“hello”); 2.打开控制台查看日志:ctrl+shift+c 3.输出一个位置的坐标(需要转换成字符串.ToString()) Vector3 worldPositio ...

  10. Centos7上安装jdk8

    CentOS7 下安装jdk8环境 1 检查服务器环境 首先,我们需要检查一下服务器是否安装过java环境,可以使用如下命令: java -version 如果已经安装有java环境,会出现类似于以下 ...