1. 程式人生 > >初識Java虛擬機器(3)物件生死

初識Java虛擬機器(3)物件生死

    Java虛擬機器的垃圾回收器在對堆進行回收前,需要確定物件是否還“活著”。下面兩種方法可以幫助GC判斷物件生死:     1.引用計數法(Reference Counting)     給物件新增一個引用計數器,每當一個地方引用它時,計數器值就加1;引用失效時,計數器值減1:任何計數器為0的物件就是不可能再被使用的。     該方法使用簡單,判定效率高,但是難以解決物件間相互迴圈引用的問題。當A中有B,B中有A時,即使A和B的引用都設定為null,他們的計數器也因為相互引用而不為0。這也是Java虛擬機器沒有采用該方法的原因之一。     2.可達性分析法(Reachability Analysis)
    在主流的商用程式語言(Java、C#、Lisp等)的主流實現中,都是通過可達性分析來判定物件是否成活。該演算法的思路是通過一系列的稱為“GC Roots”的物件作為起點,從這些節點開始向下搜尋,搜尋走過的路徑稱為引用鏈(Reference Chain),當一個物件到GC Roots沒有任何 Reference Chain的話,則證明此物件是不可用的,是可回收的物件。     在Java語言中,可作為GC Roots的物件包含以下幾種:     (1)虛擬機器棧(棧幀中的本地變量表)中引用的物件     (2)方法區中類靜態屬性引用的物件     (3)方法區中常量引用的物件     (4)本地方法棧中JNI(Native方法
)引用的物件     引用分類 java中將引用分為了四類:強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)。     強引用:類似 A a = new A(); 只要強引用存在,GC永遠不會回收掉被引用的物件。     軟引用:用來描述一些還有用但並非必須的物件。GC在將要發生記憶體溢位異常前會將這些物件列進回收範圍內進行第二次回收。     弱引用:比軟引用更弱的引用,只能生存到下一次垃圾收集發生前,無論記憶體是否足夠,都會回收掉只被弱引用關聯的物件。     虛引用:一個物件是否有虛引用的存在不會影響其生存時間。為一個物件設定虛引用關聯的唯一目的就是能在這個物件被收集器回收時收到一個系統通知。
    回收過程 在可達性分析中不可達的物件,在被回收之前至少還要經過兩次標記過程。     1.如果物件在可達性分析後發現沒有與GC Roots相連,那它將會被第一次標記並進行一次篩選。     2.篩選的條件是此物件是否有必要執行finalize()方法。當物件沒有覆蓋finalize()方法或者該方法已經被虛擬機器呼叫過,則視為沒有必要。如果該物件有必要執行該方法,該物件會被放置在F-Queue的佇列中,一個低優先順序的執行緒會執行它。但虛擬機器不保證會等到該方法執行結束再進行垃圾回收。因此,finalize()方法是不可靠的!     3.GC會對F-Queue中的物件進行二次標記,如果在finalize()中重新獲得引用——那在第二次標記時它將被移除“即將回收”的集合。     4.剩下的就等著死刑咯、、、     注意 在上面的第三步,如果finalize中物件重新獲得引用,那麼將不被回收。但是,finalize方法只會被呼叫一次!第二次回收時,不會呼叫finalize方法,通過finalize方法只能抵擋一次回收攻擊~     方法區的回收 方法區(或者永久代)回收的價效比較低,主要回收兩個部分:廢棄常量和無用的類。廢棄常量的回收與上面類的回收類似,在不可達的情況下可能被回收。而判定一個無用的類條件較為苛刻。需要同時滿足以下三個條件:     (1)該類所有例項被回收     (2)載入該類的ClassLoader已經被回收     (4)該類對應的Java.lang.Class物件沒有在任何地方被引用,無法在任何地方通過反射訪問該類。

相關推薦

初識Java虛擬機器3物件生死

    Java虛擬機器的垃圾回收器在對堆進行回收前,需要確定物件是否還“活著”。下面兩種方法可以幫助GC判斷物件生死:     1.引用計數法(Reference Counting)     給物

Java虛擬機器物件的建立與OOP-Klass模型

相關文章  Java虛擬機器系列 前言 在前一篇文章中我們學習了Java虛擬機器的結構原理與執行時資料區域,那麼我們大概知道了Java虛擬機器的記憶體的概況,那麼記憶體中的資料是如何建立和訪問的呢?這篇文章會給你答案。 1.物件的建立 物件的建立通常是通過new一個物件而

認識java虛擬機器3

記憶體分配策略: 優先分配到eden 大物件直接分配到老年代 長期存活的物件分配到老年代 空間分配擔保 動態物件年齡判斷   1.優先分配到eden -verbose:gc -XX:+PrintGCDetails  預設是Parallel Scav

初識Java虛擬機器11記憶體模型

    Java記憶體模型的主要目標是定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體中取出變數這樣的實現細節。它包括了例項欄位、靜態欄位和構成陣列物件的元素,但不包括區域性變

JAVA虛擬機器JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程

JAVA虛擬機器垃圾收集器與物件分配和回收策略

可達性分析演算法的效率 可達性分析中從GC Roots節點找引用鏈,可作為GC Roots的節點主要在全域性性的引用(常量或類靜態屬性)與執行上下文(棧幀中的本地變量表),如果要逐個檢查,必然會消耗很多時間。 另外,可達性分析對執行時間的敏感還體現在GC停頓上,

深入理解java虛擬機器一個類載入器只初始化一次類物件,不同類載入器可以對同一類物件進行初始化

package com.ygl; class Final{public static final int x=6/3;//此處x在編譯時能計算出值,是編譯時的常量,則System.out.println(Final.x);直接輸出值,不再執行下面static(前提是fina

【深入Java虛擬3】:類初始化

不同 main class out pri ref 另一個 字節碼 被動引用 類初始化是類加載過程的最後一個階段,到初始化階段,才真正開始執行類中的Java程序代碼。虛擬機規範嚴格規定了有且只有四種情況必須立即對類進行初始化:遇到new、getstatic、putstati

Java程式設計師從笨鳥到菜鳥之九十三深入java虛擬機器——類載入器詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java虛擬機器JVM

1.jvm虛擬機器概述和基本概念  (虛擬機器分為系統虛擬機器-》(VirtualBox   VMware ==)  和 程式虛擬機器-》(JVM  DVM == )   )    1.1什麼是jvm      &n

深入理解java虛擬機器位元組碼指令簡介

Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、

「深入Java虛擬機器6」:Java語法糖

語法糖(Syntactic Sugar),也稱糖衣語法,是由英國計算機學家Peter.J.Landin發明的一個術語,指在計算機語言中新增的某種語法,這種語法對語言的功能並沒有影響,但是更方便程式設計師使用。Java中最常用的語法糖主要有泛型、變長引數、條件編譯、自動拆裝箱、內部類等。虛擬機器並不支援這些語法

JAVA虛擬機器虛擬機器類載入機制

虛擬機器的類載入機制是指 把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗,轉換解析和初始化,最終形成可以被虛擬機器直接使用的Java型別。類的載入連線和初始化過程都是在程式執行期間完成的。 類的生命週期: 載入->連線(驗證,準備,解析)->初始化->使用

Java程式設計師從笨鳥到菜鳥之九十四深入java虛擬機器——類的生命週期 下類的初始化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

深入理解java虛擬機器java虛擬機器的記憶體區域

一、 java虛擬機器記憶體區域主要有:方法區、堆、虛擬機器棧、本地方方法棧、程式計數器     按照執行緒私有和共有來分:執行緒私有的有--程式計數器,虛擬機器棧,本地方法棧。共有的有--本地方法區,堆     1、程式計數器:主要功能是控制程式

JAVA虛擬機器JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機

深入理解Java虛擬機器5Java記憶體模型

深入理解Java虛擬機器(5)Java記憶體模型 Java記憶體模型 主記憶體和工作記憶體 volatile關鍵字 long與double型別的特殊規則 synchronized關鍵字 Java記憶體模

java虛擬機器

1、java如何不關注底層技術細節實現相容性? 使用中間語言 ,通過中間語言實現跨平臺相容的目標。 2、中間語言不是本地機器指令,機器cpu無法直接識別,因此中間語言不能直接在物理cpu上直接執行,怎麼解決? 用虛擬機器來解釋中間語言,將中間語言翻譯成對應的本地機器指令。 3

深入理解java虛擬機器java的記憶體區域

程式計數器:可以看作當前執行緒所執行的位元組碼的行號指示器,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條 需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來實現。每一個執行緒都有一個獨立的程式計數器,各個執行緒之間的計數器互不影響,獨立

面試中關於Java虛擬機器jvm的問題看這篇就夠了

最近看書的過程中整理了一些面試題,面試題以及答案都在我的文章中有所提到,希望你能在以問題為導向的過程中掌握虛擬機器的核心知識。面試畢竟是面試,核心知識我們還是要掌握的,加油。 下面是按jvm虛擬機器知識點分章節總結的一些jvm學習與面試相關的一些東西。一般作為Java程式設