91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Java9中使用垃圾回收機制

發布時間:2021-05-12 16:53:46 來源:億速云 閱讀:194 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關如何在Java9中使用垃圾回收機制,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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;

上述就是小編為大家分享的如何在Java9中使用垃圾回收機制了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云南省| 珲春市| 贵港市| 化州市| 凌海市| 剑河县| 鹤岗市| 惠来县| 罗甸县| 台东县| 密山市| 蛟河市| 闸北区| 宿松县| 政和县| 上高县| 寿光市| 绥阳县| 平邑县| 金乡县| 海安县| 伊宁市| 会宁县| 庄浪县| 大埔县| 榆社县| 成都市| 景德镇市| 景宁| 常德市| 正定县| 渝中区| 河曲县| 乐山市| 满城县| 治县。| 余庆县| 朝阳区| 大同市| 望奎县| 宁乡县|