深入虛擬機(一)

運行時數據區域

JVM是運行在操作系統之上的,與硬件沒有直接的交互

你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

  • 類加載器(Class loader):java.lang.ClassLoader類的基本職責就是根據一個指定的類的名稱,找到或者生成其對應的字節代碼,然後從這些字節代碼中定義出一個Java 類,即 java.lang.Class類的一個實例。

    1. 引導類加載器(bootstrap class loader):它用來加載 Java 的核心庫(jre/lib/rt.jar),是用原生C++代碼來實現的
    2. 擴展類加載器(extensions class loader):它用來加載 Java 的擴展庫(jre/ext/*.jar)。Java 虛擬機的實現會提供一個擴展庫目錄。
    3. 應用類加載器(AppClassLoader ):我們寫的大部分java類都是由他加載
    4. 實例,以上三種是父子類關係加載,從上到下,也叫作雙親委派機制。
  • 程序計數器:可以看成當前線程所執行字節碼的行號指示器,是一塊較小的內存空間。爲了保證線程切換後能恢復到正確的位置,所以需要個線程有一個獨立的程序計數器,所以我們稱這類內存區域爲線程私有

  • java虛擬機棧:該區域也是線程私有,他的生命週期和線程相同。虛擬機棧描述的是java方法執行的內存模型:每個方法在執行的同時都會創建一個zhan棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每個方法的調用過程相當於棧幀在虛擬機中入棧到出棧的過程。

    局部變量表存放編譯期間的可知的各種基本類型、對象引用類型。一個方法需要在棧中分配多大的局部變量空間是完全確定的,運行期間不會改變局部變量表的大小。

  • 本地方法棧:與虛擬機棧發揮的作用是非常的相似,只不過本地方法棧是爲Native方法服務。

  • java堆:該區域是線程共享也是虛擬機所管理內存中最大的一塊。該區域主要的目的在於存放實例,幾乎所有的對象實例都是在這裏分配的。因爲JIT編譯器以及棧上分配…所以所有對象在堆上分配也沒有那麼絕對了。java堆有時候也被稱爲GC堆(Garbage Collected Heap),因爲他是垃圾收集器管理的主要區域。java堆細分爲:新生代和老年代;在細分一點:Eden空間、From Survivor空間、To Survivor空間

  • 方法區:該區域是線程共享用於存儲已被虛擬機加載的類信息、常量、靜態變量、JIT編譯後的代碼等數據。很多人更願意把他叫做永久代, 因爲HotSpot設計團隊選擇把GC分代收集擴展至方法區。這個區域的回收非常的嚴格,所以回收效果很糟糕

  • 運行時常量池:是方法區的一部分。Class文件除了有類的版本、字段、方法、接口等描述信息,還有一項信息是常量池,用於存放編譯器生成的各種字面量和符號引用

垃圾收集算法

確定對象是否已死

首先需要明確三點

  • 哪些內存需要回收
  • 什麼時候回收
  • 如何回收

如何確定對象是否已死

  • 引用計數法

    給對象添加一個引用計數器,每當有一個地方引用他,計數器值就加1;當引用失效是值就減一。任何時刻計數器爲0的對象就爲死。缺點:當兩個對象相互引用對方時,就不會出現計數器爲0的情況。虛擬機不是採用計數算法來判斷對象是否存活

  • 可達性分析算法

    在主流的商用程序語言(java、c#…)的主流實現中都是通過可達性分析(Reachability Analysis)來判定對象是否存活。基本思想:通過一些列的稱爲’GC Roots’的對象作爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時在這裏插入圖片描述
    java語言可作爲GC Roots的對象包括下面幾種
    1- 虛擬機棧(棧幀中的本地變量表)中引用的對象
    2- 方法區中靜態屬性引用的對象
    3- 方法區中常量引用的對象
    4- 本地方法中JNI(一般所說Native方法)引用的對象

引用

    通過上面的分析可以知道,不管是引用計數算法判斷對象的引用數量還是可達性分析判斷對象的引用鏈是否可達。JDK1.2後,java對引用進行擴充,分爲以下四種

  • 強引用:類似於Object obj = new Object();這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。
  • 軟引用:用來描述一些還有用但並非必須的對象,在系統內存溢出異常之前,將會對這些對象進行二次回收。
  • 弱引用:也是描述非必需對象,但他的強度比軟應用更弱一些。被弱引用關聯的對象只能生存在下一次垃圾收集發生之前。無論內存是否足夠,都會回收只被弱引用關聯的對象。
  • 虛引用:也被稱爲幽靈引用或者幻影引用,一個對象是否有虛引用的存在完全不會對其生存時間構成影響,也無法通過該引用來取得一個對象的實例。這個唯一的目的就是對象被收集器回收時收到一個系統通知

生存還是死亡

    即使可達性性分析算法中不可達的對象,也並非是‘非死不可’的。這是他們暫時處於緩刑階段,要宣佈一個對象的死亡至少要經歷兩次標記過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章