Java編程開發之淺析Java引用機制

對於一個Java的對象而言,存儲主要分爲兩種,一種是內存堆(Heap),內存堆是無序的,主要用來存放建立的Java對象;一種是內存棧(Stack),主要用來存放Java引用,而後在管理過程使用Java引用指向Java對象。java

關於Reference引用的「那些事兒"

BW1nxS.jpg

隨着黃金梅麗號在大海之上的飄蕩,一切看着是那麼的風平浪靜,可是每一個人彷佛都在忙着本身手裏的那些事情....忽然韋柏向薩博提出了一個問題:都知道JVM調優是當下從事Java開發必需要去具有甚至要去提高本身的一個重要環節,那你知道堆與棧,各自存放機制是什麼?也就針對於這個問題,就像當初去探索世界盡頭的夢想同樣,薩博這樣回答韋柏:對於一個Java的對象而言,存儲主要分爲兩種,一種是內存堆(Heap),內存堆是無序的,主要用來存放建立的Java對象;一種是內存棧(Stack),主要用來存放Java引用,而後在管理過程使用Java引用指向Java對象。 聽完薩博的回答,韋柏靠在甲板上,點燃了一支猩紅的香菸,抽了一口,而後對薩博說道:那你能詳細的講解一下這個引用機制麼?薩博思考了一下,因而有了如下的故事.......算法

GC[Garbage Collectors]的基本原理

s58VjP.png

在引入Reference引用的概念以前,咱們須要清楚的知道內存棧(Stack)和內存堆(Heap)在JVM虛擬機的結構分佈以及基本狀況,如上圖所示。綜上所述,咱們能夠了解到Java的內存管理實際上就是對象的管理,包括對象實例的分配和釋放。其中GC的存在就是負責在對象「不可達」的時候將對象回收處理。當系統在建立對象實例的時候,即當使用new關鍵字建立一個對象的時候,GC就開始監控對象的地址、大小以及使用狀態。通常狀況下,Java的GC機制都有特定的回收算法,GC一般會使用有向圖的方式來記錄隊中的全部對象,經過此種方式肯定甚至標記哪些對象是「可達的」,而哪些是「不可達的」。當GC判斷一些對象不可達的時候,GC就有責任回收相關內存空間,是否能被垃圾回收機制回收,具體操做是取決於機器和平臺,但判斷依據主要是看對象是否有引用指向該對象。oop

Reference引用基本概述

Abstract base class for reference objects. This class defines the operations common to all reference objects. Because reference objects are implemented in close cooperation with the garbage collector, this class may not be subclassed directly.this

不難發現,Reference機制對JVM的垃圾收集活動敏感,Reference的繼承關係或者實現是由JDK定製,引用實例是由JVM建立,通常不推薦自行繼承Reference實現自定義的引用類型,可是能夠繼承已經存在的引用類型。
JDK提供了強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)和虛引用(Phantom Reference),引用隊列(ReferenceQueue)以及析構引用(Final Reference)等引用類型。對象

[⚠️注意事項]:blog

  1. 強引用可能對垃圾收集活動是不敏感的
  2. 自行繼承Reference實現自定義的引用類型,其反覆造輪子的意義不大。
  3. 析構引用(Final Reference),它是一種特化的虛引用
  4. 不一樣JDK版本,須要注意實際源碼的對比分析。
    5.Reference是全部引用對象的基類

Reference引用類型分析

s4EtN8.png

強引用(Strong Reference):在Java中最多見的就是強引用,也是最廣泛存在的引用類型。處於可達狀態,是不可能被垃圾回收機制回收的,即便該對象之後永遠都不會被用到JVM也不會回收。繼承

軟引用(Soft Reference):對於只有軟引用的對象來講,當系統內存足夠時它不會被回收,當系統內存空間不足時它會被回收。軟引用一般用在對內存敏感的程序中。隊列

弱引用(Weak Reference):比軟引用的生存期更短,對於只有弱引用的對象來講,只要垃圾回收機制一運行,無論JVM的內存空間是否足夠,總會回收該對象佔用的內存。
虛引用(Phantom Reference):不能單獨使用,必須和引用隊列聯合使用。虛引用的主要做用是跟蹤對象被垃圾回收的狀態。
引用隊列(ReferenceQueue)
析構引用(Final Reference)內存

[⚠️注意事項]:開發

  1. 強引用可能對垃圾收集活動是不敏感的,沒有對應的類型表示,也就是說強引用是廣泛存在的,如Object object = new Object();。
  2. 軟引用、弱引用和虛引用都是java.lang.ref.Reference的直接子類。
  3. 直到JDK11爲止,只存在四種引用,這些引用是由JVM建立,所以直接繼承java.lang.ref.Reference建立自定義的引用類型是無效的,可是能夠直接繼承已經存在的引用類型,如java.lang.ref.Cleaner就是繼承自java.lang.ref.PhantomReference。
相關文章
相關標籤/搜索