• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 極客學習筆記

    目錄

    • 一、ch 2 exception和error
    • 二、ch4| 強引用、軟引用、弱引用、幻象引用


    一、ch 2 exception和error

    1、知識概要

    • 理解 Throwable、Exception、Error 的設計和分類
      1047870-20180617084151277-1496636434.png

    • 理解 Java 語言中操作 Throwable 的元素和實踐。掌握最基本的語法是必須的,如 try-catch-finally 塊,throw、throws 關鍵字等。
      • 生吞異常(捕獲異常最差的處理方式)
      • 自定義異常:定義成checked exception(但:①大多數情況并不能恢復程序②不兼容functional編程),并避免包含敏感信息

    2、案例分析

    • 輸入以下代碼
    public class test {
      public static void main(String[] args) {
               try {
                    Class.forName("src.HelloWorld");
                   } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                   }
              }
     }
    • 結果彈出exception
      1047870-20180617103705660-1090184377.png

    • 說明找不到類,將src.HelloWorld替換成test321.HelloWorld
    public class test {
      public static void main(String[] args) {
               try {
                    Class.forName("tsst321.HelloWorld");
                   } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                   }
              }
     }

    1047870-20180617103921530-1445874869.png

    結果說明能成功運行

    3、問題提出與解決

    • 問題一:NoClassDefFoundError 和 ClassNotFoundException 有什么區別?
    • 問題一解決:
    NoClassDefFoundError是一個錯誤(Error),而ClassNOtFoundException是一個異常,在Java中錯誤和異常是有區別的,我們可以從異常中恢復程序但卻不應該嘗試從錯誤中恢復程序。
    加載時從外存儲器找不到需要的class就出現ClassNotFoundException 
    連接時從內存找不到需要的class就出現NoClassDefFoundError
    • classnotfoundexception發生在裝入階段
      • 如果這個類在類路徑中沒有被找到——確保所需的類連同它依賴的包存在于類路徑中
      • 當一個類已經某個類加載器加載到內存中了,此時另一個類加載器又嘗試著動態地從同一個包中加載這個類——選擇catch這個衣長然后采取補救措施
    • NoClassDefFoundError: 發生在運行階段。(當目前執行的類已經編譯,但是找不到它的定義時,編譯時能找到,但是運行時找不到)
      • 查找那些在開發期間存在于類路徑下但在運行期間卻不在類路徑下的類
        1047870-20180617102208795-669934926.png

    4、參考資料

    ch4 強引用、軟引用、弱引用、幻象引用

    1、內容概要

    ① 強引用(在程序代碼中普遍存在的)

    • 特點:Object obj = new Object()中的obj就是強引用;通過關鍵字new創建的對象所關聯的引用就是強引用。
    • 當JVM內存空間不足,JVM寧愿拋出OutOfMemoryError運行時錯誤(OOM),使程序異常終止,也不會靠隨意回收具有強引用的“存活”對象來解決內存不足的問題。

    ② 軟引用(描述一些有用但并不是必需的對象)

    • 特點:通過SoftReference類實現,在Java中用java.lang.ref.SoftReference來表示。 軟引用的生命周期比強引用短一些。
    • JVM 會確保在拋出 OutOfMemoryError 之前,清理軟引用指向的對象。
    • 應用場景:軟引用通常用來實現內存敏感的緩存。如果還有空閑內存,就可以暫時保留緩存,當內存不足時清理掉,這樣就保證了使用緩存的同時,不會耗盡內存。

    ③ 弱引用(描述非必需對象)

    • 特點:通過WeakReference類實現,在java中,用·java.lang.ref.WeakReference·類來表示。弱引用的生命周期比軟引用短。
    • 一旦發現了具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。
    • 應用場景:弱應用同樣可用于內存敏感的緩存。

    ④ 幻想引用

    • 特點:虛引用也叫幻象引用,通過PhantomReference類來實現,在java中用java.lang.ref.PhantomReference類表示無法通過虛引用訪問對象的任何屬性或函數。
    • 虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。
    ReferenceQueue queue = new ReferenceQueue ();
    PhantomReference pr = new PhantomReference (object, queue); 

    程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。

    • 應用場景:可用來跟蹤對象被垃圾回收器回收的活動,當一個虛引用關聯的對象被垃圾收集器回收之前會收到一條系統通知。

    2、示例

    • 軟引用
    import java.lang.ref.SoftReference;
    public class reference {
        public static void main(String[] args) {
             
            SoftReference<String> sr = new SoftReference<String>(new String("hello"));
            System.out.println(sr.get());
        }
    }

    1047870-20180617115356632-1853958098.png

    • 弱引用
    import java.lang.ref.WeakReference;
    public class reference {
        public static void main(String[] args) {
         
            WeakReference<String> sr = new WeakReference<String>(new String("hello"));
             
            System.out.println(sr.get());
            System.gc();                //通知JVM的gc進行垃圾回收
            System.out.println(sr.get());
        }
    }

    1047870-20180617115408320-2104607616.png

    • 虛引用
    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;
    public class reference {
        public static void main(String[] args) {
            ReferenceQueue<String> queue = new ReferenceQueue<String>();
            PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
            System.out.println(pr.get());
        }
    }

    1047870-20180617115415974-606800419.png

    3、問題提出與解決

    • 問題一:什么是可達性?
    • 問題一解決:可達性分析其實是用來判定對象是否存活的。如果不可達,則證明該對象不可用,說明其可以被回收。
    • 問題二:如何判斷是否需要被回收?
    • 問題二解決:
    Strong Reference : 只有在引用對象root不可達的情況下才會標識為可回收,垃圾回收才可能進行回收
    Soft Reference : 無論其引用的對象是否root可達,在響應內存需要時,由垃圾回收判斷是否需要回收。
    Weak Reference :用來描述非必需對象。即使在root算法中 其引用的對象root可達到,只能生存到下一次垃圾回收之前。
    Phantom Reference :無法通過虛引用獲得一個對象的實例,設置虛引用的目的就是能在這個對象被收集器回收時收到一個系統通知。
    • 問題三:除了可達性算法,還有什么方法來判斷對象是否存活?
    • 問題三解決:finalize()方法
      • 進行兩次標記
      • 只要重新與引用鏈上的任何的一個對象建立關聯,譬如把自己賦值給某個類變量或對象的成員變量,那在第二次標記時它將移除出“即將回收”的集合。

    4、參考資料

    版權聲明:本文為weixin_34315189原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_34315189/article/details/93366366

    智能推薦

    極客學院web前端學習筆記 (二)Html5基礎

    html基礎詳解 1,聲明: html有很多版本,所以為了使瀏覽器正確區分我們所使用的是哪種版本,我們需要在代碼的最開始添加一句聲明 HTML5的版本:<!DOCTYPE html> 之前的版本則比較復雜 注:現在創建html文件直接就默認為html5了 html的基本標簽 html標簽: 內部包含其他標簽,在整個HTML文件的頭部和尾部 head標簽: 一般包含頭部信息:編碼格式,標...

    極客時間 MySQL實戰學習筆記 1-8講

    No.1 MySQL的基本架構 連接器:負責跟客戶端建立連接、獲取權限、維持和管理連接。 查詢緩存:查詢請求先訪問緩存(key 是查詢的語句,value 是查詢的結果)。命中直接返回。不推薦使用緩存,更新會把緩存清除(關閉緩存:參數 query_cache_type 設置成 DEMAND)。 分析器:對 SQL 語句做解析,判斷sql是否正確。 優化器:決定使用哪個索引,多表關聯(join)的時候...

    極客時間 MySQL實戰學習筆記 9-15講

    No.9 普通索引和唯一索引,應該怎么選擇? 查詢過程 其實查詢過程兩者的時間差距是微乎其微的,普通索引要比唯一索引多一次判斷下一條記錄是否符合,但InnoDB 的數據是按數據頁為單位來讀寫的,所以就算多讀一次也占用不了多少時間 更新過程 普通索引可以使用change buffer,可以將一系列的更新寫到change buffer中,后期再一次性寫入到磁盤中,極大的提高了更新的效率,而唯一索引沒有...

    學習極客時間 《Kafka核心技術與實戰》筆記21-22

    學習極客時間 《Kafka核心技術與實戰》筆記-客戶端實踐及原理剖析21-22 原極客時間連接:https://time.geekbang.org/column/intro/191?utm_campaign=guanwang&utm_source=baidu-ad&utm_medium=ppzq-pc&utm_content=title&utm_term=baidu...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡