欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java9垃圾回收方法finalize() 原理解析

 更新時間:2020年02月25日 11:09:21   作者:---WeiGeH  
這篇文章主要介紹了Java9垃圾回收方法finalize() 原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1: finalize() 方法

finallize() 方法是Object類的方法, 用于在類被GC回收時 做一些處理操作, 但是JVM并不能保證finalize(0 ) 方法一定被執(zhí)行,
由于finalize()方法的調(diào)用時機具有不確定性,從一個對象變得不可到達(dá)開始,到finalize()方法被執(zhí)行,所花費的時間這段時間是任意長的。我們并不能依賴finalize()方法能及時的回收占用的資源,可能出現(xiàn)的情況是在我們耗盡資源之前,gc卻仍未觸發(fā),因而通常的做法是提供顯示的close()方法供客戶端手動調(diào)用
所以一般不建議使用finalize 方法, JDK9 開始已久被廢除

總結(jié)缺點

1: finalize機制本身就是存在問題的。

2:finalize機制可能會導(dǎo)致性能問題,死鎖和線程掛起。

3:finalize中的錯誤可能導(dǎo)致內(nèi)存泄漏;如果不在需要時,也沒有辦法取消垃圾回收;并且沒有指定不同執(zhí)行finalize對象的執(zhí)行順序。此外,沒有辦法保證finlize的執(zhí)行時間。
遇到這些情況,對象調(diào)用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來代替實現(xiàn),下面看一下官方例子

package Thread;

import java.lang.ref.Cleaner;

public class CleaningExample implements AutoCloseable{

  
  private final static Cleaner CLEANER=Cleaner.create();// 創(chuàng)建者模式創(chuàng)建對象
  
  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 中的接口 實現(xiàn)唯一的清理方法
  
  public CleaningExample() {
    super();
    this.state = new State();
    this.cleanable=CLEANER.register(this, state); // 注冊清理容器中 并且需要清理對象的引用
  }

  @Override
  public void close() throws Exception {
    cleanable.clean(); //進(jìn)行清理操作
  }
  
  public static void main(String[] args) {
    while(true) {
      new CleaningExample();
    }
  }

}

上面可以看出:

Cleaner 是最終類 不能被重寫, 內(nèi)部方法基本以靜態(tài)方法提供 掌握例子上面的方法即可

重點指出

static class State implements Runnable

  • 如果直接在類中直接定義實現(xiàn), 必須提供一個靜態(tài)內(nèi)部類 (強制),否者不能進(jìn)行回收 原因(: 普通內(nèi)部類 局部內(nèi)部類 對于外部類有依賴(引用),無法真正實現(xiàn)內(nèi)存的釋放 )
  • 可以選擇直接定義外部類 (較為復(fù)雜,需要傳遞清理引用 Cleanable)

什么時候被回收?

* 1. 注冊的Object處于幻象引用狀態(tài)

* 2. 顯式調(diào)用 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();
    }
  }
  // 模擬業(yè)務(wù)請求
  @Override
  public void run() {
    System.out.println("數(shù)據(jù)庫 海量 查詢請求 ................");
  }
  // 清理模版
  class State implements Runnable {
    State() {
      System.out.println("<--- init --->");
    }
    @Override
    public void run() {
      System.out.println("<--- close --->");
    }
  }
}

實現(xiàn)基礎(chǔ)

/**
   * 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 類進(jìn)行clearner類的最終實現(xiàn),看以看到定義的這些個字段,基本上明確了 他的基本原理

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot上下文初始器加載過程詳解

    SpringBoot上下文初始器加載過程詳解

    這篇文章主要介紹了SpringBoot上下文初始器加載過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java使用Lua實現(xiàn)動態(tài)擴展和腳本自動升級

    Java使用Lua實現(xiàn)動態(tài)擴展和腳本自動升級

    Lua是一種輕量級的腳本語言,常用于游戲開發(fā)和嵌入式系統(tǒng)中,這篇文章主要介紹了Java如何調(diào)用Lua實現(xiàn)動態(tài)擴展和腳本自動升級,感興趣的可以學(xué)習(xí)下
    2023-08-08
  • windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程

    windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程

    這篇文章主要介紹了windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • java compiler沒有1.8怎么解決

    java compiler沒有1.8怎么解決

    這篇文章主要介紹了java compiler沒有1.8的解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • Go Java算法之比較版本號方法詳解

    Go Java算法之比較版本號方法詳解

    這篇文章主要為大家介紹了Go Java算法之比較版本號方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Spring Boot超詳細(xì)講解請求處理流程機制

    Spring Boot超詳細(xì)講解請求處理流程機制

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起分析請求處理流程機制
    2022-07-07
  • 深入Sqlite多線程入庫的問題

    深入Sqlite多線程入庫的問題

    本篇文章是對Sqlite多線程入庫的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • java中TestNG使用教程詳解

    java中TestNG使用教程詳解

    TestNG是Java中的一個測試框架, 類似于JUnit 和NUnit, 本文主要介紹了java中TestNG使用教程詳解,具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • 深入理解Java 對象和類

    深入理解Java 對象和類

    下面小編就為大家?guī)硪黄钊肜斫釰ava 對象和類。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 聊聊Java三種常見的分布式鎖

    聊聊Java三種常見的分布式鎖

    目前分布式鎖的實現(xiàn)方案主要包括三種,本文就來介紹一下這三種常見的分布式鎖以及這三種鎖的性能等,具有一定的參考價值,感興趣的可以了解一下
    2023-06-06

最新評論